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来实现

用法为:

void __autoload ( string $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详解的更多相关文章

  1. PHP中的命名空间(namespace)及其使用详解

    PHP中的命名空间(namespace)及其使用详解 晶晶 2年前 (2014-01-02) 8495次浏览 PHP php自5.3.0开始,引入了一个namespace关键字以及__NAMESPAC ...

  2. PHP命名空间(Namespace)的使用详解(转)

    对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...

  3. PHP命名空间(Namespace)的使用详解

    对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...

  4. PHP深入浅出之命名空间(Namespace)的使用详解

    对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...

  5. php中require、require_once、include、include_once类库重复引入效率问题详解

    首先我详细说下这四个引入函数 include() 与require() 的功能相同 唯一不同:require()不管是否被执行,只要存在,php在执行前都会预引入,include()则是执行到该语句时 ...

  6. struts.xml 文件中的 namespace 属性图文详解

    namespace:名称空间.默认值是""(空字符串). 名称空间+动作名称:构成了动作的访问路径

  7. python命名空间与闭包函数详解

    python命名空间与闭包函数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要介绍的知识点如下: 1>.三元运算 2>.命名空间 3>.globa ...

  8. PHP命名空间namespace使用小结

    1.介绍一下php的命名空间 什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命 ...

  9. PHP 使用命名空间(namespace),实现自动加载

    示例: #/DB/MySql.class.php也就是DB文件夹下有MySql.class.php文件 namespace DB; class MySql { public function __co ...

随机推荐

  1. 转://oracle Wallet在expdp/impdp中使用场景

    oracle Wallet的使用(即内部加密技术TDE(Transparent Data Encryption )) 1. TDE是Oracle10gR2中推出的一个新功能,使用时要保证Oracle版 ...

  2. P1515 旅行(简单搜索)

    非常简单的搜索. 思路:先排序,然后,搜索枚举的时候满足A < 两个旅店 < B,然后,搜索就行了. #include<iostream> #include<algori ...

  3. mysql创建索引的原则

    在mysql中使用索引的原则有以下几点: 1. 对于查询频率高的字段创建索引: 2. 对排序.分组.联合查询频率高的字段创建索引: 3. 索引的数目不宜太多 原因:a.每创建一个索引都会占用相应的物理 ...

  4. PHP设计模式_工厂模式

    个人理解工厂类相当于平时用的基类,只需要把类new一次然后付给一个变量,以后直接引入基类调用变量使用类里的方法即可 了解 工厂模式,工厂方法或者类生成对象,而不是在代码中直接new. 使用工厂模式,可 ...

  5. stroop效应matlab实验

    1 打开matlab,打开test1.m 点击运行,若出现选择 更改文件夹 2  引导界面 (在这个界面,只许用户鼠标点击开始,其余的别乱按按键. 记得将打字法关掉,切换到小写) 3 做题界面 根据颜 ...

  6. Ubuntu16.04之安装Nutch

    1.下载Nutch wget http://mirrors.shu.edu.cn/apache/nutch/2.3.1/apache-nutch-2.3.1-src.zip 2.解压 unzip ap ...

  7. 最长上升子序列(LIS)

    (我先扯些没用的) 我这个笨孩子 学点东西好慢好慢的 我还贪玩 于是 将自己陷入了一个超级超级超级差的境地 可 我还傻乎乎的保有着天真的梦想(理想?) 所以现在我要加倍的努力努力再努力了 只能嘎油了 ...

  8. P3372 【模板】线段树 1

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个 ...

  9. C# 下载文件

    最近一段时间,真的是太忙太忙了!经历了自我毕业以来最忙碌的一个项目! 说起这个项目,我有万千感慨 且不说技术能力,也无需谈论项目需求.单就项目压力,日常加班,周六日补班而言,我相信很多人是扛不住的! ...

  10. 记录一次.Net框架Bug发现和提交过程:.Net Framework和.Net Core均受影响

    SmtpClient一处代码编写错误导致异步发送邮件时DeliveryFormat配置项无法正确工作,异步操作已经完全不受我们设置属性控制了,UTF-8内容(如中文)转不转码完全看对方邮件服务器心情! ...