批改状态:合格
老师批语:命名空间很神奇
全局成员:写在函数外部的东西
全局成员有四个:函数,常量,类,接口
全局成员最大特点:不能重复命名
用namespace关键字来定义命名空间
<?php//命名空间Anamespace A;//接口interface iTest{public function getSite();}//类class Demo implements iTest{public function getSite(){return 'php中文网';}}//函数function f1(iTest $obj){return $obj->getSite();}//输出echo '函数输出'.f1(new Demo).'<br>';echo '类输出'.(new Demo)->getSite().'<hr>';/*———————————————————————————————————————————————————————————————————————————————— *///命名空间Bnamespace B;//在B命名空间中访问A命名空间中的类方法echo '命名空间B调用getSite()方法'.(new \A\Demo)->getSite().'<br>';//调用函数echo \A\f1(new \A\Demo);

::
<?phpnamespace one{class Demo{public function getSite(){return 'php中文网';}}}/*************************************************************************/namespace two{echo (new \one\Demo)->getSite().'<br>';//查看当前类全名echo '当前类全名:'.two::class.'<br>';echo '查看one的类全名:'.\one\Demo::class.'<br>';class D{}echo D::class;}/*************************************************************************///全局匿名空间namespace{//因为有了全局匿名空间,那么全局成员的声明就不应该放在全局,而应该放在空间中//因此,全局空间应该主要写对全局对象的调用echo '<br>'.(new one\Demo)->getSite();}/*************************************************************************/

<?php//在空间中访问类与访问函数有什么区别namespace one{//访问类echo \Test::NAME.'<hr>';function var_dump($name){echo 'HELLO 你好?****'.$name;}//如果调用的函数与系统内置的函数重名,则优先调用当前空间的函数//只有在当前空间找不到这个函数,再到全局中去找var_dump(\Test::NAME);echo '<br>';\var_dump(\Test::NAME);}//全局namespace{class Test{const NAME = 'PHP中文网';}}

<?php//命名空间的别名namespace one;class Demo{}/**********************************************************/namespace two;class Demo{}/**********************************************************/namespace three;//访问one::Demo//从全局空间开始访问,完全限定名称的类echo \one\Demo::class.'<br>';//类名可以省略掉与当前空间名称重复的部分//限定名称的类:不从全局空间开始访问echo A\Hello::class,'<br>';class Work{}//3.访问当前空间中的类成员,不要添加空间名称//非限定名称的类:Workecho Work::class.'<br>';echo \one\Demo::class.'<br>';//使用空间或类的别名来简化这种调用//空间级的别名:给空间起个别名,使用关键字use//主要是针对完全限定名称的类起的别名use \one as I;echo '别名访问:'. I\Demo::class,'<br>';//2.类级的别名,给完全限定名称的类起个别名use \two\Demo as R;echo '别名访问:' .R::class.'<br>';//如果别名和类名相同,可以省略as后面的别名//use \one\Demo as Demo;//use \one\Demo;//如果当前类中也有一个与之同名的非限定的类,就不能省略别名class Demo{}use \one\Demo as em;echo '别名访问:' .em::class;/**********************************************************/namespace three\A;class Hello{}//完全限定名称:从全局空间开始,前面总是由一个"\"//限定名称:类名总是会有一个或者多个空间名称,但不是从全局开始//非限定名称:就是不带有空间名称的类

spl_autoload_register():注册给定的函数作为 __autoload 的实现
spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] ) : bool
| 参数 | 描述 |
|---|---|
| autoload_function | 欲注册的自动装载函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数spl_autoload()。 |
| throw | 此参数设置了 autoload_function 无法成功注册时, spl_autoload_register()是否抛出异常。 |
| prepend | 如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。 |
<?php//__DIR__//echo __DIR__,'\\demo7.php';echo __DIR__.'<hr>';//require __DIR__ . '\\inc\\lib\\Test1.php';//echo \inc\lib\Test1::class,'<br>';//str_replace(目标值,替换值,执行替换的数组或者字符串,替换次数)$path = str_replace('\\',DIRECTORY_SEPARATOR,'\inc\lib\Test1');echo DIRECTORY_SEPARATOR.'<br>';echo $path.'<hr>';require __DIR__ .$path .'.php';//echo __DIR__ . $path . '.php';echo Test1::class;
<?php//类的自动加载try{spl_autoload_register(function($class){$path = str_replace('\\',DIRECTORY_SEPARATOR,$class);$file = __DIR__ . $path.'.php';if(!(is_file($file) && file_exists($file)))throw new \Exception('不是文件或文件不存在');require $file;});}catch(Exception $e){die($e->getMessage());}use inc\lib\Test1;use inc\lib\Test2;use inc\lib\Test3;echo Test1::class.'<br>';echo Test2::class.'<br>';echo Test3::class.'<br>';

用namespace关键字来定义命名空间
命名空间分为完全限定名称,限定名称和非限定名称
完全限定名称:从全局空间开始,前面总是由一个”\”
限定名称:类名总是会有一个或者多个空间名称,但不是从全局开始
非限定名称:就是不带有空间名称的类
别名的使用:use 命名空间名称 as 自定义名称
类的自动加载:用spl_autoload_register()函数
对类的自动加载有了初步认识,就是sql_autoload_register()这个函数有点难理解,不知道这个$class这个变量的值具体是怎么赋值的,我的理解是使用use时把命名空间名称赋值给$class
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号