在过去,如果我们想要实现某个类文件的自动加载,可以使用__autoload()魔术方法。紧接着,随着PHP的不断发展,我们可以通过使用spl_autoload_register()来注册自己定义的自动加载方法,PHP5.3之后,我们可以通过使用命名空间的方法来有效的解决类和方法的重名问题。

实现类库文件的自动加载,在很大程度上提升了代码的质量,以下篇幅记录了如何借助命名空间实现类库文件的自动加载。

命名空间

命名空间用来声明所包含代码块中命名的类和方法的有效性范围,通常我们会按照类库文件的目录结构来定义命名空间。例如:

<?php 
/**
* Driver.php
*/
namespace Notekit\Data\Driver;
class Driver{
...
}

上面的包含Driver类的Driver.php实际上存放在Notekit/Data/目录下。需要强调的是,命名空间必须书写在代码块的最位置,命名空间对大小写敏感,在使用名空间的过程中应当注意与目录名的一致性。

自动加载

如果我们严格的按照了类库文件的目录结构和目录名称给某个类定义了命名空间,那么我们将可以非常容易的实现类库文件的自动加载。思路非常简单,即当我们需要new某个类文件是,只要将命名空间中的'\'替换成目录分割符'/',然后引入即可。

定义并注册自动加载方法

function autoload($class){
  $class = str_replace('\\', '/', $class) . '.php'; 
  require_once($class); 
}

spl_autoload_register('autoload');

自动加载的实现

在诸如控制器调用模型类的场景下,我们演示一下如何实现类库文件的自动加载

模型类 Model.php

所在目录为 Notekit/Base/Model

<?php
namespace Notekit\Base\Model;
class Model{
}
?>

控制器类 Controller.php

所在目录为 Notekit/Base/Controller

<?php
namespace Notekit\Base\Controller;
use Notekit\Base\Model as Model;

class Controller{

  function getModel{
    return $model = new Model\Model;
  }

}
?>

标签: 自动加载, namespace

分享到: