批改状态:合格
老师批语:注册自动加载器函数是在引用类的时候,由系统自动完成, 与use无关, 它只是为完全限定名称的类起一个别名罢了, 不用它也是一样的
<?php// 命名空间:方式一// 此种声明方式,不能在同脚本中声明匿名空间(全局空间)namespace ns1;interface iDemo{public function show();}class Demo implements iDemo{public $name = '果冻';public function show (){return $this->name;}}$obj = new Demo();echo $obj->show(),'<hr>';// 普通写法// function ff ($obj)// 如果要声明函数中参数的类型,如下:// 1. 使用类名 Demo// function ff (Demo $obj)// 2. 使用接口名 iDemo,在有接口的的情况下,最好这样使用function ff (iDemo $obj){echo $obj->show(),'<hr>';}ff($obj);// 在命名空间中访问其他命名空间中的成员namespace ns2;// \ : 表示全局空间$obj1 = new \ns1\Demo();echo $obj1->show(),'<hr>';\ns1\ff($obj1);
<?php// 命名空间:方式二// 这样的方式就可以在同脚本中声明全局空间(匿名空间)namespace ns1{class Demo{public static function show (){return __METHOD__;}}}namespace ns2{// 1. 访问ns1中的show()方法echo \ns1\Demo::show(),'<hr>';// 2. 查看当前类全名echo \ns1\Demo::class,'<hr>';}// 全局空间中访问时,可以省略第一个 \namespace{// 1. 访问ns1中的show()方法echo ns1\Demo::show(),'<hr>';// 2. 查看当前类全名echo ns1\Demo::class,'<hr>';// 因为有了全局空间, 那么全局成员的声明就不应该放在全局,而应该放在空间中// 因此,全局空间应该主要写对全局对象的调用}
<?php// 命名空间类名的引用namespace ns1;class Demo{}namespace ns2;class Demo{}namespace ns3;// 1. 限定名称:不从根开始但有路径(省略和当前空间名称相当的部分)echo \ns3\sub\Demo::class,'<hr>';echo sub\Demo::class,'<hr>';namespace ns3\sub;class Demo{}// 2. 完全限定名称:从根开始且有路径echo \ns1\Demo::class,'<hr>';// 3. 非限定名称:没有根也没有路径(当前空间)echo Demo::class;
<?php// 命名空间的别名namespace ns1;class Demo{}class Test{}namespace ns2;class Demo{}// 1. 空间级别名echo \ns1\Demo::class,'<hr>';use \ns1 as n;echo n\Demo::class,'<hr>';// 2. 类级别名use \ns1\Demo as d;echo d::class,'<hr>';// 3. 简写:前提是当前空间中不能有同名的类// use \ns1\Test as Test;use \ns1\Test;echo Test::class,'<hr>';// class Test{} 若有同名的类会报错// 4. 若在当前空间,可一省略 \use ns2\Demo as dd;echo dd::class;
<?php// 示例一:namespace ns1{function print_r ($arr){return '我在打印 : '.implode(',',$arr);}// 1. 访问类时,都要加 \echo \Arr::NAME,'<hr>';// 2. 访问函数时// 2.1 若不加 \ ,访问到当前空间的自定义函数echo print_r(\Arr::$arr);echo '<hr>';// 2.2 若加 \ ,此时到了全局空间中查找,调用了PHP内置函数\print_r(\Arr::$arr);echo '<hr>';}namespace{class Arr{const NAME = '果冻';public static $arr = ['aa','bb','cc'];}}// 示例二:namespace ns2{function var_dump($name){echo '我的名字叫 : ' . $name;}var_dump(\Arr::NAME);echo '<hr>';\var_dump(\Arr::NAME);}
<?php// 类的自动加载try{spl_autoload_register(function($class){$path = str_replace('\\',DIRECTORY_SEPARATOR,$class);$file = __DIR__.DIRECTORY_SEPARATOR.$path.'.php';if (!(is_file($file) && file_exists($file)))throw new \Exception('不是文件名文件不存在');require $file;});}catch(Exception $e){die($e->getMessage());}echo inc\lib\test1::NAME,'<hr>';echo inc\lib\test1::show(),'<hr>';echo inc\lib\test2::class,'<hr>';echo inc\lib\test3::class,'<hr>';<?php// 1. 当前类的命名空间与当前类的文件路径对应起来namespace inc\lib;// 2. 类名必须与当前类文件名称相同class test1 {const NAME = 'peter';public static function show (){return __METHOD__;}}
用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号