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()用来注册函数——实现自动加载


参考资料:

http://php.net/manual/zh/language.namespaces.basics.php
https://www.sitepoint.com/php-53-namespaces-basics/

评论0条