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之前就調(diào)用。
其實(shí)autoload方法把參數(shù) $classname,從 \\ 轉(zhuǎn)成目錄 / ,最終使用require來(lái)加載到內(nèi)存中厘托。