namespace
假设如果不使用namespace,那么每个类在一个项目中的名字就必须是固定的。因为php在new的时候不管是调用autoload还是调用已加载过的类,都存在一个类名对应的文件。所以在没有namespace的时候,我们会想各种命名规则来区分不同的类,比如project1_school1_class1_Student或者project2_school_class_Student。
引入namespace之后就可以将这个有效规避了,一个namespace就相当于对应一个文件路径,查找这个类的时候,就会去对应的文件路径查找类定义文件了。
代码
目录结果
A_def.php
namespace my_api amed; class A { public function def1() { echo 11; } public static function static_def(){ echo 'static'; } }
test.php
require_once("api/A_def.php"); $a = new my_api amedA(); $a->def1(); $b= my_api amedA::static_def(); print_r($b);
namespace 后的命名空间起始不能用“”,
Fatal error: Undefined constant 'my_namespace' in……………………
-----------------------------------------------------------------
spl_autoload_register
bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )
将函数注册到SPL __autoload函数队列中。如果该队列中的函数尚未激活,则激活它们。
如果在你的程序中已经实现了__autoload()函数,它必须显式注册到__autoload()队列中。因为 spl_autoload_register()函数会将Zend Engine中的__autoload()函数取代为spl_autoload()或spl_autoload_call()。
如果需要多条 autoload 函数,spl_autoload_register() 满足了此类需求。 它实际上创建了 autoload 函数的队列,按定义时的顺序逐个执行。相比之下, __autoload() 只可以定义一次。
*注 __autoload 将会废弃
// function __autoload($class) { // include 'classes/' . $class . '.class.php'; // } function my_autoloader($class) { include 'classes/' . $class . '.class.php'; } spl_autoload_register('my_autoloader'); // 或者,自 PHP 5.3.0 起可以使用一个匿名函数 spl_autoload_register(function ($class) { include 'classes/' . $class . '.class.php'; });
Yii2 注册类使用spl_autoload_register 所以文件名和命名空间的路径必须一直
目录结构
B.php
namespace my_namespace; class B { public static function static_def(){ echo 'static'; } }
test.php
/** * spl_autoload_register */ function my_autoloader($class) { $class= str_replace('my_namespace', '', $class); include 'api/' . $class . '.php'; } spl_autoload_register('my_autoloader'); $c= my_namespaceB::static_def();