命名空间
声明和调用
<?php
// 命名空间
namespace ns1;
class Demo
{
public static function get()
{
return 'PHP';
}
}
function f1($name)
{
return '你好' . $name;
}
// 命名空间2
namespace ns2;
class Demo
{
public static function get()
{
return 'PHP中文网';
}
}
// 调用ns1空间中的类和函数
echo \ns1\Demo::get() . '<br>' . \ns1\f1('小熊猫') . '<hr>';
// 调用本空间类
echo Demo::get();
全局空间
<?php
namespace ns1 {
class Demo
{
public static function get()
{
return 'PHP';
}
}
function f1($name)
{
return '你好' . $name;
}
}
namespace ns2 {
class Demo
{
public static function get()
{
return 'PHP中文网';
}
}
}
namespace {
echo ns1\Demo::get() . '<br>';
echo ns2\Demo::get();
}
在空间中访问类和函数
访问函数时,如果本空间没有同名函数的声明,那么会在全局中寻找调用
访问类时必须加上命名空间除非在本空间中有同名类的声明
如果命名空间内有和系统内置的同名函数,那么调用系统内置函数时需要加上全局空间标识符‘\’
<?php
// 在空间中访问类和函数的区别
namespace ns1 {
// 访问函数时,如果本空间没有同名函数的声明,那么会在全局中寻找调用
echo f1('小熊猫');
// 访问类时必须加上命名空间除非在本空间中有同名类的声明
echo \Demo::get();
}
namespace ns2 {
class Demo
{
public static function get()
{
return 'PHP中文网';
}
}
}
namespace {
class Demo
{
public static function get()
{
return 'PHP';
}
}
function f1($name)
{
return '你好' . $name;
}
}
命名空间的别名
<?php
namespace ns1;
class Demo
{
public static function get()
{
return 'ns1空间---' . self::class;
}
}
namespace ns2;
class Demo
{
public static function get()
{
return 'ns2空间---' . self::class;
}
}
// 使用完全限定名称访问
echo \ns1\Demo::get() . '<hr>';
// 使用限定名称访问
echo nns1\Demo::get() . '<hr>';
// 使用非限定名称(也就是访问本空间内的成员)
echo Demo::get();
namespace ns2\nns1;
class Demo
{
public static function get()
{
return 'nns1空间---' . self::class;
}
}
// 别名访问
namespace ns3;
// 空间级的别名(给空间起别名)
use \ns1 as ns;
echo '空间级别名访问:' . ns\Demo::get() . '<hr>';
// 类级别名
use \ns2\Demo as nn;
echo '类级别名访问:' . nn::get() . '<hr>';
// 如果起的别名和类名相同和省略as和后面的别名(如果本空间中有同名类 那么就不能省略)
use \ns2\nns1\Demo;
echo '别名和类名相同访问:' . Demo::get() . '<hr>';
自动加载
类文件
<?php
namespace inc\lib;
class Test1
{
public static function get()
{
return 11111;
}
function hello($name)
{
return 'hello' . $name;
}
}
function hello($name)
{
return 'hello' . $name;
}
自动加载类文件
<?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)))
throw new \Exception('文件名不存在');
require $file;
});
} catch (Exception $e) {
die($e->getMessage());
}
// 直接调用文件中的类
echo inc\lib\Test1::get();
// 引入文件
new inc\lib\Test1;
echo '<hr>';
// 调用文件中的方法
echo inc\lib\hello('小熊猫');
总结
1.对于命名空间有了一些了解
2.了解了类的自动加载