久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

PHP自動(dòng)加載學(xué)習(xí)記錄

 Fengsq501u81r4 2021-06-29

1. 什么是自動(dòng)加載,?

自動(dòng)加載就是在實(shí)例化類的時(shí)候,,PHP自動(dòng)幫我們把需要用到的文件給require進(jìn)來,不需要我們手動(dòng)一個(gè)一個(gè)去require,;
自動(dòng)加載可以說是現(xiàn)代PHP框架的核心基礎(chǔ),就像地基一樣,,像Laravel,thinkphp,yii2等框架都是基于自動(dòng)加載實(shí)現(xiàn)的文件自動(dòng)載入,。

2. 如何實(shí)現(xiàn)?

1. __autoload()方法實(shí)現(xiàn)自動(dòng)加載
index.php

<?phpfunction __autoload($classname){ require $className . '.php';}$test = new Test();//在index.php同級(jí)目錄下加載Test.php文件

小項(xiàng)目這樣做當(dāng)然沒問題,,但是項(xiàng)目變大了之后就無法滿足需求了,,比如需要加載多個(gè)不同目錄的文件__autoload就無法實(shí)現(xiàn)了,因?yàn)橐粋€(gè)項(xiàng)目只能有一個(gè)__autoload,不能申明多個(gè),。那怎么解決呢,?就是下面的spl_autoload_register了。

2. spl_autoload_register方法實(shí)現(xiàn)自動(dòng)加載
spl_autoload_register就是設(shè)計(jì)用來取代__autoload的,,可以多次調(diào)用注冊(cè),,使用方法如下:

<?php//多種形式sql_autoload_resister('load_function'); //函數(shù)名sql_autoload_resister(array('load_object', 'load_function')); //類和靜態(tài)方法sql_autoload_resister('load_object::load_function'); //類和方法的靜態(tài)調(diào)用//php 5.3之后,也可以像這樣支持匿名函數(shù)了,。spl_autoload_register(function($className){    if (is_file('./lib/' . $className . '.php')) {        require './lib/' . $className . '.php';    }});

需要注意的是,,當(dāng)項(xiàng)目中同時(shí)存在spl_autoload_register__autoload時(shí),__autoload會(huì)失效,想要同時(shí)工作,,只能把__autoload作為函數(shù)注冊(cè)到spl_autoload_register中,。
多個(gè)spl_autoload_register注冊(cè)后,調(diào)用的順序是按照注冊(cè)的順序執(zhí)行,,直到找到可以加載的文件為止,。

function load1($className){ echo 1; if (is_file($className . '.php')) { require $className . '.php'; }}function load2($className){ echo 2; if (is_file('./app/' . $className . '.php')) { require './app/' . $className . '.php'; }}function __autoload($className){ echo 3; if (is_file('./lib/' . $className . '.php')) { require './lib/' . $className . '.php'; }}//注冊(cè)了3個(gè)spl_autoload_register('load1');spl_autoload_register('load2');spl_autoload_register('__autoload'); $config= new Config(); //Config就在本目錄下$test= new Test(); //Test在/app/Test.php//打印結(jié)果//1Hello DB//123Hello Info

當(dāng)我們想知道項(xiàng)目中注冊(cè)了多少自動(dòng)加載函數(shù)的時(shí)候,可以使用spl_autoload_functions函數(shù)

var_dump(spl_autoload_functions());//數(shù)組的形式輸出array (size=3)  0 => string 'load1' (length=5)  1 => string 'load2' (length=5)  2 => string '__autoload' (length=10)

3. spl_autoload_register namespace實(shí)現(xiàn)文件規(guī)范化自動(dòng)加載
根據(jù)PSR-0規(guī)范,,namespace的命名就可以很方便的直接找到對(duì)應(yīng)文件,,而自動(dòng)加載方法的類名是包含namespace的名稱的,因此可以直接加載
index.php

<?php//定義當(dāng)前的目錄絕對(duì)路徑define('DIR', dirname(__FILE__));//加載這個(gè)文件require DIR . './Loading.php';//采用`命名空間`的方式注冊(cè),。php 5.3 加入的//也必須是得是static靜態(tài)方法調(diào)用,,然后就像加載namespace的方式調(diào)用,注意:不能使用usespl_autoload_register('\\App\\Loading::autoload');//Loading文件使用了namespace這里也就只能使用全路徑調(diào)用// 調(diào)用三個(gè)namespace類//定位到Lib目錄下的Name.phpuse Lib\Name;Name::test();//定位到App目錄下Android目錄下的Name.phpAndroid\Name::test();//定位到App目錄下Ios目錄下的Name.php\Ios\Name::test();

Loading.php

<?phpnamespace App;class Loading{    public static function autoload($className)    {        //根據(jù)PSR-O的第4點(diǎn) 把 \ 轉(zhuǎn)換層(目錄風(fēng)格符) DIRECTORY_SEPARATOR ,        //便于兼容Linux文件找,。Windows 下(/ 和 \)是通用的        //由于namspace 很規(guī)格,,所以直接很快就能找到        $fileName = str_replace('\\', DIRECTORY_SEPARATOR, DIR . '\\' . $className) . '.php';        if (is_file($fileName)) {            require $fileName;        } else {            echo $fileName . ' is not exist';            die;        }    }}

Android/Name.php

<?phpnamespace Android;class Name{ public static function test(){ echo __NAMESPACE__.' name'.PHP_EOL; }}

Ios/Name.php

<?phpnamespace Ios;class Name{    public static function test(){        echo __NAMESPACE__.' name'.PHP_EOL;    }}

Lib/Name.php

<?phpnamespace Lib;class Name{ public static function test(){ echo __NAMESPACE__.' name'.PHP_EOL; }}

輸出:

Lib nameAndroid nameIos name

4. 同根命名空間下的相互調(diào)用
在同一命名空間下相互調(diào)用可能會(huì)存在意想不到的問題,假如在Lib/Name.php想調(diào)用Lib/Driver/Config.php

new Lib\Driver\Config();//報(bào)錯(cuò)C:\Users\53101\Desktop\study\php\autoload_study\Lib\Lib\Driver\Config.php is not exist

這種命名空間的調(diào)用實(shí)際上是一個(gè)相對(duì)路徑,,當(dāng)前已經(jīng)在Lib命名空間下了,,所以不需要再重復(fù)調(diào)用Lib命名空間,正確的做法是:

//同級(jí)別調(diào)用new Config();//下一級(jí)別目錄調(diào)用new Driver\Config();//或者使用use關(guān)鍵字,,use引入的namespace是絕對(duì)路徑use Lib\Driver\Config;new Config();//也可以直接寫絕對(duì)路徑命名空間調(diào)用new \Lib\Driver\Config();//在Lib前加\即調(diào)用絕對(duì)路徑

如果反過來在Lib/Driver/Config.php中想調(diào)用Lib/Name.php就只能使用絕對(duì)路徑引用的方式,因?yàn)橄鄬?duì)路徑已經(jīng)到了下級(jí)目錄Lib/Driver,,無法找到上級(jí)目錄Lib的文件。

//use絕對(duì)路徑use Lib\Name;Name::test();//直接絕對(duì)路徑調(diào)用\Lib\Name::test();

總結(jié):

實(shí)現(xiàn)自動(dòng)加載有兩種方式

  1. __autolaod函數(shù)
  2. spl_autoload_register函數(shù)注冊(cè)

實(shí)際使用時(shí)是配合namespace使用的,,因?yàn)镻SR-0規(guī)范可以方便地找到需要加載的文件,,命名空間在調(diào)用時(shí)實(shí)際上就已經(jīng)把路徑寫出來了,,只需要把對(duì)應(yīng)class加載進(jìn)來就可以了。
同根命名空間下相互調(diào)用要注意可能出現(xiàn)的問題,。
實(shí)際使用時(shí)盡量使用use關(guān)鍵字加載,,或者絕對(duì)路徑加載

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多