PHP中的自动加载操作实现方法详解(4)
上面就是一个自动加载的核心思想方法。下面我们就来spl_autoload_register
来注册这个函数:
index.php
<?php //定义当前的目录绝对路径 define('DIR', dirname(__FILE__)); //加载这个文件 require DIR .'/loading.php'; //采用`命名空间`的方式注册。php 5.3 加入的 //也必须是得是static静态方法调用,然后就像加载namespace的方式调用,注意:不能使用use spl_autoload_register("\\AutoLoading\\loading::autoload"); // 调用三个namespace类 //定位到Lib目录下的Name.php Lib\Name::test(); //定位到App目录下Android目录下的Name.php App\Android\Name::test(); //定位到App目录下Ios目录下的Name.php App\Ios\Name::test();
由于我们是采用PSR-O方式来定义namespace
的命名的,所以很好的定位到这个文件的在哪个目录下了。很爽。对不对。
APP\Android\Name
<?php namespaceApp\Android; className { public function __construct() { echo __NAMESPACE__ ."<br>"; } public static function test() { echo __NAMESPACE__ .' static function test <br>'; } }
所以就会很容易找到文件,并输出:
Lib static function test
App\Android static function test
App\Ios static function test
好了。基本自动加载的东西就讲完了。很实用的东西。
4. 同命名空间下的相互调用
在平时我们使用命令空间时,有时候可能是在同一个命名空间下的2个类文件在相互调用。这个时候就要注意,在自动调用的问题了。
比如Lib\Factory.php 和 Lib\Db\MySQL.php
我想在 Lib\Factory.php 中调用 Lib\Db\MySQL.php。怎么调用呢?以下是错误的示范:
newLib\Db\MySQL(); //报错,提示说 D:\wamp\www\testphp\module\Lib\Lib\Db\MySQL.php is not exist
看到没?这种方式是在Lib\命名空间的基础上来加载的。所以会加载2个Lib。这种方式相当于相对路径在加载。
正确的做法是,如果是在同一个命名空间下平级的2个文件。可以直接调用,不用命名空间。
newMySQL();//直接这样就可以了。 newDb\MySQL();//如果有个Db文件夹,就这样。
还有一种方法就是使用 use 。使用user就可以带上Lib了。use使用的是绝对路径。
useLib\Db\MySQL; newMySQL();
我想在 Lib\Db\MySQL.php 中调用 Lib\Register.php。怎么调用呢?
应该这样
useLib\Register; Register::getInstance();
因为现在已经在Lib\Db这样一个命名空间了,如果你不用