实例演示: 非限定名称, 限定名称, 完全限定名称,并分析应用场景
<?php
//1.建立一个命名空间
namespace Phone\iphone;
//函数
function iphone4(){
return 'iphone4的价格是1000元';
}
//类
class iphone5
{
public static function iphon5()
{
return 'iphone5的价格是2000元';
}
}
//接口
interface iphone6
{
public static function iphone6();
}
//常量
const IPHONEX = 'iphonex的价格是8000元';
//2.建立另一个命名空间,并且访问上一空间中的内容
namespace aaa;
//通过完全限定名称访问
//函数
echo \Phone\iphone\iphone4() , '<br>';
//类
echo \Phone\iphone\iphone5::iphon5() , '<br>';
//常量
echo \Phone\iphone\IPHONEX , '<br>';
echo '<hr>';
//通过use关键字引入,把访问由完全限定名称转换为限定名称或者非限定名称
//函数
//可以通过use将访问函数由完全限定名称转换为限定名称,但是不能转换为非限定名称
use Phone\iphone;
echo iphone\iphone4() , '<br>';
//类
//可以通过use将访问类由完全限定名称转换为非限定名称,但是不能转换为限定名称
use Phone\iphone\iphone5;
echo iphone5::iphon5() , '<br>';
//接口
//可以通过use将访问接口由完全限定名称转换为非限定名称,但是不能转换为限定名称
use Phone\iphone\iphone6;
class iphone6s implements iphone6
{
public static function iphone6()
{
return 'iphone6的价格是3000元';
}
}
echo iphone6s::iphone6() , '<br>';
//常量
//没有办法通过use将完全限定名称转换为限定名称或者非限定名称
//use Phone\iphone;
//echo IPHONEX;
总结
1、可以通过use将访问函数由完全限定名称转换为限定名称,但是不能转换为非限定名称
2、可以通过use将访问类由完全限定名称转换为非限定名称,但是不能转换为限定名称
3、可以通过use将访问接口由完全限定名称转换为非限定名称,但是不能转换为限定名称
4、没有办法通过use将完全限定名称转换为限定名称或者非限定名称
实例演示: 类文件的自动加载器实现的原理与实现
先建立一个自动加载器
<?php
try {
spl_autoload_register(function ($namespace){
//将命名空间中的分隔符转换为目录分隔符
$path = str_replace('\\', DIRECTORY_SEPARATOR, $namespace);
//生成真正要加载的地址和文件
$file = __DIR__ . DIRECTORY_SEPARATOR . $path . '.php';
require $file;
});
}catch (Exception $e) {
die($e->getMessage());
}
引用这个自动加载器
<?php
require 'autoload.php';
use car\toyota\corolla;
echo corolla::aaa(), '<br>';
总结
1、自动加载器的原理就是将命名空间转换为文件路径,当被转换后的文件路径和该文件的实际路径一致并且该文件的文件名称和类名称一致的时候,该文件可以被自动加载