成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Laravel 框架中常用的 PHP 語(yǔ)法

khlbat / 1469人閱讀

摘要:更多參考自動(dòng)加載機(jī)制命名空間命名沖突在團(tuán)隊(duì)協(xié)作引入第三方依賴代碼時(shí),往往可能會(huì)出現(xiàn)類函數(shù)和接口重名的情況。多個(gè)有同名函數(shù)時(shí),引入將發(fā)生命名沖突,使用來指明使用哪個(gè)的函數(shù)。

原文:wuYin/blog,轉(zhuǎn)載注明來源即可。

前言

Laravel 框架因?yàn)槠浣M件化的設(shè)計(jì)并恰當(dāng)使用設(shè)計(jì)模式,使得框架本身簡(jiǎn)潔易擴(kuò)展。區(qū)別于 ThinkPHP 那種整合式功能的框架(功能要么全用要么全不用),Laravel 使用 composer 工具進(jìn)行 package 的管理,想加功能直接添加組件即可。比如你寫爬蟲使用頁(yè)面采集組件: composer require jaeger/querylist

本文簡(jiǎn)要介紹 Laravel 中頻繁用到的 PHP 特性與新語(yǔ)法,具體可參考。

組件化開發(fā)

Laravel 進(jìn)行組件化開發(fā),得益于遵循 PSR-4 規(guī)范的 composer 工具,其利用命名空間和自動(dòng)加載來組織項(xiàng)目文件。更多參考:composer 自動(dòng)加載機(jī)制

命名空間 命名沖突

在團(tuán)隊(duì)協(xié)作、引入第三方依賴代碼時(shí),往往可能會(huì)出現(xiàn)類、函數(shù)和接口重名的情況。比如:



因?yàn)橥瑫r(shí)定義了類 User 導(dǎo)致命名沖突:

解決辦法

從 PHP 5.3 開始引入,參考 PHP 手冊(cè) 能知道命名空間有 2 個(gè)作用:避免命名沖突、保持命名簡(jiǎn)短。比如使用命名空間后:

name . PHP_EOL;
    }
}
name . PHP_EOL;
    }
}

/* 保持了命名簡(jiǎn)短 */
// 如果沒有命名空間,為了類名也不沖突,可能會(huì)出現(xiàn)這種函數(shù)名
// $user = new Google_User();
// Zend 風(fēng)格并不提倡
$user = new GUser();

// 為了函數(shù)名也不沖突,可能會(huì)出現(xiàn)這種函數(shù)名
// $user->google_get_name()
$user->getName();

$user = new User();
$user->getName();

運(yùn)行:

$ php demo.php
google
mine
PSR 規(guī)范

其實(shí) namespace 與文件名無關(guān),但按 PSR 標(biāo)準(zhǔn)要求:命名空間與文件路徑一致 & 文件名與類名一致。比如 Laravel 默認(rèn)生成的 laravel-demo/app/Http/Controllers/Auth/LoginController.php,其命名空間為 AppHttpControllersAuth & 類名為 LoginController

遵循規(guī)范,上邊的 mine.phpgoogle.php 都應(yīng)叫 User.php

namespace 操作符與__NAMESPACE__ 魔術(shù)常量
...
// $user = new User();
$user = new namespaceUser();    // 值為當(dāng)前命名空間
$user->getName();

echo __NAMESPACE__ . PHP_EOL;    // 直接獲取當(dāng)前命名空間字符串    // 輸出 Mine
三種命名空間的導(dǎo)入

全局命名空間

如果引用的類、函數(shù)沒有指定命名空間,則會(huì)默認(rèn)在當(dāng)在 __NAMESPACE__下尋找。若要引用全局類:


多重導(dǎo)入與多個(gè)命名空間
// use 可一次導(dǎo)入多個(gè)命名空間
use Google,
    Microsoft;

// 良好實(shí)踐:每行一個(gè) use
use Google;
use Microsoft;

導(dǎo)入常量、函數(shù)

從 PHP 5.6 開始,可使用 use functionuse const 分別導(dǎo)入函數(shù)和常量使用:

# google.php
const CEO = "Sundar Pichai";
function getMarketValue() {
    echo "770 billion dollars" . PHP_EOL;
}
# mine.php
use function GooglegetMarketValue as thirdMarketValue;
use const GoogleCEO as third_CEO;

thirdMarketValue();
echo third_CEO;

運(yùn)行:

$ php mine.php
google
770 billion dollars
Sundar Pichaimine
Mine
文件包含 手動(dòng)加載

使用 includerequire 引入指定的文件,(字面理解)需注意 require 出錯(cuò)會(huì)報(bào)編譯錯(cuò)誤中斷腳本運(yùn)行,而 include 出錯(cuò)只會(huì)報(bào) warning 腳本繼續(xù)運(yùn)行。

include 文件時(shí),會(huì)先去 php.ini 中配置項(xiàng) include_path 指定的目錄找,找不到才在當(dāng)前目錄下找:


自動(dòng)加載

void?__autoload(string?$class?) 能進(jìn)行類的自動(dòng)加載,但一般都使用 spl_autoload_register 手動(dòng)進(jìn)行注冊(cè):


在 composer 生成的自動(dòng)加載文件 laravel-demo/vendor/composer/autoload_real.php 中可看到:

class ComposerAutoloaderInit8b41a
{
    private static $loader;

    public static function loadClassLoader($class)
    {
        if ("ComposerAutoloadClassLoader" === $class) {
            // 加載當(dāng)前目錄下文件
            require __DIR__ . "/ClassLoader.php";
        }
    }
    
     public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }
    
        // 注冊(cè)自己的加載器
        spl_autoload_register(array("ComposerAutoloaderInit8b41a6", "loadClassLoader"), true, true);
        self::$loader = $loader = new ComposerAutoloadClassLoader();
        spl_autoload_unregister(array("ComposerAutoloaderInit8b41a6a", "loadClassLoader"));

        ...
     }
 
    ...
}    

這里只提一下,具體 Laravel 整體是怎么做自動(dòng)加載的,后邊的文章會(huì)細(xì)說。

反射

參考 PHP 手冊(cè),可簡(jiǎn)單的理解為在運(yùn)行時(shí)獲取對(duì)象的完整信息。反射有 5 個(gè)類:

ReflectionClass     // 解析類名
ReflectionProperty     // 獲取和設(shè)置類屬性的信息(屬性名和值、注釋、訪問權(quán)限)
ReflectionMethod     // 獲取和設(shè)置類函數(shù)的信息(函數(shù)名、注釋、訪問權(quán)限)、執(zhí)行函數(shù)等
ReflectionParameter    // 獲取函數(shù)的參數(shù)信息
ReflectionFunction    // 獲取函數(shù)信息

比如 ReflectionClass 的使用:

name = $name;
        $this->age  = $age;
    }

    public function intro() {
        echo "[name]: " . $this->name . PHP_EOL;
        echo "[age]: "  . $this->age  . PHP_EOL;
    }
}

reflect("User");

// ReflectionClass 反射類使用示例
function reflect($class) {
    try {
        $ref = new ReflectionClass($class);
        // 檢查是否可實(shí)例化
        // interface、abstract class、 __construct() 為 private 的類均不可實(shí)例化
        if (!$ref->isInstantiable()) {
            echo "[can"t instantiable]: ${class}
";
        }

        // 輸出屬性列表
        // 還能獲取方法列表、靜態(tài)常量等信息,具體參考手冊(cè)
        foreach ($ref->getProperties() as $attr) {
            echo $attr->getName() . PHP_EOL;
        }

        // 直接調(diào)用類中的方法,個(gè)人認(rèn)為這是反射最好用的地方
        $obj = $ref->newInstanceArgs();
        $obj->intro();
    } catch (ReflectionException $e) {
            // try catch 機(jī)制真的不優(yōu)雅
            // 相比之下 Golang 的錯(cuò)誤處理雖然繁瑣,但很簡(jiǎn)潔
        echo "[reflection exception: ]" . $e->getMessage();
    }
}

運(yùn)行:

$ php reflect.php
name
age
[name]: Laruence
[age]: 35

其余 4 個(gè)反射類參考手冊(cè) demo 即可。

后期靜態(tài)綁定

參考 PHP 手冊(cè),先看一個(gè)例子:


輸出:

$ php late_static_bind.php
[called]: Base
[called]: Child

在對(duì)象實(shí)例化時(shí),self:: 會(huì)實(shí)例化根據(jù)定義所在的類,static:: 會(huì)實(shí)例化調(diào)用它的類。

trait 基本使用

參考 PHP 手冊(cè),PHP 雖然是單繼承的,但從 5.4 后可通過 trait 水平組合“類”,來實(shí)現(xiàn)“類”的多重繼承,其實(shí)就是把重復(fù)的函數(shù)拆分成 triat 放到不同的文件中,通過 use 關(guān)鍵字按需引入、組合??深惐?Golang 的 struct 填鴨式組合來實(shí)現(xiàn)繼承。比如:

logger = $logger;
    }

    public function log($message, $level) {
        $this->logger->log($message, $level);
    }
}

class Foo
{
        // 直接引入 Loggable 的代碼片段
    use Loggable;
}

$foo = new Foo;
$foo->setLogger(new DemoLogger);
$foo->log("trait works", 1);

運(yùn)行:

$ php trait.php
[message]: trait works
[level]: 1

更多參考:我所理解的 PHP Trait

重要性質(zhì) 優(yōu)先級(jí)

當(dāng)前類的函數(shù)會(huì)覆蓋 trait 的同名函數(shù),trait 會(huì)覆蓋父類的同名函數(shù)( use trait 相當(dāng)于當(dāng)前類直接覆寫了父類的同名函數(shù))

trait 函數(shù)沖突

同時(shí)引入多個(gè) trait 可用 , 隔開,即多重繼承。

多個(gè) trait 有同名函數(shù)時(shí),引入將發(fā)生命名沖突,使用 insteadof 來指明使用哪個(gè) trait 的函數(shù)。

重命名與訪問控制

使用 as 關(guān)鍵字可以重命名的 trait 中引入的函數(shù),還可以修改其訪問權(quán)限。

其他

trait 類似于類,可以定義屬性、方法、抽象方法、靜態(tài)方法和靜態(tài)屬性。

下邊的蘋果、微軟和 Linux 的小栗子來說明:

getMarketValue();

// trait 中可以定義靜態(tài)方法
$linux::staticFunc();

// 在 trait Top 中已解決過沖突,輸出庫(kù)克
$linux->getCEO();
// $linux->noCEO();        // Uncaught Error: Call to private method Linux::noCEO() 

// trait 中可以定義靜態(tài)變量
$linux->staticValue();
$linux->staticValue();

運(yùn)行:

$ php trait.php
[Linux Market Value]: Infinity
[MicroSoft Static Function]
[Apple CEO]: Tim Cook
[MicroSoft Static Value]: 1
[MicroSoft Static Value]: 2
總結(jié)

本節(jié)簡(jiǎn)要提及了命名空間、文件自動(dòng)加載、反射機(jī)制與 trait 等,Laravel 正是恰如其分的利用了這些新特性,才實(shí)現(xiàn)了組件化開發(fā)、服務(wù)加載等優(yōu)雅的特性。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28778.html

相關(guān)文章

  • LaravelLaravel 框架關(guān)鍵技術(shù)解析·讀書筆記(一)

    摘要:判斷是否存在構(gòu)造函數(shù),不存在直接實(shí)例化,存在則通過來獲取輸入函數(shù),并有相應(yīng)的方法解決依賴參數(shù)問題,實(shí)現(xiàn)依賴注入。 Laravel 框架關(guān)鍵技術(shù)解析·讀書筆記(一) 第一章 入口文件 請(qǐng)求訪問的入口文件,主要完成幾部分工作,分別是: 自動(dòng)加載函數(shù)的添加 服務(wù)器實(shí)例化與服務(wù)注冊(cè) 路由加載 請(qǐng)求實(shí)例化與路由分發(fā) 相應(yīng)生成與發(fā)送 其中,自動(dòng)加載函數(shù)用于包含引用文件,改文件是composer...

    CocoaChina 評(píng)論0 收藏0
  • windows下laravel5.5手寫教程2路由Eloquent ORM操作(適合初學(xué)者)

    摘要:一路由目錄眾所周知,對(duì)于我們熟知的任何一款框架,例如路由系統(tǒng)都是極其重要的存在。文件用于定義界面的路由。定義在中的路由都是無狀態(tài)的,并且被分配了中間件組。生成的控制器為每個(gè)行為保留了方法,同時(shí)還包括了處理動(dòng)作和的聲明注釋。 一、路由目錄 眾所周知,對(duì)于我們熟知的任何一款PHP框架,例如TP、CI、YII、路由系統(tǒng)都是極其重要的存在。 對(duì)于laravel框架也一樣,對(duì)于數(shù)據(jù)庫(kù)的操作,無非...

    BlackFlagBin 評(píng)論0 收藏0
  • Java后端學(xué)習(xí),你應(yīng)該看那些書籍?

    摘要:全書分三大部分共章第章介紹的基礎(chǔ)知識(shí)安裝和基本語(yǔ)法第章介紹的基本編程機(jī)器學(xué)習(xí)基礎(chǔ)及中常用的第三方庫(kù)函數(shù),并介紹數(shù)據(jù)預(yù)處理的基本方法第章分別介紹常用的機(jī)器學(xué)習(xí)分析算法及深度學(xué)習(xí)等。每章都采用多個(gè)經(jīng)典案例圖文并茂地介紹機(jī)器學(xué)習(xí)的原理和實(shí)現(xiàn)方法。 最近在學(xué)習(xí)Java和全棧開發(fā),推薦一些有用的書籍 書架主要針對(duì)Java后端和全棧開發(fā)用的 書籍介紹 《Spring Boot 2.0企業(yè)級(jí)應(yīng)用開發(fā)...

    QiuyueZhong 評(píng)論0 收藏0
  • Java后端學(xué)習(xí),你應(yīng)該看那些書籍?

    摘要:全書分三大部分共章第章介紹的基礎(chǔ)知識(shí)安裝和基本語(yǔ)法第章介紹的基本編程機(jī)器學(xué)習(xí)基礎(chǔ)及中常用的第三方庫(kù)函數(shù),并介紹數(shù)據(jù)預(yù)處理的基本方法第章分別介紹常用的機(jī)器學(xué)習(xí)分析算法及深度學(xué)習(xí)等。每章都采用多個(gè)經(jīng)典案例圖文并茂地介紹機(jī)器學(xué)習(xí)的原理和實(shí)現(xiàn)方法。 最近在學(xué)習(xí)Java和全棧開發(fā),推薦一些有用的書籍 書架主要針對(duì)Java后端和全棧開發(fā)用的 書籍介紹 《Spring Boot 2.0企業(yè)級(jí)應(yīng)用開發(fā)...

    FreeZinG 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<