命名空间
<?php
//命名空间
// 全局成员四大家族: 类, 接口, 函数, 常量
namespace H5\C3
{
echo __NAMESPACE__,'<BR>';
class Demo
{
const PRO_LANG = '当前语言是html+css3+js(PHP)';
}
}
// echo Demo::PRO_LANG;
namespace JS\CSS
{
class Demo
{
const PRO_LANG = '当前语言是html+css3+js(c++)';
}
class T1
{
const PRO_LANG = '我是T1';
}
class T2
{
const PRO_LANG = '我是T2';
}
}
// namespace H5\JS;
namespace H5\JS
{
class Demo
{
const PRO_LANG = '当前语言是html+css3+js(java)';
}
//当:在本命名空间里访问了没有的函数,类等的时候,会自动去全局空间找
echo \Test::A(),'<br>';
echo \Test::AA;
echo '<br>';
echo (new \Test1)->B();
echo '<br>';
}
//创建匿名空间的话。上面所有命名空间应该改为使用{}
namespace
{
//给空间取别名:(当引入的同一个空间比较多时,就可以使用命名空间)
use JS\CSS as t;
echo t\T1::PRO_LANG;
echo '<br>';
//或
use JS\CSS\T2;
echo T2::PRO_LANG;
echo '<br>';
echo \H5\C3\Demo::PRO_LANG;
echo '<br>';
echo \JS\CSS\Demo::PRO_LANG;
echo '<br>';
echo H5\JS\Demo::PRO_LANG;
class Test
{
const AA ='试一试';
public static function A()
{
return '我在这里会被调用';
}
}
class Test1
{
public function B()
{
return '实例化看下';
}
}
// echo (new Test1)->B();
}
命名空间小实战(分别是三个文件)
这是:inc/lib/demo1.php
<?php
// 如果想实现自动加载,需要满足二个条件
// 1. 命名空间必须和类文件所在的绝对路径一一对应
// 2. 当前类名称与当前的类文件的名称完全一致
namespace inc\lib;//条件1;
class Demo1//条件2
{
public function Test()
{
return '当前文件是Demo1.php 。当前文件的类名称是Demo1';
}
}
这是:inc/lib/demo2.php
<?php
class Demo2
{
public function Test()
{
return '当前文件是Demo2.php 。当前文件的类名称是Demo2';
}
}
这是:inc/lib/demo3.php
<?php
class Demo3
{
public function Test()
{
return '当前文件是Demo3.php 。当前文件的类名称是Demo3';
}
}
封装自动加载
文件:autoload.php
<?php
//封装自动加载
//spl_autoload_register — 注册给定的函数作为 __autoload 的实现
try{
spl_autoload_register(function($className){
//1,先将类名空间的分隔符转为目录分隔符
$path = str_replace('\\',DIRECTORY_SEPARATOR , $className);
// 测试
// echo $path;
//生成加载类文件名称
$file =__DIR__.DIRECTORY_SEPARATOR.$path.'.php';
// 测试
// echo $file;
//3,加载这个文件
require $file;
});
}catch(Exception $e){
die($e->getMessage());
}
执行文件。。OK完成!
<?php
require 'autoload.php';
use inc\lib\Demo1;
$demo1=new demo1;
echo $demo1->Test();
总结:命名空间相对较简单,就是他的方法太多。对于我记性差的人来说,知道那么一两个可以用的就行了。