Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:有了命名空间, 就不再担心全局成员的命名冲突了,包括引入的第三方组件,这是促进php组件化开发的基石, 可以说, 现代php就靠它实现华丽转身
<?php
//清华大学
namespace nQhdx//不同的命名空间可以存在相同的类,函数,接口,常量
{
class StuInfo
{
private $school = '清华大学';
private $dep = '计算机科学与应用';
private $classes = '04-08';
public function printSDC()
{
echo '班名:',$this ->classes,'<br>';
echo '系名:',$this ->dep,'<br>';
echo '校名:',$this ->school,'<br>';
echo '<hr>';
}
}
//访问当前空间中的类和类中的方法,可省略当前空间名称:非限定名称
$stu = new StuInfo();
$stu ->printSDC();
}
//人民大学
namespace nRmdx
{
class StuInfo
{
private $school = '人民大学';
private $dep = '计算机科学与应用';
private $classes = '04-08';
public function printSDC()
{
echo '班名:',$this ->classes,'<br>';
echo '系名:',$this ->dep,'<br>';
echo '校名:',$this ->school,'<br>';
echo '<hr>';
}
}
//访问当前空间中的类和类中的方法,可省略当前空间名称:非限定名称
$stu = new StuInfo();
$stu ->printSDC();
//访问另一个空间是的类需要使用:完全限定名称以“\”开头+空间名称+类名
echo '***********访问另一个空间的类***************','<br>';
$stu1 =new \nQhdx\StuInfo();
$stu1 ->printSDC();
}
//北京大学
namespace nBjdx
{
class School
{
private $school = '北京大学';
public function printSchool()
{
//访问具有层级关系的空间时
//$dep = new Computer\StuInfo();代表访问的是当前空间下的Computer空间下的StuInof类
$dep = new Computer\StuInfo();
$dep->printSDC();
echo '校名:',$this ->school,'<br>';
echo '<hr>';
}
}
$stu = new School();
$stu -> printSchool();
}
namespace nBjdx\Computer
{
class StuInfo
{
private $dep = '计算机科学与应用';
private $classes = '04-08';
public function printSDC()
{
echo '班名:',$this ->classes,'<br>';
echo '系名:',$this ->dep,'<br>';
}
}
}
?>
<?php
//清华大学
namespace nQhdx//不同的命名空间可以存在相同的类,函数,接口,常量
{
class StuInfo
{
private $school = '清华大学';
private $dep = '计算机科学与应用';
private $classes = '04-08';
public function printSDC()
{
echo '班名:',$this ->classes,'<br>';
echo '系名:',$this ->dep,'<br>';
echo '校名:',$this ->school,'<br>';
echo '<hr>';
}
}
}
//人民大学
namespace nRmdx
{
class StuInfo
{
private $school = '人民大学';
private $dep = '计算机科学与应用';
private $classes = '04-08';
public function printSDC()
{
echo '班名:',$this ->classes,'<br>';
echo '系名:',$this ->dep,'<br>';
echo '校名:',$this ->school,'<br>';
echo '<hr>';
}
}
}
//北京大学
namespace nBjdx
{
class StuInfo
{
private $school = '北京大学';
private $dep = '计算机科学与应用';
private $classes = '04-08';
public function printSDC()
{
echo '班名:',$this ->classes,'<br>';
echo '系名:',$this ->dep,'<br>';
echo '校名:',$this ->school,'<br>';
echo '<hr>';
}
}
}
namespace nSchool
{
//使用空间别名,可以简化代码
use \nQhdx\StuInfo as qStu;
use \nRmdx\StuInfo as rStu;
use \nBjdx\StuInfo as bStu;
$stu1 = new qStu();//通过空间别名访问该空间中的类
$stu1 ->printSDC();
$stu2 = new rStu();
$stu2 ->printSDC();
$stu3 = new bStu();
$stu3 ->printSDC();
}
?>
<?php
require 'autoLoad.php';
//通过autoLoad.php中的自动加载器,在使用Qhdx类的时候自动加载
//如果想使用原始类中的名称则不需要加as关键字
use stuInfo\school\Qhdx;
//通过autoLoad.php中的自动加载器,在使用Qhdx类的时候自动加载
use stuInfo\school\Rmdx;
//通过autoLoad.php中的自动加载器,在使用Qhdx类的时候自动加载
use stuInfo\school\Bjdx;
//类已经通过自动加载器加载成功,可直接使用
$stu1 = new Qhdx();
$stu1 ->printSDC();
$stu2 = new Rmdx();
$stu2 ->printSDC();
$stu3 = new Bjdx();
$stu3 ->printSDC();
?>
<?php
//北京大学
//要实现自动加载,
//1.空间名称必须和类文件所在的路径一一对应
//2.文件名必须与类名相同
namespace stuInfo\school
{
class Bjdx
{
private $school = '北京大学';
private $dep = '计算机科学与应用';
private $classes = '04-08';
public function printSDC()
{
echo '班名:',$this ->classes,'<br>';
echo '系名:',$this ->dep,'<br>';
echo '校名:',$this ->school,'<br>';
echo '<hr>';
}
}
}
?>
<?php
try
{
spl_autoload_register(function($className){
//DIRECTORY_SEPARATOR返回当前系统的目录分隔符
//将空间中的分隔符替换成当前系统的目录分隔符
$path = str_replace('\\', DIRECTORY_SEPARATOR, $className);
//__DIR__返回当前文件所在路径
//生成要加载的类文件名称
$file = __DIR__ . DIRECTORY_SEPARATOR . $path . '.php';
// 3. 加载这个文件
require $file;
});
}
catch(Exception $e)
{
$e->getMessage();
}
?>
当前类文件所在的目录结构
代码运行效果