PHP项目中的命名空间与文件自动加载问题

一,命名空间定义
1,所有合法的PHP代码都可以包含在命名空间中,只有以下类型的代码受命名空间的影响,分别是:类(包括抽象类和traits)、接口、函数和常量。
2,命名空间通过关键字namespace 来声明,在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。另外,所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。
<html>
<?php

    namespace MyProject; // 致命错误 - 命名空间必须是程序脚本的第一条语句

?>

3,另外,PHP与其它的语言特征不同,同一个命名空间可以定义在多个文件中,即允许将同一个命名空间的内容分割存放在不同的文件中。

4,一个文件也可以定义多个命名空间
<?php

    declare(encoding='UTF-8');
    namespace MyProject {

    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
    }

    namespace { // 全局代码
    session_start();
    $a = MyProject\connect();
    echo MyProject\Connection::start();
    }

?>
ps:定义多个命名空间和不包含在命名空间中的代码

5,PHP预留关键字和单纯的数字不能用来定义命名空间会引起解析错误


二,命名空间引入及使用
1,use关键字
<?php

    namespace foo;
    use My\Full\Classname as Another;

    // 下面的例子与 use My\Full\NSname as NSname 相同
    use My\Full\NSname;

    // 导入一个全局类
    use ArrayObject;
    // importing a function (PHP 5.6+)
    use function My\Full\functionName;

    // aliasing a function (PHP 5.6+)
    use function My\Full\functionName as func;

    // importing a constant (PHP 5.6+)
    use const My\Full\CONSTANT;

    $obj = new namespace\Another; // 实例化 foo\Another 对象
    $obj = new Another; // 实例化 My\Full\Classname 对象
    NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
    $a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象
    // 如果不使用 "use ArrayObject" ,则实例化一个 foo\ArrayObject 对象
    func(); // calls function My\Full\functionName
    echo CONSTANT; // echoes the value of My\Full\CONSTANT

?>


三,命名空间与自动加载
命名空间只是一种封装事务的方法,并不实现文件自动加载,两者无必然联系。
PHP的__autoload函数在加载未定义的类时会被调用,入参是类名或者命名空间加类名。

    You should use include() or require() inside __autoload()
    instead of include_once() or require_once().
    If you reach __autoload(), then you know the file with the class definition has not been loaded yet.
    include() and require() are more efficient than include_once() and require_once().



四,自动加载的优化方案

1,类A用__autoload()自动加载了一个类;
2,类B需要自动加载类A;
3,如果类B用的是__autoload(),那么两个__autoload()就会有冲突;
4,spl_autoload_register()用来注册函数——实现自动加载;


五,composer依赖自动加载

composer工具下载的依赖文件加载由工具生成的autoload.php文件实现,入口文件加载该文件,命名空间的使用还是用use.


参考资料:
http://php.net/manual/zh/language.namespaces.basics.php

https://www.sitepoint.com/php-53-namespaces-basics/

https://getcomposer.org/doc/01-basic-usage.md#autoloading

相关文档

评论0条