命名空间
- 受命名空间影响的是:类(包括抽象类和traits)、接口、函数和常量
- 命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,除了一个以外:declare关键字。
- 与目录和文件的关系很象,PHP 命名空间也允许指定层次化的命名空间的名称
- 可以在同一个文件中定义多个命名空间
- 命名空间可以通过三种方式引用:非限定名称,限定名称,完全限定名称
- 别名/导入通过use as 实现
- 如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间
非限定名称, 限定名称, 完全限定名称,空间的别名与类别名的语法与场景
<?php
//建立一个命名空间a\b\c
namespace a\b\c {
class demo
{
public function print_p($text)
{
return __CLASS__ . '---' . $text . '<br>';
}
}
}
//建立一个命名空间a\b
namespace a\b {
class demo
{
public function print_p($text)
{
return __CLASS__ . '---' . $text . '<br>';
}
}
}
//非限定名称
namespace a\b {
$a = new demo();
echo $a->print_p('非限定名称');
}
//限定名称
namespace a\b {
$a = new c\demo();
echo $a->print_p('限定名称');
}
//完全限定名称
namespace {
//命名空间的类别名
use \a\b\c\demo as demo;
//命名空间的别名
use \a\b\c as c;
$c = new c\demo();
$demo = new demo();
echo $c->print_p('完全限定名称');
echo $demo->print_p('完全限定名称');
}
自动加载
自动加载的条件:
- 命名空间必须和类文件所在的绝对路径一一对应
- 当前类名称与当前的类文件的名称完全一致
类文件的自动加载器实现
在根目录下建立一个ns文件夹里面有flie1.php和flie2.php两个文件
flie1.php
<?php
namespace ns;
class file1
{
public $a=456;
public function a()
{
return '我是file1'.'<br>';
}
}
flie2.php
<?php
namespace ns;
class file2
{
public $a=123444;
public function a()
{
return '我是file2'.'<br>';
}
}
autoload.php
<?php
try {
spl_autoload_register("auto");
} catch (Exception $e) {
die($e->getMessage());
}
function auto($classname)
{
$a = __DIR__ . DIRECTORY_SEPARATOR . $classname . '.php';
$a = str_replace('\\', DIRECTORY_SEPARATOR, $a);
require $a;
}
index.php
<?php
require 'autoload.php';
use ns\file1;
use ns\file2;
$f1 = new file1();
echo $f1->a();
$f2 = new file2();
echo $f2->a();