国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Home php教程 PHP源碼 What you don't know about PHP - automatic loading

What you don't know about PHP - automatic loading

Nov 11, 2016 am 11:18 AM

前言



很多的小伙伴在,學(xué)習(xí) PHP 的時(shí)候最早面對(duì)的問題之一就是 require 、 include 和 require_once 、include_once 的相愛相殺。

在了解了它們相愛相殺的故事后,往往就開始使用起了框架。框架固然是干活的好工具,但是你知道你平時(shí) new 一個(gè)新類的時(shí)候,發(fā)生了什么嗎?有想過為什么我們 遵循規(guī)范 就會(huì)自動(dòng)的幫我們做好一切的加載嗎? 讓我們一切來探索發(fā)現(xiàn)其中的奧秘。

時(shí)間線



蒸汽時(shí)代

在 PHP 代碼的頂部你是不是經(jīng)??吹竭@樣的代碼。

require 'lionis.php';require 'is.php';require 'cool.php';

如果只是引入幾個(gè) PHP 腳本,那還可以接受。那引入成千上萬個(gè)腳本的時(shí)候,爆炸是在所難免的。如果對(duì)一個(gè)腳本改了個(gè)名字,還需要對(duì)引入改腳本的每個(gè)腳本改名,能不爆炸嗎?連打出這段話都怎么繞。

電氣時(shí)代

在 PHP 電氣時(shí)代,開始出現(xiàn)了 __autoload 和 spl_autoload_register 函數(shù)注冊(cè)自定義的自動(dòng)加載策略。

通俗的來說,__autoload 和 spl_autoload_register 是一個(gè) 殺手組織,他們會(huì)去雇傭 各國(guó)殺手 (函數(shù))。當(dāng)我們想搞定某個(gè)人的時(shí)候(new),只需要提供名字(類名),剩下的 殺手 會(huì)幫我們搞定的。

__autoload

PHP 5 開始提供這個(gè)函數(shù) 傳送門。當(dāng)你使用的 類 找不到的時(shí)候,它把類名當(dāng)成參數(shù)扔進(jìn)這個(gè)函數(shù)。

<?php
// Lionis.php
class Lionis {    
public function __construct() 
{        
echo &#39;歐耶耶, 我就是 Lionis&#39;;
    }
}
<?php
// index.php
function __autoload($classname) {    
$filename = &#39;./&#39; . $classname . &#39;.php&#39;;    
require_once $filename;
}
$lionis = new Lionis();

輸出

歐耶耶, 我就是 Lionis


spl_autoload_register

如果我們 項(xiàng)目 很大很老又或者你是一個(gè) 愛折騰 的少先隊(duì)員,需要引入的東西有不一樣的規(guī)范,這時(shí)候如果都放在 __autoload 函數(shù)里,這個(gè)函數(shù)馬上就會(huì)膨脹的。而且 __autoload 是全局唯一的,如果被人占用了,可能會(huì)導(dǎo)致錯(cuò)誤。(欲使一個(gè)人滅亡,必將先使其膨脹。)

PHP 5.1.2 開始提供這個(gè)函數(shù) 傳送門,注冊(cè)給定的函數(shù)作為 __autoload 的實(shí)現(xiàn)。所以,我們看一些框架或插件在自己使用的時(shí)候,為了兼容可能會(huì)出現(xiàn) function_exists(spl_autoload_register)。

<?php
function lionisIsCoolFind($classname) {
    require &#39;./&#39; . $classname . &#39;.php&#39;;
}

// 函數(shù)
spl_autoload_register(&#39;lionisIsCoolFind&#39;);

// 匿名函數(shù)
spl_autoload_register(function($require) {
    require &#39;./&#39; . $classname . &#39;.php&#39;;
});

// 類中的函數(shù)
spl_autoload_register(array(&#39;Lionis&#39;, &#39;loadClass&#39;));


歐耶,這下我們可以寫很多不同的自動(dòng)加載函數(shù)了。

信息時(shí)代

師傅小心,前面有妖氣! 。如果我們每個(gè)人都自己實(shí)現(xiàn)一套自動(dòng)加載的方法,每個(gè)PHP 組件和 框架都使用獨(dú)特的自動(dòng)加載器,而且每個(gè)框架使用不同的邏輯加載PHP類、接口和性狀。

那當(dāng)我們使用一些第三方框架的時(shí)候,還需要去弄清楚引導(dǎo)文件中的 自動(dòng)加載器,那樣是有多和 時(shí)間 過不去呢。 PHP-FIG 認(rèn)識(shí)到了這個(gè)問題了,推薦使用 PSR-4 規(guī)范,來促進(jìn)組件之間的 互操作性,這樣我們就可以使用一個(gè)自動(dòng)加載器了。

PSR-4 規(guī)范

利用命名空間的前綴和文件系統(tǒng)中的目錄對(duì)應(yīng)起來。

映射關(guān)系為

namespace    => filePath
\Lionis\Cool => cool

帶有命名空間的類

<?php 
// 該文件為 cool/Real.php
namespace \Lionis\Cool;

class Real {
}


創(chuàng)建一個(gè)對(duì)象

<?php
// 該文件為 index.php

$lionis = new \Lionis\Cool\Real;


這個(gè)時(shí)候,按照 PSR-4 的規(guī)范,自動(dòng)加載器應(yīng)該去加載 cool/ 目錄下的 Real.php。

不對(duì)!那這樣不是還要自己去實(shí)現(xiàn) 自動(dòng)加載器 嘛,不然怎么 無中生有 出現(xiàn) 自動(dòng)加載器 呢?難道官方 內(nèi)置 了?

你 out 了吧,我們可以使用依賴管理器 composer 來生成 PSR-4 自動(dòng)加載器。你可能會(huì)疑問,那我的舊項(xiàng)目沒有遵循 PSR-4 規(guī)范怎么辦?嘿嘿,讓我們來探索發(fā)現(xiàn)一下 composer 是怎么解決這個(gè)問題的吧。

Composer



哦吼吼,我們這次的重點(diǎn)在與探究自動(dòng)加載,所以 composer 的安裝和使用等,就不去討論了。

composer 自動(dòng)加載設(shè)置了 4種 加載方式:

  • PSR-0

  • PSR-4

  • classmap

  • files

PSR-0



要求命名空間和目錄層層對(duì)應(yīng),且可以使用 _ 作為路徑分隔符,但是這會(huì)導(dǎo)致目錄結(jié)果變得過深。

在 composer 執(zhí)行 install 等操作時(shí),composer 會(huì)把文件中的配置存儲(chǔ)在 vendor/composer/autoload_psr0.php文件中的返回?cái)?shù)組中。

例如:定義了Very\Good=>vendor\Lionis\IsReal\Cool,在調(diào)用 use Very\Good\Love\SomeClass,PSR-0 加載的實(shí)際目錄為 vendor/Lionis/IsReal/Cool/Very/Good/Love/SomeClass.php。

對(duì)吧,這簡(jiǎn)直深得嚇人,所以 PSR-0 被官方廢除了。但是一些主流的框架已經(jīng)實(shí)現(xiàn)了 PSR-0,為了向下兼容還是要實(shí)現(xiàn) PSR-0。

composer.json配置:

"autoload": {
    "psr-0": {
        "Very\\Good": "vendor\Lionis\IsReal\Cool"
    }
}

PSR-4



PSR-4 是現(xiàn)在比較推薦的方法,用于替代 PSR-0。
與 PSR-0 不同的是,取消掉了 _ 作為分隔符和目錄結(jié)構(gòu)。

在 composer 執(zhí)行 install 等操作時(shí),composer 會(huì)把文件中的配置存儲(chǔ)在 vendor/composer/autoload_psr4.php文件中的返回?cái)?shù)組中。

例如:定義了Very\Good=>vendor\Lionis\IsReal\Cool,在調(diào)用 use Very\Good\
Love\SomeClass,PSR-4 加載的實(shí)際目錄為 vendor/Lionis/IsReal/Cool/Love/SomeClass.php。

composer.json配置:

"autoload": {    "psr-4": {        "Very\\Good": "vendor\Lionis\IsReal\Cool"
    }
}

classmap

classmap 通過配置指定的目錄和文件,在 composer 執(zhí)行 install 等操作時(shí),composer 會(huì)去掃描對(duì)應(yīng)的目錄下以.php結(jié)尾的文件中的 class,并存儲(chǔ)在 vendor/composer/autoload_classmap.php文件中的返回?cái)?shù)組中。

composer.json配置:

"autoload": {
    "classmap": [
        "Lionis/",
        "Xiaoer/" 
    ]
}


如果 Lionis 下有一個(gè)叫 VeryCool的文件,那么在vendor/composer/autoload_classmap.php 中會(huì)生成。

 $baseDir . &#39;/Lionis/VeryCool.php&#39;,
    // 其他的映射
);


files

files 就是直接簡(jiǎn)單粗暴的加載文件。在 composer 執(zhí)行 install 等操作時(shí),composer 會(huì)把文件中的配置存儲(chǔ)在 vendor/composer/autoload_static.php文件中的生成一個(gè) $files 數(shù)組。

composer.json 配置:

"autoload": {   
 "files": ["Lionis/Very/Cool.php"]
}

小結(jié)

composer 通過使用 composer.json,用 json 的格式來指定我們需要自動(dòng)加載規(guī)則。我們只要在入口文件引入 vendor/autoload.php 就能很方便的便能使用 自動(dòng)加載。

如果你對(duì) composer 實(shí)現(xiàn) 自動(dòng)加載 的原理感興趣,可以順著 vendor 中的 autoload.php 去看看源碼。

總結(jié)

石器時(shí)代 信息時(shí)代,PHP 經(jīng)歷了很多試驗(yàn)和改變后正在變得越來越好。當(dāng)然,許多優(yōu)秀的框架讓我們開發(fā)速度更快,需要理解的一些知識(shí)點(diǎn)也隨之被隱藏起來,讓我們更加專注于實(shí)現(xiàn)邏輯。但是,我們有的時(shí)候還是要嘗試的去理解他們工作的原理,來提升我們自己。像我老師說過的,所不定一下子踩到狗屎運(yùn)了呢。

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)