Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:这些都是框架中的基础内容, 如果不理解, 会影响到后面, 如果你觉得空间不难, 可能是个假象, 在框架中, 这空间能把人整晕, 一定要重视起来
<?php
namespace ns1;
function demo(){
echo 'hello,ns1';
}
namespace ns2;
function demo(){
echo 'hello,ns2';
}
//若要访问当前空间下的demo
//直接访问 这叫非限定名称
demo(); //输出 hello,ns2
//若要访问ns1的demo 这叫完全限定名称
\ns1\demo(); //输出hello,ns1
//若要访问子空间的demo 这叫限定名称
z1\demo(); //输出 hello,ns2,z1
//ns2 创建子空间
namespace ns2\z1;
function demo(){
echo 'hello,ns2,z1';
}
<?php
namespace ns1 {
function demo()
{
echo 'hello,ns1';
}
}
namespace ns2 {
function demo()
{
echo 'hello,ns2';
}
}
namespace ns2\z1 {
function demo()
{
echo 'hello,ns2,z1';
}
}
//创建 全局空间
namespace {
function demo()
{
echo '我是全局空间';
}
// 调用全局空间demo
demo(); //输出 我是全局空间
echo '<hr>';
// 调用ns1 demo
\ns1\demo(); //hello,ns1
// 调用ns2 demo
\ns2\demo(); // hello,ns2
// 调用ns2下面的子空间 demo
\ns2\z1\demo(); //hello,ns2,z1
}
<?php
namespace ns1 {
function demo()
{
echo 'hello,ns1';
}
}
namespace ns2 {
function demo()
{
echo 'hello,ns2';
}
}
namespace ns2\z1 {
function demo()
{
echo 'hello,ns2,z1';
}
// 创建类
class Demo{
// 创建方法
public static function index(){
echo '我是ns2\z1里的index类';
}
}
}
//创建 全局空间
namespace {
function demo()
{
echo '我是全局空间';
}
//如果我要调用ns2\z1\demo()
// 原始方法
\ns2\z1\demo(); // hello,ns2,z1
// 给他起别名
use ns2\z1 as z;
z\demo(); //输出 hello,ns2,z1 将命名空间简化
// 调用类
// 原始方法
\ns2\z1\Demo::index(); //我是ns2\z1里的index类s
// 给他起别名
use ns2\z1\Demo as k;
k::index(); //我是ns2\z1里的index类
// 如果类名与别名相同 可以省略类别名
// 比如
// use ns2\z1\Demo as Demo;
// 可以直接 省略
use ns2\z1\Demo;
Demo::index(); // 输出相同 我是ns2\z1里的index类
}
在一个脚本中 可能会加载几十上百个文件,那么挨个require 就不现实了 所以考虑封装一个自动加载器
比如 你的文件放到 inc/lib 文件夹中 那么命名空间必须是 namespace inc\lib;
比如 类名称为 class Demo1 那么该文件的名字 也要是 demo1.php
demo1.php demo2.php demo3.php 保存到 inc文件夹下面的lib文件夹中
对应的文件中 类名必须与文件名一致
autoload.php
<?php
//自动加载预备知识
//str_replace() 替换字符串中指定内容
//DIRECTORY_SEPARATOR 目录分隔符 跟随系统自动改变 windows / liunx \
//__DIR__ 当前所在路径
//spl_autoload_register() 注册一个自动加载器
try {
spl_autoload_register(function ($className) {
// 1.命名空间中的分隔符转为目录分隔符
$path = str_replace('\\', DIRECTORY_SEPARATOR, $className);
// 2.生成真正要加载的类文件
$file = __DIR__ . DIRECTORY_SEPARATOR . $path . '.php';
// 加载这个文件
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::class , '<hr>'; // 输出 inc\lib\Demo1
echo Demo2::class , '<hr>';// 输出 inc\lib\Demo2
echo Demo3::class , '<hr>';// 输出 inc\lib\Demo3
学命名空间那几天有些私事给耽搁了,一直记得老师说命名空间学不会影响后面的框架,正好今天有时间,本来以为这个重要的东西应该比类难,还是有些抵触情绪不想学,可是不学又不行,只能硬着头皮上了,随着课程的深入 其实一点都不难,重在理解,就是将n个文件 写到一个脚本中,并且不会因为重名报错。
关于类的自动加载 感觉好神奇! 几行代码解决了写n个require的烦恼,只要加载这个文件就可以了,就像是类中的属性拦截器,当你加载这个命名空间中的方法时,不用require,自动加载器会自动调用并完成require功能!