php中namespace于自动加载
namespace中的非限定名称,限定名称
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\Demo2
inc\lib\Demo3
总结
通过类自动加载器,可以实现我们的类文件加载,这样就可以加载不同文件下的方法,但是前提是命名空间要与文件名一致,这样才可以加载到类文件中,即使它们名称一样,我们同样可以调用,只需要USE引用,再用静态方法调用,依然可以使用。