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来加载到内存中。