php __autoload函數和命名空間。

來源:互聯網
上載者:User

標籤:style   blog   color   io   os   使用   檔案   sp   div   

5.3後就有了命名空間,從別人家哪裡下的API發現很少有包含require,include的代碼,但是卻實現了所有檔案的包含。

文章目錄:
  1.   __autoload提示。
  2.   命名空間介紹和使用。
  3.   兩者結合使用最佳化代碼。

 

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函數和命名空間。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.