include与__autoload与命名空间namespace与PSR4详解
1. include, require, include_once, require_once
include和require是PHP中引入源文件最基本的用法,其他例如__autoload, namespace, PSR4等其实都是调用include,或者require而成
include和require的执行查找步骤:
(1)被包含文件先按参数给出的路径寻找;
(2)如果没有给出目录(只有文件名)时则按照 include_path 指定的目录寻找;
(3)如果在 include_path 下没找到该文件则 include 最后才在调用脚本文件所在的目录和当前工作目录下寻找;
(4)如果最后仍未找到文件则 include 结构会发出一条notice;require则会发出一个error
include和include_once的区别在于如果已经包含过文件,则include_once不再包含;require和require_once的区别也是如此
当然,每次使用另一个php文件的类对象或者函数时都先include则比较麻烦,聪明的做法是自动调用include完成,这就需要__autoload来完成
2. __autoload加载未定义的类
__autoload实现加载未定义的类依然是通过include或者require来实现
用法为:
$class )例如:
A.php
<?php
class A{
//在构造方法中打印
public function __construct(){
echo "new class A";
}
}
?>
B.php
<?php
//自动加载类,当使用new A()时找不到class A则将字符串A作为$className传入该__autoload方法中
function __autoload($className){
//从className中推算出文件名,假设类名和文件名相同,且在本文件同级目录查找
$fileName = dirname(__FILE__).DIRECTORY_SEPARATOR.$className.".php";
//如果本文件没有指定的类,且本文件路径存在指定的文件名则包含
if (is_file($fileName) && !class_exists($className)) {
include $fileName;
}else{
die($className." not found, ". "and ". $fileName."not found");
}
}
//在该文件中创建一个不再该文件的类的对象,将调用构造方法
new A();
?>
执行php B.php将输出:
F:\test>php B.php
new class A
使用__autoload($class)作为默认的类加载器,还可以自定义类加载器,将自定义的类加载器注册到上下文中:
例如:
C.php
<?php
//默认的类加载器
function __autoload($class) {
echo "__autoload loading ".$class;
}
//自定义的类加载器
function my_loader($class) {
echo "my_loader loading ".$class;
}
//自定义的类加载器
function your_loader($class) {
echo "your_loader loading ".$class;
}
//查看共有哪些类加载器在运作
var_dump(spl_autoload_functions());
//将加载器注册到上下文中
spl_autoload_unregister('__autoload');
spl_autoload_register('my_loader');
spl_autoload_register('your_loader');
//查看共有哪些类加载器在运作
var_dump(spl_autoload_functions());
new A();
?>
执行php C.php
F:\test>php C.php
array(1) {
[0] =>
string(10) "__autoload"
}
array(2) {
[0] =>
string(9) "my_loader"
[1] =>
string(11) "your_loader"
}
my_loader loading Ayour_loader loading A
Fatal error: Class 'A' not found in F:\test\C.php on line 26
Call Stack:
0.0010 232056 1. {main}() F:\test\C.php:0
当然使用__autoload()自动加载类时,可能遇到同名类的情况;为了避免这种情况,引入了命名空间的概念
3. 命名空间namespace
(1)没有定义命名空间,则默认为顶级命名空间, 顶级命名空间为反斜杠
(2)同一个PHP文件中,可以定义多个命名空间,在哪个命名空间之下,则属于哪个命名空间
(3)不但可以在命名空间下定义类,也可以在命名空间下定义常量,变量,方法等
(4)使用命名空间下的常量,变量,方法。类时,要么使用绝对命名空间,即从反斜杠开始;要么使用相对命名空间,即相对此命名空间
例如:
<?php
//定义命名空间my
namespace my;
//在命名空间my下定义类My
class My{
public function __construct(){
echo "My";
}
}
//定义命名空间test
namespace test;
new \my\My(); //这是\my\My
new My(); //这是\test\My,命名空间\test下没有类My, 将报错
new my\My(); //这是\test\my\My,命名空间\test\my下没有类My, 将报错
?>
include与__autoload与命名空间namespace与PSR4详解的更多相关文章
- PHP中的命名空间(namespace)及其使用详解
PHP中的命名空间(namespace)及其使用详解 晶晶 2年前 (2014-01-02) 8495次浏览 PHP php自5.3.0开始,引入了一个namespace关键字以及__NAMESPAC ...
- PHP命名空间(Namespace)的使用详解(转)
对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...
- PHP命名空间(Namespace)的使用详解
对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...
- PHP深入浅出之命名空间(Namespace)的使用详解
对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...
- php中require、require_once、include、include_once类库重复引入效率问题详解
首先我详细说下这四个引入函数 include() 与require() 的功能相同 唯一不同:require()不管是否被执行,只要存在,php在执行前都会预引入,include()则是执行到该语句时 ...
- struts.xml 文件中的 namespace 属性图文详解
namespace:名称空间.默认值是""(空字符串). 名称空间+动作名称:构成了动作的访问路径
- python命名空间与闭包函数详解
python命名空间与闭包函数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要介绍的知识点如下: 1>.三元运算 2>.命名空间 3>.globa ...
- PHP命名空间namespace使用小结
1.介绍一下php的命名空间 什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命 ...
- PHP 使用命名空间(namespace),实现自动加载
示例: #/DB/MySql.class.php也就是DB文件夹下有MySql.class.php文件 namespace DB; class MySql { public function __co ...
随机推荐
- Sql优化器究竟帮你做了哪些工作
https://my.oschina.net/u/1859679?tab=newest&catalogId=597012 上一篇,我们介绍了<DB——数据的读取和存储方式>,这篇聊 ...
- (七)JavaScript 函数
带有返回值的函数 JavaScript 变量的生存期 JavaScript 变量的生命期从它们被声明的时间开始. 局部变量会在函数运行以后被删除. 全局变量会在页面关闭后被删除.
- MemCache在.NET中使用Memcached.ClientLibrary详解 转发 https://www.cnblogs.com/li150dan/p/9529112.html
本文说明:memcached分布式缓存的负载均衡配置比例,数据压缩,socket的详细配置等,以及在.net中的常用方法 首先下载客户端的3个dll,ICSharpCode.SharpZipLib.d ...
- ORA-01034:ORACLE not available ORA-27101:shared memory realm does not exit
ORA-01034:ORACLE not available ORA-27101:shared memory realm does not exit ERROR: ORA-01034:ORACLE ...
- shell去除换行和空格
#!/bin/bash if [ -f str.txt ] ## 如果str.txt存在,则返回true then strval=$(cat str.txt|awk '{printf "%s ...
- 首页技术支持常见问题宽带外网IP显示为10、100、172开头,没有公网IP,如何解决?
1.表现形式: 路由器拨号获得的公网IP变成了一个以100开头的IP(或者是10.172开头),而打开ip138.com查询却又是另外一个IP,将100开头的这个IP到百度去查询下则显示所在区域为美国 ...
- ASP.NET Core 添加区域步骤(详细)
1 前言 早就想总结一下,但是没时间,这次有时间了,就详细的把步骤写出来. 2 步骤 2.1 添加区域 右键项目->添加->区域,如图1: 区域名称:Ceshi 添加完之后解决方案管理器会 ...
- java连接Mysql8
相较于之前版本会有部分改动 pom依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql- ...
- 使用 OpenSSL 创建私有 CA:2 中间证书
OpenSSL 创建私有 CA 三部曲:使用 OpenSSL 创建私有 CA:1 根证书使用 OpenSSL 创建私有 CA:2 中间证书使用 OpenSSL 创建私有 CA:3 用户证书 本文将在前 ...
- 设计模式原则——依赖倒转&里氏代换原则
设计模式一共有六大原则: 单一原则.开放封闭原则.接口分离原则.里氏替换原则.最少知识原则.依赖倒置原则. 这篇博客是自己对依赖倒转&里氏代换原则的一些拙见,有何不对欢迎大家指出. 依赖倒转原 ...