【PHP高级】自动装载与名字空间


一、 还记得自动装载魔术方法的缺陷吧,通常解决的方案就是写个判断,把最常用的类写在第一个判断中,例如:

function __autoload($fileName){

if(file_exists("tc1/".$fileName.".php"))

require_once("tc1/".$fileName.".php");

elseif(file_exists("tc2/".$fileName.".php"))

require_once("tc2/".$fileName.".php");

//elseif……

}

 

$tc1=new tc1();

$tc2=new tc2();

 

随着页面地址的复杂,以上的解决方案可能需要写很多的判断语句,不确定的是想要实例化哪一个文件夹下哪一个类文件,那么需要刚开始就把所有文件夹下的类全部以判断的形式写好。可以对每一个需要装载的类使用spl_autoload_register分别注册匿名函数来加载类。实例源码

spl_autoload_register(function($fileName){

//必须要有判断,否则后面的类无法实例化

if(file_exists("tc1/".$fileName.".php"))

require_once("tc1/".$fileName.".php");

});

$tc1=new tc1();//实例化1

 

spl_autoload_register(function($fileName){

if(file_exists("tc2/".$fileName.".php"))

require_once("tc2/$fileName".".php");

});

$tc2=new tc2();//实例化2

//……

 

其中 Tc1/tc1.phpTc2/tc2.php、Tc2/tc1.php代码详见下面。

 

最麻烦就是不同的文件夹下有同名的类(文件)实例化哪一个类文件呢?程序会报错!!!解决的办法就是使用命名空间(namespace)。

二、 PHP5.3中新增了名字空间,还是以C#的习惯把它称为“命名空间”吧,作用和其一样,也类似与JAVA中架包(package)的概念,来解决类同名的问题。语法:

 

//定义

Namespace 命名空间;

Class 类名{}  

 

//实例化

$c1=new 命名空间\类名();

 

TIPS:新建的类加上命名空间,命名空间要和文件夹名一致!!!

 

示例源码:

Tc1/tc1.php 中定义类代码

namespace Tc1;  //骆驼命名法,并且只能放在第一行

class tc1{

function __construct(){echo “tc1”;}

}

 

//Tc2/tc1.php代码类似

namespace Tc2;  //骆驼命名法,并且只能放在第一行

class tc1{

function __construct(){echo “test2命名空间下的tc1”;}

}

 

//实例化

$tc1=new Tc1\tc1();

$tc11=new Tc2\tc1();

 

TIPS:命名空间最好和其他语言一样作为文件夹存在并区分大小写,类文件放在该文件夹下(可以有子命名空间);调用时虽然不区分大小写,建议还是大小写保持一致(UNIX区分);命名空间定义代码要放在第一行。

 

命名空间与自动装载:掌握了以上知识点,我们来写个自动装载并实例化的案例

spl_autoload_register(function($fileName){

//if(file_exists($fileName.".php"))//想一想为什么此时无须判断

require_once($fileName.".php");

});

//实例化2个命名空间(文件夹)下2同名类

$tc1=new Tc1\tc1();

$tc2=new Tc2\tc2();

$tc11=new Tc2\tc1();

 

注意:使用注册加命名空间实例化类时,如果需要实例化系统类,必须在系统类前面加上\”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值