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这样一个命名空间了,如果你不用