批改状态:合格
老师批语:命名空间, 重要性对现代php来说, 不可或缺
1.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
2.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
示例:
namespace 广东\广州;class Demo{const ROAD_NAME='广州路';}// 非限定名称,文件当前路径echo Demo::ROAD_NAME;echo '<br>';namespace 广东;// 限定名称,通常在类空间中,echo 惠州\Demo::ROAD_NAME;namespace 广东\惠州;class Demo{const ROAD_NAME='广州路';}echo '<br>';namespace 广东\深圳;class Demo{const ROAD_NAME='广州路';}// 完全限定名称,绝对路径echo \广东\广州\Demo::ROAD_NAME;echo '<br>';
输出:
广州路广州路广州路
通过结果我们可以看到,同样的类名,同样的方法,如果在一个类中写,这样是不可能的,只有用命名空间,才能实现,这样应用场景就出来了
编写的代码与PHP内部的类/函数/常量/或第三方类/函数常量之间的冲突
这就是他的应用场景
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
namespace ns1;class T1{}echo \ns2\T2::index(),'<br>';echo \ns2\T3::cate(),'<br>';namespace ns2;class T2{public static function index(){return '首页';}}class T3{public static function cate(){return '频道页111';}}namespace ns3;// 空间的别名use ns2 as s;echo s\T2::index(),'<br>';echo s\T3::cate(),'<br>';// use ns2\T2;use ns2\T2 as T;use ns2\T3;echo T2::index(),'<br>';echo T::index(),'<br>';echo T3::cate(),'<br>';class T2{public static function index(){return '首页NS_T2';}}
输出:
首页频道页111首页频道页111首页NS_T2首页频道页111
应用场景:
主要为了代码的复用,如果在一个文件下面有几个类,需要重复写几次文件名,这个时候只要用别名代替,就可以节省代码
空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
原理:
自动加载,主要使用 spl_autoload_register() 函数来实现,spl_autoload_register函数的功能就是把传入的函数(参数可以为回调函数或函数名称形式)注册到 SPL autoload 函数队列中,并移除系统默认的 autoload() 函数。一旦调用 spl_autoload_register() 函数,当调用未定义类时,系统就会按顺序调用注册到 spl_autoload_register() 函数的所有函数,而不是自动调用 __autoload() 函数。
示例:
自动加载文件
try {spl_autoload_register(function($className){//1. 应该将类名中的命名空间的分隔符转为目录分隔符$path = str_replace('\\', DIRECTORY_SEPARATOR, $className);// 2. 生成真正要加载的类文件名称$file = __DIR__ . DIRECTORY_SEPARATOR . $path . '.php';// 3. 加载这个文件require $file;});} catch (Exception $e) {die($e->getMessage());}
实现php文件:
require 'autoload.php';use inc\lib\Demo1;use inc\lib\Demo2;use inc\lib\Demo3;echo Demo1::say();echo Demo2::class.'<br>';echo Demo3::class;
输出
Hello PHP中文网inc\lib\Demo2inc\lib\Demo3
通过类自动加载器,可以实现我们的类文件加载,这样就可以加载不同文件下的方法,但是前提是命名空间要与文件名一致,这样才可以加载到类文件中,即使它们名称一样,我们同样可以调用,只需要USE引用,再用静态方法调用,依然可以使用。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号