《打造自己的PHP框架(4)类的自动加载》要点:
本文介绍了打造自己的PHP框架(4)类的自动加载,希望对您有用。如果有疑问,可以联系我们。
有了自动加载,我们在也不用担心require、include的问题了,不用在文件头部写一大堆require、include了,再也不用担心是否必要引入某个类的问题了
自动加载就是依赖于php的命名空间,什么是命名空间呢?好比就是你的名字,好比,你叫王大锤,那么在你们那个大家庭里面就不会有人再叫王大锤,但是,在其它姓王的家庭里面就有可能有叫王大锤的这个人,你们是两个大家庭,所有,有相同名字的人不会冲突,那么,一个家庭就相当与一个命名空间,所有,一个命名空间下面的类的名称可以和其它命名空间下面的类的名称一样,当然,变量、函数也是一个道理,在php没有命名空间之前,有两个一样名称的变量、函数、类是不允许的.
很简单,非常简单
namespace 空间名称;
<?php
namespace Goods;
function getGoodsList()
{
}
?>
定义了一个命名空间叫Goods
还可以定义子命名空间,如下:
<?php
namespace Library\Base;
?>
Library是一个命名空间,Base是Library下面的子空间,当然,Base下面也可以有子空间,所有,子子孙孙无穷尽也.
定义一个类,名叫Controller
<?php
namespace Library\Base;
class Controller
{
}
?>
再定义一个类,也叫Controller
<?php
namespace Library;
class Controller
{
}
?>
他们虽然类名相同,但是命名空间分歧,所以,不会冲突的,那我们怎么实例化呢?很简单,带上命名空间即可
<?php
$base = new Library\Base\Controller();
$controller = new Library\Controller();
?>
假如,我不想写前面的Library\Base,那要怎么办呢?
<?php
use Library\Base\Controller;
$base = new Controller;
$controller = new Library\Controller();
?>
怎样能实现自动加载呢?这里就有个规范,就是,命名空间和类存放的目录对应,好比命名空间是Library\Base,下面有个类叫Controller,那么,对应的文件目录就是/Library/Base/这个目录.
php可以注册一个自动加载函数,当我们new一个类的时候,php首先会分析这个类是否存在,如果这个类没有载入进来,那么,php就会调用这个自动加载函数,并传入这个类的名称,包含命名空
比如我们new Library\Base\Controller();但是现在这个类还没被引入进来,那么就找不到这个类,php就会调用自动加载函数,函数是我们本身编写的,比如,名字叫loadClass
<?php
function loadClass($class_name)
{
}
?>
那么$class_name接收到的值就是'Library\Base\Controller'这个字符串,调用完这个函数之后,才会真正的去实例化这个类,这时候,如果还没有,那就报错了,说这个类未找到,所有,我们可以在这个办法里面加载需要的类,由于,命名空间和文件目录一致,所有,要找到这个类就很简单了
<?php
function loadClass($class_name)
{
//把命名空间的分隔符"\"替换为当前操作系统的文件目录分隔符
$class_name = str_replace('\\', DIRECTORY_SEPARATOR, $class_name);
//组装类文件路径
$class_file = $class_name . '.php';
//加载类文件
require $class_file;
}
?>
<?php
spl_autoload_register('loadClass');
?>
大概的思路就是这样,当然,我们写的框架的类自动加载不会这么简单,但是,整体还是这个流程,只是考虑的比较多罢了,到时候我们再讲.
第一次写教程,可能讲的不是很全面,如果,还不明白,可以在下面回复,我来解答
当然,喜欢的话记得点一波存眷,觉得好的话,记得分享给朋友
维易PHP培训学院每天发布《打造自己的PHP框架(4)类的自动加载》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。
转载请注明本页网址:
http://www.vephp.com/jiaocheng/9357.html