Phalcon自動載入(PHP自動載入),phalcon載入php_PHP教程

來源:互聯網
上載者:User

Phalcon自動載入(PHP自動載入),phalcon載入php


自動載入(phalcon\Loader)

轉載請註明來源

一、php檔案引入

  通過 include() 或 require() 函數,可以在PHP程式執行之前在該檔案中插入一個檔案的內容。

區別:處理錯誤的方式不同。include() 函數會產生一個警告(但是指令碼會繼續執行),而 require() 函數會產生一個致命錯誤(fatal error)(在錯誤發生後指令碼會停止執行)

  * 正因為在檔案不存在或被重新命名後指令碼不會繼續執行,因此我們推薦使用 require() 而不是 include()。

二、php類自動載入

參考文章:php手冊 和 PHP的類自動載入機制

  在php5之前,各php架構實作類別的載入,一般要按照某種約定實現一個遍曆目錄,自動載入符合約定條件的檔案類或函數。因此在php5之前類的使用並沒有現在頻繁。

  在php5之後,當載入php類的時候,如果類所在檔案夾並沒有被包含進來或是類名出錯時,Zend引擎會自動調用__autoload函數。__autoload函數需要使用者自己實現。

  在php5.1.2版本之後,可以使用spl_autoload_register函數自訂載入處理函數。當沒有調用此函數,預設情況下會使用spl自訂的spl_autoload函數。

1. php自動載入之__autoload

function __autoload($className) {    $file = $className . '.php';    if (is_file($file)) {        require($file);    }else{        echo 'no this ' . $className . ' class file';    }}$demo = new Demo();

事實上,我們可以看到__autoload至少需要做三件事(“三步走”),它們分別是:

在第一步和第二步中,我們必須約定類名與檔案的映射方法,只有這樣我們才能夠依據類名找到其所對應的檔案,實現載入。

因此__autoload自動載入中,最重要的就是指定類名與其所在檔案的對應關係。當有大量的類需要包含進來的時候,我們只需要確立相應的規則,然後將類名與其對應的檔案進行映射,就能夠實現惰性載入(lazy loading)了。

Tip:spl_autoload_register() 提供了一種更加靈活的方式來實作類別的自動載入。因此,不再建議使用 __autoload() 函數,在以後的版本中它可能被棄用。

2. php自動載入之spl_autoload_register

引言:如果在一個php系統實現中,使用了很多的其他類庫,這些類庫可能是由不同的工程師進行開發的,因此類名與其所在檔案的映射規則不盡相同。這時候如果要實作類別庫的自動載入,就必須在__autoload函數中將所有的映射規則全部實現。這就會導致__autoload會非常複雜,甚至無法實現。同時還會使得__autoload函數十分臃腫。為將來系統的維護和效能帶來很大的負面影響。(__autoload的弊端)

spl_autoload_register:

  註冊給定的函數作為__autoload的實現。簡單來說就是將函數註冊之SPL的__autoload函數棧中,並移除系統預設的__autload()函數。

function __autoload($className) {      echo 'autload class:', $className, '
'; } function classLoader($className) { echo 'SPL load class:', $className, '
'; } spl_autoload_register('classLoader'); new Test();//結果:SPL load class:Test

Tip:

函數說明

bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )
  • autoload_function【可選】添加到自動載入棧的函數。預設為spl_autoload()。
    • 還可以調用spl_autoload_register()函數以註冊一個回呼函數,而不是為函數提供一個字串名稱。如提供一個如array('class','method')這樣的數組,使得可以使用某個對象的方法
  • throw【可選】無法成功註冊時,是否拋出異常
  • prepend【可選】是否將將該函數添加到隊列之首,而不是隊列的尾部。

備忘:SPL自動載入功能是由spl_autoload() ,spl_autoload_register(), spl_autoload_functions() ,spl_autoload_extensions()和spl_autoload_call()函數提供的。

三、Phalcon的類自動載入

Phalcon\Loader 通用類載入器(Universal Class Loader),意在根據協議協助項目自動附加元件目中的類(This component helps to load your project classes automatically based on some conventions)。Phalcon支援四種類載入方式,先後順序分別是註冊類名、註冊命名空間、註冊首碼和註冊檔案夾的方式。

Phalcon的預設檔案尾碼為php,當然你自己也可以配置(setExtensions())。

1 . 註冊類名

php$loader = new \Phalcon\Loader();$loader->registerClasses(    array(        "Some"         => "library/OtherComponent/Other/Some.php",        "Example\Base" => "vendor/example/adapters/Example/BaseClass.php",    ));$loader->register();    // i.e. library/OtherComponent/Other/Some.php$some = new Some();

具體實現:

2. 註冊命名空間

php$loader = new \Phalcon\Loader();$loader->registerNamespaces(    array(       "Example\Base"    => "vendor/example/base/",       "Example\Adapter" => "vendor/example/adapter/",       "Example"         => "vendor/example/",    ));$loader->register();// vendor/example/adapter/Some.php$some = new Example\Adapter\Some();

使用命名空間或外部庫組織代碼時,你可以利用註冊命名空間的方式來自動載入其包含的庫。

對於命名空間對應的路徑,要其末尾加一個斜杠。

具體實現:

3. 註冊首碼

php$loader = new \Phalcon\Loader();$loader->registerPrefixes(    array(       "Example_Base"     => "vendor/example/base/",       "Example_Adapter"  => "vendor/example/adapter/",       "Example_"         => "vendor/example/",    ));    $loader->register();    // vendor/example/adapter/Some.php$some = new Example_Adapter_Some();

類似於命名空間,從2.1.0開始phalcon將不再支援首碼。

具體實現:

4. 註冊檔案夾

php$loader = new \Phalcon\Loader();    $loader->registerDirs(    array(        "library/MyComponent/",        "library/OtherComponent/Other/",        "vendor/example/adapters/",        "vendor/example/"    ));    $loader->register();    // i.e. library/OtherComponent/Other/Some.php$some = new Some();

可以自動載入註冊目錄下的類檔案。但是該方法在效能方面並不被推薦,因為Phalcon將在個檔案夾下大量尋找與類名相同的檔案。在使用註冊目錄自動載入時,要注意註冊目錄的相關性,即將重要的目錄放在前面。

具體實現:

5. 修改當前策略(Modifying current strategies)

即為當前自動載入資料添加額外的值。

php// Adding more directories$loader->registerDirs(    array(        "../app/library/",        "../app/plugins/"    ),    true);

註冊時添加第二個參數值true,使其與原數組合并。

6. 安全層(Security Layer)

沒有進行任何安全檢查的自動載入器,如下:

php//Basic autoloaderspl_autoload_register(function($className) {    if (file_exists($className . '.php')) {        require $className . '.php';    }});

假如我們沒有進行任何安全檢查時,如果誤啟了自動載入器,那麼惡意準備的字串就回作為參數訪問程式中的重要檔案。

php//This variable is not filtered and comes from an insecure source$className = '../processes/important-process';//Check if the class exists triggering the auto-loaderif (class_exists($className)) {    //...}

Phalcon的做法是刪除任何無用的字串,減少被攻擊的可能性。

7. 自動載入事件

在下面的例子中,而不必使用類載入器,使我們獲得調試資訊的流程操作:

php$eventsManager = new \Phalcon\Events\Manager();$loader = new \Phalcon\Loader();$loader->registerNamespaces(array(       'Example\\Base' => 'vendor/example/base/',       'Example\\Adapter' => 'vendor/example/adapter/',       'Example' => 'vendor/example/'));//Listen all the loader events$eventsManager->attach('loader', function($event, $loader) {    if ($event->getType() == 'beforeCheckPath') {        echo $loader->getCheckedPath();    }});$loader->setEventsManager($eventsManager);$loader->register();

Phalcon自動載入支援以下事件:

  • beforeCheckClass,自動載入的過程開始前觸發,當返回布爾假可以停止活動動作。
  • pathFound,當一個類裝入器定位觸發
  • afterCheckClass,自動載入的過程完成後觸發。

8. 注意事項(Troubleshooting)

http://www.bkjia.com/PHPjc/1092699.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1092699.htmlTechArticlePhalcon自動載入(PHP自動載入),phalcon載入php 自動載入(phalcon\Loader) 轉載請註明來源 一、php檔案引入 通過 include() 或 require() 函數,可以在PH...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.