PHP 设计模式 笔记与总结(1)命名空间 与 类的自动载入
① PHP 面向对象高级特性
② 11 种 PHP 设计模式
③ PSR-0,Composer,Phar 等最流行的技术
目标是掌握 PHP 各类设计模式,以及具备设计纯面向对象框架和系统的能力
【命名空间】
早期 php 没有命名空间的概念,所有的代码可以被认为是在同一个命名空间内运行,因此不能出现名称相同的类或函数:
代码 a ---- 类 a
代码 b ---- 类 b
代码 c ---- 函数 d
代码 d --- 函数 d
以上都是不允许的情况。
php 5.3 增加了命名空间的概念。
例:加入一个项目下有 3 个文件:
test1.php:
<?php function test(){echo __FILE__; }
test2.php:
<?php function test(){echo __FILE__; }
test.php:
<?php require 'test1.php'; require 'test2.php';
运行 test.php,报错:Fatal error: Cannot redeclare test() (previously declared in D:\practise\php\design\test1.php:4) in D:\practise\php\design\test2.php on line (函数重命名导致致命错误)
当 test1.php 改为:
<?php namespace Test1;function test(){echo __FILE__; }
test2.php 改为:
<?php namespace Test2;function test(){echo __FILE__; }
运行 test.php ,不会报错。
【引用命名空间中的方法】
命名空间名称\方法名
如:
test.php
<?php require 'Test1.php'; require 'Test2.php';Test1\test();
页面输出:D:\practise\php\design\Test1.php
【类的自动载入】
当项目越来越大时,文件越来越多,如果一个文件要依赖几十个php 类,那么就要在该文件的代码之前写几十行的 require 语句,开发和管理起来非常不便。在php 5.2 之后的版本提供了类的自动载入功能。早起 php 使用 __autoload() 方法。
例如,一个项目中有 3 个文件
Test1.php:
<?php class Test1{static function test(){echo __METHOD__;} }
Test2.php:
<?php class Test2{static function test(){echo __METHOD__;} }
test.php:
<?php Test1::test(); Test2::test();function __autoload($class){require __DIR__.'/'.$class.'.php'; }
运行 test.php,页面输出:
Test1::testTest2::test
后来__autoload() 方法被废弃了,原因是一个 php 工程可能会依赖于多个框架,如果每一个框架都有这个函数,就会报函数重复定义的致命错误。在php 5.3 版本之后,官方提供了spl_autoload_register(); 方法取代 __aotoload() 方法。
spl_autoload_register() 的特点是允许存在多个 spl_autoload_register() 方法。
修改 test.php:
<?php spl_autoload_register('autoload1');Test1::test(); Test2::test();function autoload1($class){require __DIR__.'/'.$class.'.php'; }
页面输出结果不变。
此时如果多个框架都有自己的类自动载入,只需要调用多次 spl_autoload_register() 即可,每个类都会分别完成自己的类自动载入,而且不会冲突:
<?php spl_autoload_register('autoload1'); spl_autoload_register('autoload2');Test1::test(); Test2::test();function autoload1($class){require __DIR__.'/'.$class.'.php'; }function autoload2($class){require __DIR__.'/'.$class.'.php'; }
页面输出结果不变。
【开发工具】:PHPStorm
【编程字体】:使用等宽字体(常见的有Courier View,Consolas),推荐使用Source Code Pro(Adobe 公司专为程序员设计,免费开源)
【运行环境】:EasyPHP,集成了Apache,MySQL,PHPMyAdmin
转载于:https://www.cnblogs.com/dee0912/p/4396988.html
PHP 设计模式 笔记与总结(1)命名空间 与 类的自动载入相关推荐
- 设计模式笔记——代理模式
设计模式笔记--代理模式 代理模式介绍 代理模式通常是介于请求方和提供方的一个中介系统,请求方是发送请求的一方,提供方是根据请求提供相应资源的一方 Web中的代理服务器就是一个例子,客户端向代理服务器 ...
- 【笔记】设计模式 | 5种设计模式笔记整理
跟着b站的设计模式教程学的,以下是目前学习了的5种设计模式的笔记整理 设计模式简介 软件设计的现状:由于客户需求等原因需要频繁的变更软件内部的代码.所以能否设计出复用性尽可能高的程序以解决软件设计的复 ...
- Java设计模式笔记——七个结构型模式
系列文章目录 第一章 Java设计模式笔记--七大设计原则 第二章 Java设计模式笔记--六个创建型模式 文章目录 系列文章目录 一.适配器模式 1.概念 2.类适配器 3.对象适配 4.缺省适配器 ...
- C++ 学习笔记(3)命名空间using、字符串、string、vector、迭代器、数组
C++ 学习笔记(3)命名空间using.字符串.string.vector.迭代器.数组 参考书籍:<C++ Primer 5th> 3.1 命名空间的using声明 头文件不应该包含u ...
- 软件设计师——设计模式笔记上
软件设计师--设计模式笔记上(创造型5种) 设计模式的主要目的 设计模式的原则 1.工厂方法模式(类模式) 意图 适用性 代码实现 2.抽象工厂模式(对象模式) 意图 适用性 代码实现 3.生成器模式 ...
- 设计模式笔记 18. Observer 观察者模式(行为型模式)
18. Observer 观察者模式 2008-09-15 动机(Motivation) 在软件构建过程中,我们需要为某些对象建立一种"通知依赖关系& ...
- 设计模式笔记零:设计模式简介
原文:http://www.runoob.com/design-pattern/design-pattern-intro.html 少许个人理解,如有错误请指出 设计模式简介 设计模式:设计模式是软件 ...
- 大话PHP设计模式:类自动载入、PSR-0规范、链式操作、11种面向对象设计模式实现和使用、OOP的基本原则和自动加载配置...
一.类自动载入 SPL函数 (standard php librarys) 类自动载入,尽管 __autoload() 函数也能自动加载类和接口,但更建议使用 spl_autoload_registe ...
- 【贪玩巴斯】Unity初学圣经Part2-C#基础——Day 01:C#基础之——命名空间、类、方法、变量的声明赋值和相关知识以及.NETC#关系讲解 2022年3月28日
C#基础之--命名空间.类.方法.变量的声明赋值和相关知识以及.NETC#关系讲解 对应视频4-1至4-7 1.引入命名空间: 2.引入类.方法 3.变量的声明赋值 4.综合小练习 5. .NET的介 ...
最新文章
- php查询mysql放到数组中_php查询mysql数据库并将结果保存到数组的方法
- 机器推理文本+视觉,跨模态预训练新进展
- 【深度学习】基于Pytorch的softmax回归问题辨析和应用(二)
- CF#1288A Deadline (函数求最值问题)
- python 继承的规则
- Android之可以做的两件坏事---破解锁屏密码和获取Wifi密码
- 百度的html代码是什么,百度网页源代码是什么?
- thinkphp v5.0.11漏洞_thinkphp 5.0 代码执行漏洞
- android应用开发---(第1章)android基础学习之六大Layout布局
- Android 快速实现微信支付(真的!很快!)
- IDEA的Database表的基本操作
- 【渝粤题库】陕西师范大学200061语言学概论作业(高起本、专升本)
- 百度网盘链接在线解析网站_最近很热闹啊,免登陆百度网盘高速链接转换工具...
- 网易云邮箱验证码注册及修改密码
- Matches UVA - 11375 递推+大数 Ingenuous Cubrency UVA - 11137 递推
- django crontab UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfe in position 9: invalid start
- go的取模运算小tips
- 风险回避、减轻、转移、接受,汇率风险
- php展厅控制系统,展厅中控系统
- 一行代码实现curry化
热门文章
- 【Qt】Qt中QJsonDocument 类
- 【Linux】一步一步学Linux——Linux特殊权限位详解(114)
- 【物联网】 ESP8266 Ubuntu开发环境的搭建
- python日历函数_python 怎么定义一个函数,输出日历
- netbeans html 格式化,在NetBeans IDE8.0中怎么把html的文件转换成jsp格式
- Openstack dnsmasq配置域名解析
- 记录 之 tensorflow 常用函数:tf.split(),tf.clip_by_value() 和 tf.cond()
- Python将文字转拼音
- 频域补零上采样_AURIX 学习笔记(12)频域法互相关实现超声测距
- react封装函数_GitHub - daifee/react-component: 用 React 封装一套常用组件