標籤:style blog color io os 使用 檔案 sp div
5.3後就有了命名空間,從別人家哪裡下的API發現很少有包含require,include的代碼,但是卻實現了所有檔案的包含。
文章目錄:
- __autoload提示。
- 命名空間介紹和使用。
- 兩者結合使用最佳化代碼。
1,__autoload提示:
原理:當有定義__autoload函數,每次建立一個類的對象就會觸發該函數。
原型:
function __autoload($classname){ $classname=str_replace(‘\\‘,‘/‘,$classname); require ‘../src/‘.$classname.‘.php‘;}
用__autoload實現自動載入:
function __autoload($classname){ requireAll(‘../src‘,$class_name)}/** * 搜尋所有的 $dir目錄下的檔案,如果存在檔案名稱為 $class_name 的檔案就包含它。 */function requireAll($dir,$class_name){ $d=dir($dir); while(false!==($entry=$d->read())){ if($entry==‘..‘) continue; if($entry==‘.‘) continue; if(is_dir($dir.‘/‘.$entry)){ requireAll($dir.‘/‘.$entry,$class_name); }else{ if($entry==$class_name.‘.php‘){ require_once $dir.‘/‘.$entry; } } } $d->close();}
在目錄下,無論那個層次,只要你定義了這個類,並且名字和檔案名稱一致,你就可以建立這個類的對象。
2,命名空間介紹和使用
命名空間是為了使類名定義不重複,不是用命名空間的代碼往往為了區分一個類似功能的函數命名要多出很多位元組,有時候還可能與系統定義的函數發生衝突,命名空間就是為了避免這一類事情的發生。
命名空間規則:
預設的是公用的命名空間,在網上截取這一段:
非限定名稱,或不包含首碼的類名稱,例如 $a=new foo(); 或 foo::staticmethod();。如果當前命名空間是 currentnamespace,foo 將被解析為currentnamespace\foo。如果使用 foo 的代碼是全域的,不包含在任何命名空間中的代碼,則 foo 會被解析為foo。 警告:如果命名空間中的函數或常量未定義,則該非限定的函數名稱或常量名稱會被解析為全域函數名稱或常量名稱。詳情參見 使用命名空間:後備全域函數名稱/常量名稱。
限定名稱,或包含首碼的名稱,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果當前的命名空間是currentnamespace,則 foo 會被解析為 currentnamespace\subnamespace\foo。如果使用 foo 的代碼是全域的,不包含在任何命名空間中的代碼,foo 會被解析為subnamespace\foo。
完全限定名稱,或包含了全域首碼操作符的名稱,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在這種情況下,foo 總是被解析為代碼中的文字名(literal name)currentnamespace\foo
定義多個命名空間:
namespace MyProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ }}namespace AnotherProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ }}3,兩者結合使用最佳化代碼
其實原理很簡單,當 “new foo()”的時候,會解析成 currentnamespace\foo,所以在 __autoload做一下更改就可以實現自動載入了。
use Wish\WishClient;function __autoload($classname){ $classname=str_replace(‘\\‘,‘/‘,$classname); require ‘../src/‘.$classname.‘.php‘;}/** * 搜尋所有的 $dir目錄下的檔案,如果存在檔案名稱為 $class_name 的檔案就包含它。 */function requireAll($dir,$class_name){ $d=dir($dir); while(false!==($entry=$d->read())){ if($entry==‘..‘) continue; if($entry==‘.‘) continue; if(is_dir($dir.‘/‘.$entry)){ requireAll($dir.‘/‘.$entry,$class_name); }else{ if($entry==$class_name.‘.php‘){ require_once $dir.‘/‘.$entry; } } } $d->close();}$A=new WishClient(‘‘);
php __autoload函數和命名空間。