命名空间 namespace
PHP 命名空间可以解决以下两类问题:
- 1.用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
- 2.为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
1、非限定名称:省略空间名称,使用默认或当前的命名空间
2、完全限定名称:类似绝对目录,从全局空间的反斜线开始’\’
3、限定名称:前面必须添加全局空间才可访问
示例:
<?php
namespace test;
const USER_NAME = '曹操';
function info()
{
return '魏国人';
}
class Demo
{
public static function nation()
{
return USER_NAME.'->魏国人!';
}
}
echo '1、非限定名称:省略空间名称,使用默认或当前的命名空间';
echo '<hr>';
echo USER_NAME;
echo '<hr>';
echo info();
echo '<hr>';
echo Demo::nation();
echo '<hr>';
echo '当前命名空间: ',__NAMESPACE__,'<hr>';
echo '2、完全限定名称:类似绝对目录,从全局空间的反斜线开始';
namespace test\demo\show\index\test;
const USER_NAME = '刘备';
function info()
{
return '蜀国';
}
class Demo
{
public static function nation()
{
return USER_NAME.'->魏国人!';
}
}
echo '<hr>';
echo \test\demo\show\index\test\USER_NAME;
echo '<hr>';
echo \test\demo\show\index\test\info();
echo '<hr>';
echo \test\demo\show\index\test\Demo::nation();
echo '<hr>';
echo '当前命名空间: ',__NAMESPACE__,'<hr>';
use test\demo\show\index\test as show;
echo show\USER_NAME;
echo show\info();
echo show\Demo::nation();
echo '<hr>';
echo '3、限定名称:前面必须添加全局空间才可访问';
namespace test\demo\show\index;
echo test\USER_NAME;
echo '<hr>';
echo test\info();
echo '<hr>';
echo test\Demo::nation();
echo '<hr>';
echo '当前命名空间: ',__NAMESPACE__,'<hr>';
示例图
总结:完全限制:从全局开始,类似绝对路径。
限定名称:添加了全局空间才可以使用。类似相对路径
非限定名称:类似类访问当前的空间。
PHP类自动加载器
自动加载就是我们在new一个class的时候,不需要手动去写require来导入这个class.php文件,程序自动帮我们加载导入进来。
自动加载可以说是现代PHP框架的根基,任何牛逼的框架或者架构都会用到它,它发明出来的理由是啥呢?一个字:懒。因为项目越来愈大,相关联的类库文件越来越多,我们不可能再像小项目那样在一个文件中全部手动一个一个require
示例
<?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)))
//判断$file是不是一个文件和存不存在
{
throw new \Exception('不是文件或者文件不存在');
}
require $file;
});
} catch (Exception $e){
die($e->getMessage());
}
use bin\lib\Test;
use bin\lib\Test1;
use bin\lib\Test2;
use bin\lib\Test3;
echo Test::class;
echo"<br>";
echo Test1::class;
echo"<br>";
echo Test2::class;
echo"<br>";
echo Test3::class;
示例图: