亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

Phalcon自動加載(PHP自動加載)

2020-03-22 19:46:28
字體:
來源:轉載
供稿:網友
  • 自動加載(phalconLoader)
    轉載請注明來源

    一、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($html' target='_blank'>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, '<br />';  }  function classLoader($className) {      echo 'SPL load class:', $className, '<br />';  }  spl_autoload_register('classLoader');  new Test();//結果:SPL load class:Test 

    Tip:

    如果在你的程序中已經實現了__autoload()函數,它必須顯式注冊到__autoload()隊列中。因為 spl_autoload_register()函數會將Zend Engine中的__autoload()函數取代為spl_autoload()或spl_autoload_call()。

    相比于__autoload只能夠定義一次。spl_autoload_register()函數可以定義多個autoload函數。因為spl_autoload_register創建了autoload函數隊列,該隊列按照定義的先后順序逐個執行。

     function __autoload($className) {       echo 'autload class:' . $className . '<br />';   }   function classLoader($className) {       echo 'SPL load class:' . $className . '<br />';   }   spl_autoload_register('classLoader');   $demo = new Demo();//結果:SPL load class:Demo

    函數說明
    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的類自動加載

    PhalconLoader 通用類加載器(Universal Class Loader),意在根據協議幫助項目自動加載項目中的類(This component helps to load your project classes automatically based on some conventions)。Phalcon支持四種類加載方式,先后順序分別是注冊類名、注冊命名空間、注冊前綴和注冊文件夾的方式。

    Phalcon的默認文件后綴為php,當然你自己也可以配置(setExtensions())。

    1 . 注冊類名
    <?php$loader = new PhalconLoader();$loader->registerClasses(    array(        'Some'         => 'library/OtherComponent/Other/Some.php',        'ExampleBase' => 'vendor/example/adapters/Example/BaseClass.php',    ));$loader->register();    // i.e. library/OtherComponent/Other/Some.php$some = new Some();
    最快的自動方法 不利于維護

    具體實現:

    判斷是否有類被注冊。 判斷需要加載的類是否被注冊,如果已注冊則加載其對應路徑文件。

    2. 注冊命名空間
    <?php$loader = new PhalconLoader();$loader->registerNamespaces(    array(       'ExampleBase'    => 'vendor/example/base/',       'ExampleAdapter' => 'vendor/example/adapter/',       'Example'         => 'vendor/example/',    ));$loader->register();// vendor/example/adapter/Some.php$some = new ExampleAdapterSome();

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

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

    具體實現:

    判斷是否有命名空間被注冊。

    判斷需要加載的類是否已以注冊的命名開始。

    例如注冊的命名空間為'ExampleBase' => 'vendor/example/base/'

    'ExampleBase'    => 'vendor/example/base/' $test1 = new ExampleBaseTest();// vendor/example/base/Test.php $test2 = new ExampleTest();// 錯誤,無法加載。

    名稱處理:1、去掉命名指定空間前綴。2、將命名空間分隔符轉換成文件分隔符/

    依據文件拓展名構建完整的文件路徑,并判斷該文件是否存在,如該文件存在加載。

    3. 注冊前綴
    <?php$loader = new PhalconLoader();$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將不再支持前綴。

    具體實現:

    判斷是否有前綴被注冊。

    判斷需要加載的類是否已以前綴開始命名。

    例如注冊的前綴為'Example_Base' => 'vendor/example/base/'

    'Example_Base'    => 'vendor/example/base/' $test1 = new Example_Base_Test();// vendor/example/base/Test.php $test2 = new Example_Test();// 錯誤,無法加載。

    名稱處理:1、去掉類的前綴。2、將前綴分隔符_轉換成文件分隔符/

    依據文件拓展名構建完整的文件路徑,并判斷該文件是否存在,如該文件存在加載。

    4. 注冊文件夾
    <?php$loader = new PhalconLoader();    $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將在個文件夾下大量查找與類名相同的文件。在使用注冊目錄自動加載時,要注意注冊目錄的相關性,即將重要的目錄放在前面。

    具體實現:

    將類名中的前綴分隔符_或是命名空間分隔符替換成文件夾分割符/ 判斷是否有文件夾被注冊。

    依據文件后綴構建可能的文件路徑

    例如注冊的前綴為'vendor/example/base/'

     $test = new Test();// vendor/example/base/Test.php

    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 PhalconEventsManager();$loader = new PhalconLoader();$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)自動加載區分大小寫。 命名空間或前綴的方式要比文件夾的方式要快得多。 PHP編程

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
    国产精品com| 成人免费看片视频| 亚洲一区二区福利| 国产精品久久久久91| 亚洲欧美精品中文字幕在线| 久久青草精品视频免费观看| 亚洲人成在线一二| 精品日韩美女的视频高清| 国模精品一区二区三区色天香| 亚洲黄色www网站| 日韩在线视频国产| 欧美电影免费在线观看| 成人午夜黄色影院| 欧美在线观看网址综合| 日韩成人av在线| 午夜精品蜜臀一区二区三区免费| 久久久久中文字幕2018| 欧美日韩第一视频| 国产亚洲一级高清| 国产成人欧美在线观看| 欧美日韩在线免费| 亚洲a成v人在线观看| 亚洲精品美女免费| 欧美裸体xxxx| 久久久久久久色| 成人xxxxx| 成人免费黄色网| 久久免费视频这里只有精品| 精品国偷自产在线视频| 亚洲国产婷婷香蕉久久久久久| 日韩成人在线观看| 欧美性xxxxxxxxx| 亚洲在线观看视频| 午夜精品99久久免费| 成人福利视频网| 国产区精品视频| 亚洲三级黄色在线观看| 久久偷看各类女兵18女厕嘘嘘| 亚洲国产精品久久久久| 中文字幕精品www乱入免费视频| 国产精品久久婷婷六月丁香| 亚洲精品国精品久久99热| 日韩久久免费电影| 狠狠爱在线视频一区| xxav国产精品美女主播| 成人免费淫片视频软件| 亚洲天堂av高清| 午夜精品国产精品大乳美女| 亚洲精品福利免费在线观看| 97在线精品视频| 欧美日韩高清在线观看| 国产成人精品午夜| 日韩影视在线观看| 日韩av综合中文字幕| 91午夜在线播放| 国产精品福利久久久| 91亚洲午夜在线| 亚洲人成毛片在线播放| 欧美黑人一区二区三区| 国产精品香蕉在线观看| 一本色道久久88综合亚洲精品ⅰ| 日韩欧美999| 中文字幕亚洲综合| xvideos成人免费中文版| 成人国产精品一区| 精品视频在线观看日韩| 亚洲午夜女主播在线直播| 国产午夜精品一区理论片飘花| 亚洲免费小视频| 精品国产91久久久久久老师| 欧美成人合集magnet| 成人黄色生活片| 欧美高清激情视频| 中文字幕亚洲一区二区三区五十路| 日韩精品极品在线观看播放免费视频| 久久精品国产一区二区电影| 亚洲电影免费观看高清| 亚洲成人激情图| 国产久一一精品| 91视频国产一区| 精品magnet| 国产主播喷水一区二区| 欧美中文字幕在线观看| 亚洲有声小说3d| 亚洲精品视频在线播放| 亚洲国产女人aaa毛片在线| 久久亚洲精品网站| 1769国产精品| 午夜精品蜜臀一区二区三区免费| 久久精品亚洲热| 97精品国产91久久久久久| 欧美wwwxxxx| 91大神在线播放精品| 日韩电影在线观看免费| 日韩国产欧美精品一区二区三区| 成人做爽爽免费视频| 国产精品自产拍高潮在线观看| 精品国产31久久久久久| 欧美多人爱爱视频网站| 精品国产一区二区在线| 久久久91精品国产一区不卡| 成人春色激情网| 精品久久久久久久久久久久久| 热re99久久精品国产66热| 日韩视频在线一区| 日韩激情在线视频| 在线观看日韩www视频免费| 国产99久久精品一区二区 夜夜躁日日躁| 欧美日韩亚洲精品一区二区三区| 97精品伊人久久久大香线蕉| 国产日韩精品视频| 亚洲精品色婷婷福利天堂| 国产在线观看精品一区二区三区| 国产精品美女www爽爽爽视频| 亚洲一级一级97网| 国产精品扒开腿做爽爽爽男男| 亚洲欧美国产精品专区久久| 色香阁99久久精品久久久| 国产精品久久久久久久久久久久久久| 国产精品av免费在线观看| 久久久久久久久久久91| 国产亚洲精品久久久久动| 日韩久久精品成人| 久久久亚洲天堂| 日韩在线精品视频| 亚洲人成在线免费观看| 欧美激情videoshd| 久久久久久久久电影| 精品亚洲夜色av98在线观看| 欧美日韩国产色| 国产精品永久在线| 日韩女在线观看| 欧美精品九九久久| 国产欧美精品一区二区三区-老狼| 日韩av网站在线| 日本高清视频一区| 亚洲成人在线视频播放| 欧美猛少妇色xxxxx| 俺去啦;欧美日韩| 日韩av中文字幕在线播放| 久久久久久久久久久国产| 国产成人精品电影久久久| 免费91在线视频| 亚洲在线第一页| 国产精品欧美一区二区三区奶水| 亚洲国产精品久久久久秋霞蜜臀| 97精品久久久中文字幕免费| 国产一区二区三区高清在线观看| 久久精品视频99| 亚洲精品v欧美精品v日韩精品| 91理论片午午论夜理片久久| 高清一区二区三区四区五区| 亚洲精品视频免费| 亚洲一区二区三区乱码aⅴ| 91在线观看免费高清完整版在线观看| 国产亚洲欧美日韩精品| 欧美电影免费看| 一本色道久久88综合日韩精品| 精品一区电影国产| 欧美性资源免费| 成人精品一区二区三区电影免费| 亚洲免费视频观看| 精品国产一区二区三区在线观看| 国产亚洲a∨片在线观看|