看php如何實現facade,php怎麼查看

本文目錄一覽:

php一些簡單功能的實現…高手進來看看

1.可以用地址傳值的方式獲得你的鏈接的值,也可以直接弄一個靜態的

2.用while循環輸出那個div就可以了,

例:

?php

$q=mysql_query(“select * from news”);

while($rs=mysql_fetch_array($q)){ //$rs是一個數組

?

div?php echo $rs[’tilte’];?/div

。。。。。。

?php

}

?

laravel 中facade與查詢構造器有什麼區別馬

facade 的實質是“代理”,讓你通過“代理”更方便地訪問其它類的方法。

文檔:網頁鏈接

而查詢構造器,文檔:網頁鏈接

示例中使用了類似這種格式:

DB::get();

使用了 facade 。

但 facade 只是一種快捷訪問的方法,你也可能通過 new 一個DB類後再調用相應的方法,這也還是查詢構造器。

所以,你問什麼區別?

基本上可以認為完全沒有關係。

如何使用 Laravel Facades

Facade 布局是在面向對象編程中經常使用的一種軟件設計布局方式。Facade 實際上是一種包括複雜函數庫的類,提供了更加簡潔易讀的接口。Facade 布局還能為一組結構複雜、設計簡陋的 API 提供統一、設計周到的 API。

Laravel 框架與該布局的特點相似,也稱為 Facades。在本教程中,我們會學習如何在其他框架應用 Laravel 的 “Facades”。在繼續學習之前,讓我們簡單了解一下 Ioc 容器。

首先,我們了解 Laravel 的 facades 內部工作結構。之後再討論如何將之改造並用於其他環境。

Laravel 中的 Facades

Laravel facade 是一種為容器內部服務提供類似靜態接口的類。據其文檔描述,Facades 是可觸及容器服務底層實現方式的代理。

不過,在 PHP 社區,有關其名稱的爭論一直不斷。一些人堅持修改此名稱以避免開發者的困惑,因為其並未完全實現 Facade 布局。如果你也受此名稱困擾,大可以為其取個別名。但是,請注意,下文將會用到的 Laravel 框架基類(base class)將會稱為 Facade。

How Facades Are implemented in Laravel

Facades 在 Laravel 中如何實現

你可能也知道,容器內的每個服務都有個唯一名稱。在 laravel 應用中,可使用 App::make() 方法或 app() 輔助函數從容器中直接獲取服務。

?php

App::make(‘some_service’)-methodName();

複製代碼

前面已經提過,Laravel 使用 facade 類的好處是讓開發者使用服務時更加便捷。使用 facade 類之後,下面的代碼就能達到相同的效果:

// …

someService::methodName();

// …

複製代碼

在 Laravel 中,所有服務都包含一個 facade 類。這些 facade 類繼承自 Illuminate/Support 包中的 Facade 基類。它們只需實現 getFacadeAccessor 方法即可,後者會返回容器內的服務名。

在上面的示例中,someService 代表 facade 類。methodName 其實是容器內原服務的一個方法。如果跳出 Laravel 的語境查看上面的示例,則表示一個名為 someService 的類引出名為 methodName() 的靜態方法。但 Laravel 並不是這樣實現接口的。在下一節,我們將介紹 Laravel 的 Facade 基類在幕後的運作方式。

Base Facade

Facade 類包含一個名為 $app 的私有屬性,其值為服務容器的引用。如果要在 Laravel 之外使用 facades,必須使容器明確使用 setFacadeApplication() 方法。

在 facade 基類內部,__callStatic 魔術方法用於處理實際並不存在的靜態方法的調用。如果調用 Laravel facade 類的靜態方法, __callStatic 方法便會激活,因為 facade 類並未實現該方法。因此,__callStatic 會從容器獲取各自的服務,進而調用之。

以下是 facade 基類中 __callStatic 方法的實現方式:

?php

// …

/**

* Handle dynamic, static calls to the object.

*

* @param string $method

* @param array $args

* @return mixed

*/

public static function __callStatic($method, $args)

{

$instance = static::getFacadeRoot();

switch (count($args)) {

case 0:

return $instance-$method();

case 1:

return $instance-$method($args[0]);

case 2:

return $instance-$method($args[0], $args[1]);

case 3:

return $instance-$method($args[0], $args[1], $args[2]);

case 4:

return $instance-$method($args[0], $args[1], $args[2], $args[3]);

default:

return call_user_func_array([$instance, $method], $args);

}

}

複製代碼

在上面的方法中,getFacadeRoot() 會從容器獲取服務。

Facade 類解析

每個 facade 類均繼承自基類。我們只需實現 getFacadeAccessor() 方法,該方法用於返回容器中的服務名。

?php namespace App\Facades;

use Illuminate\Support\Facades\Facade as BaseFacade;

class SomeServiceFacade extends BaseFacade {

/**

* Get the registered name of the component.

*

* @return string

*/

protected static function getFacadeAccessor() { return ‘some.service’; }

}

複製代碼

別名

由於 Laravel facades 是 PHP 類,在使用之前我們得導入它們。PHP 支持命名空間與自動導入,因此只要調用全限定名,即可自動載入這些類。PHP 還支持使用 use 指令給類取別名:

use App\Facades\SomeServiceFacade

SomeServiceFacade:SomeMethod();

複製代碼

然而,在需要某個特定的 facade 類時,我們必須在每個腳本文件都寫一遍上面的代碼。Laravel 在處理 facade 別名時有其獨特的方法——別名載入器(alias loader)。

Laravel 如何給 Facades 加別名

所有的別名都保存在 app.php 配置文件的 aliases 數組中,該文件保存在 /config 目錄下。

查看該數組,會發現每個別名都與一個全限定類名對應。這意味着我們可以給 facade 類選定任意的名字。

// ..

‘aliases’ = [

// …

‘FancyName’ = ‘App\Facades\SomeServiceFacade’,

],

複製代碼

現在,讓我們看看 Laravel 如何使用該數組給 facade 類取別名。在引導階段,Laravel 會使用來自 Illuminate\Foundation 包的 AliasLoader 服務。AliasLoader 以該別名數組為參數,遍歷其所有元素,使用 PHP 的 spl_autoload_register 創建一個 __autoload 函數隊列。各個 __autoload 函數會用 PHP 的 class_alias 函數為各個 facade 類創建別名。

因此,我們無需像使用 use 指令時那樣在使用類前導入之並為其創建別名。當我們試圖使用一個不存在的類時,PHP 會檢查 __autoload 隊列以得到合適的 autoloader。這時,AliasLoader 已經記下所有的 __autoload 函數。各個 autoloader 會選定一個類名並根據別名數組推導出對應的初始類名。最後,它會為其創建別名。請參考下面的方法調用:

?php

// FancyName is resolved to App\Facades\SomeServiceFacade according to the aliases array

FancyName::someMethod()

複製代碼

在幕後,FancyName 會對應至 App\Facades\SomeServiceFacade。

在其他框架使用 Facades

現在,我們已經了解 Laravel 如何處理 facades 與別名,我們可以將 Laravel 的 facade 方法運用到其他環境中。接下來,我們會在 Silex 框架使用 facades。然而,只要遵循同樣的理念,你也可以將之用在別的框架。

Silex 擁有繼承自 Pimple 的容器。使用 $app 對象即可調用容器內的服務:

?php

$app[‘some.service’]-someMethod()

複製代碼

有了 facade 類,我們可以為 Silex 服務提供一個類似靜態的接口。此外,我們也可以使用 AliasLoader 服務為這些 facades 創建有意義的別名。因此,我們可以重組上面的代碼:

?php

SomeService::someMethod();

複製代碼

必備條件

為了使用 facade 基類,我們要使用 composer 指令安裝 Illuminate\Support 包:

composer require illuminate\support

此包還包含其他服務。但目前我們只需要 facade 基類。

創建 Facades

只需繼承 Facade 基類並實現 getFacadeAccessor 方法,即可為服務創建 facade。

在本文中,所有 facades 都會保存在 src/Facades 路徑下。例如:名為 some.service 的服務,其 facade 類如下:

?php

namespace App\Facades

use Illuminate\Support\Facades\Facade;

class SomeServiceFacade extends Facade {

/**

* Get the registered name of the component.

*

* @return string

*/

protected static function getFacadeAccessor() { return ‘some.service’; }

}

複製代碼

請注意,此類位於 app\facades 命名空間下。

現在只剩下設定 facade 類的應用容器。如前所述,在靜態語境下調用 facade 類的方法,會觸發 __callStatic 方法。該方法會用 getFacadeAccessor() 返回的數據識別容器內的服務,並試圖獲取之。在 Laravel 之外使用 facade 基類時,容器對象並不是自動設定的,需要手動設定。

為此,使用 facade 基類的 setFacadeApplication 方法,可以設定 facade 類的應用容器。

在 app.php 文件,添加以下代碼:

?php

Illumiante\Support\Facade::setFacadeApplication($app);

複製代碼

這會給繼承自 facade 基類的所有 facades 設定容器。

現在,無需直接從容器獲取服務,我們可以使用剛剛創建的 facade 類來獲取,該類還允許我們調用靜態語境下的所有方法。

實現別名

為了給 facade 類創建別名,我們將使用之前介紹過的 AliasLoader。AliasLoader 類由 illuminate\foundation 包提供,可以下載整個包,也可以拷貝部分代碼保持為文件。

如果你想拷貝源文件,建議將其保存在 src/Facades 目錄下。你可以根據項目的結構為 AliasLoader 類創建命名空間。

在本例中,我們將拷貝代碼並將其保存在 app/facades 命名空間下。

創建別名數組

在 config 目錄下創建 aliases.php 文件,並填入 alias-facade 綁定:

?php

return [

‘FancyName’ = ‘App\Facades\SomeService’,

];

複製代碼

FancyName 是我們給 App\Facades\SomeService 建立的別名。

註冊別名

AliasLoader 是一種單例服務。要創建或得到別名載入器(alias loader)的實例,需調用 getInstance 方法並以別名數組為參數。最後,為了註冊這些別名,需調用其 register 方法。

再次打開 app.php 文件,加入以下代碼:

?php

// …

$aliases = require __DIR__ . ‘/../../config/aliases.php’;

App\Facades\AliasLoader::getInstance($aliases)-register();

複製代碼

現在,大功告成了!我們可以這樣使用該服務:

?php

FancyName::methodName();

複製代碼

進行包裝

一個 Facade 類只需實現 getFacadeAccessor 方法即可,後者會返回容器內的服務名。若要在 Laravel 環境外使用 facade,必須使用 setFacadeApplication() 方法明確設定服務容器。

要引用 facade 類,我們可以使用全限定類名或使用 PHP 的 use 指令導入之。或者,遵循 Laravel 給 facades 創建別名的方法,使用 alias loader。

原文鏈接: (作者:Reza Lavaryan)本文系 OneAPM 工程師編譯整理。

OneAPM for PHP 能夠深入到所有 PHP 應用內部完成應用性能管理 能夠深入到所有 PHP 應用內部完成應用性能管理和監控,包括代碼級別性能問題的可見性、性能瓶頸的快速識別與追溯、真實用戶體驗監控、服務器監控和端到端的應用性能管理。想閱讀更多技術文章,請訪問 OneAPM 官方技術博客。

本文轉自 OneAPM 官方博客

原創文章,作者:IRWF,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/139689.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
IRWF的頭像IRWF
上一篇 2024-10-04 00:22
下一篇 2024-10-04 00:22

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • 如何實現圖像粘貼到蒙版

    本文將從多個方面介紹圖像粘貼到蒙版的實現方法。 一、創建蒙版 首先,在HTML中創建一個蒙版元素,用於接收要粘貼的圖片。 <div id=”mask” style=”widt…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • Django ORM如何實現或的條件查詢

    在我們使用Django進行數據庫操作的時候,查詢條件往往不止一個,一個好的查詢語句需要考慮我們的查詢要求以及業務場景。在實際工作中,我們經常需要使用或的條件進行查詢,本文將詳細介紹…

    編程 2025-04-29
  • Python一次性輸入10個數如何實現?

    Python提供了多種方法進行輸入,可以手動逐個輸入,也可以一次性輸入多個數。在需要輸入大量數據時,一次性輸入十個數就非常方便。下面我們從多個方面來講解如何一次性輸入10個數。 一…

    編程 2025-04-28
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • 如何實現van-picker點擊遮罩不關閉

    van-picker是一個非常實用的Vue組件,但默認情況下,點擊遮罩會自動關閉選擇器。本文將介紹如何通過代碼實現van-picker點擊遮罩不關閉的功能。 一、通過覆蓋遮罩實現 …

    編程 2025-04-27
  • 如何實現矩陣相乘等於E

    本文將介紹如何通過代碼實現兩個矩陣相乘等於單位矩陣E。 一、線性代數基礎 要理解矩陣相乘等於E,需要先了解一些線性代數基礎知識。 首先,矩陣的乘法是滿足結合律的,即(A*B)*C=…

    編程 2025-04-27
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若服務器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27
  • PHP登錄頁面代碼實現

    本文將從多個方面詳細闡述如何使用PHP編寫一個簡單的登錄頁面。 1. PHP登錄頁面基本架構 在PHP登錄頁面中,需要包含HTML表單,用戶在表單中輸入賬號密碼等信息,提交表單後服…

    編程 2025-04-27

發表回復

登錄後才能評論