命名空间之__autoload魔术方法__代码例子

1 文件目录如下:
.
├── main.php
└── tt
    └── aa
        └── Animal.php

2 其中 main.php 如下:
<?php
error_reporting(E_ALL);

function getPath($className) {
    $className = ltrim($className, '\\');
    var_dump($className);
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strrpos($className, '\\')) {
        $namespace = substr($className, 0, $lastNsPos);
        var_dump($namespace);
        $className = substr($className, $lastNsPos + 1);
        var_dump($className);
        $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
        var_dump($fileName);
    }
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
    var_dump($fileName);
    return $fileName;
}


function __autoload($classname){

    echo implode(' | ', array(__FILE__,__FUNCTION__,__LINE__,"\n"));
    var_dump($classname);

//    $classpath = "{$classname}.php";
    $classpath = getPath($classname);


   if(file_exists($classpath)){
       require_once($classpath);
   }else{
       echo $classpath." not be found!";
   }
}

$ani = new \tt\aa\Animal();
echo implode(' | ', array(__FILE__,__FUNCTION__,__LINE__,"\n"));


3 Animal.php如下:
<?php
namespace tt\aa;

class Animal{
    public function __construct(){
        echo implode(' | ', array(__FILE__,__FUNCTION__,__LINE__,"\n"));
    }
}


4 输出如下:
[dev@dev02 t1]$ php main.php
/home/dev/git/test/t1/main.php | __autoload | 25 |
string(12) "tt\\aa\\Animal"
string(12) "tt\\aa\\Animal"
string(5) "tt\\aa"
string(6) "Animal"
string(6) "tt/aa/"
string(16) "tt/aa/Animal.php"
/home/dev/git/test/t1/tt/aa/Animal.php | __construct | 6 |
/home/dev/git/test/t1/main.php |  | 40 |

__autoload方法在new之前就调用。
其实autoload方法把参数 $classname,从 \\ 转成目录 / ,最终使用require来加载到内存中。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容