php常用函數大全「php匿名函數幹什麼用」

在之前的文章中,我們已經學習過匿名函數的使用,沒有看過的小夥伴可以進入傳送門先去了解下閉包匿名函數的用法,傳送:還不知道PHP有閉包?那你真OUT了。

關於閉包匿名函數,在JS中有個很典型的問題就是要給它綁定一個 this 作用域。其實這個問題在PHP中也是存在的,比如下面這段代碼:

$func = function($say){
    echo $this->name, ':', $say, PHP_EOL;
};
$func('good'); // Fatal error: Uncaught Error: Using $this when not in object context 

在這個匿名函數中,我們使用了 \$this->name 來獲取當前作用域下的 $name 屬性,可是,這個 $this 是誰呢?我們並沒有定義它,所以這裡會直接報錯。錯誤信息是:使用了 $this 但是沒有對象上下文,也就是說沒有指定 $this 引用的作用域。

bindTo() 方法綁定 $this

好吧,那麼我們就給它一個作用域,和 JS 一樣,使用一個 bindTo() 方法即可。

$func1 = $func->bindTo($lily, 'Lily');
// $func1 = $func->bindTo($lily, Lily::class);
// $func1 = $func->bindTo($lily, $lily);
$func1('cool');

這回就可以正常輸出了。 bindTo() 方法是複製一個當前的閉包對象,然後給它綁定 $this 作用域和類作用域。其中, $lily 參數是一個 object $newthis 參數,也就是給這個複製出來的匿名函數指定 $this 。而第二個參數 ‘Lily’ 則是綁定一個新的 類作用域 ,它代表一個類型、決定在這個匿名函數中能夠調用哪些 私有 和 受保護 的方法,上例中給出的三種方式都可以用來定義這個參數。如果不給這個參數,那麼我們就不能訪問這個 private 的 $name 屬性了:

$func2 = $func->bindTo($lily);
$func2('cool2'); // Fatal error: Uncaught Error: Cannot access private property Lily::$name

call() 方法綁定 $this

在PHP7以後,PHP新增加了 call() 方法來進行匿名函數的 $this 綁定,我們來看看它和 bindTo() 方法有哪些區別。

$func->call($lily, 'well'); // Lily:well

額……

是不是感覺方便好多。首先,它直接執行了,不需要再賦值給一個變量,也就是說,它不是去複製那個閉包函數的而是直接執行了;其次,沒有 類作用域 這個概念了,第一個參數還是指定新的 $this 的指向,而後面的參數就是原來閉包函數的參數。

雖然很方便,但是它也帶來了另一個問題,因為沒有 類作用域 的限制,所以會破壞封裝。你好不容易做好的面向對象的設計,封裝了一堆屬性,然後使用這個 call() 就讓對象的所有 私有 和 受保護 內容都暴露了出來。當然,這也是看我們自己的業務情況了,畢竟兩種形式我們在寫代碼的時候都是可以自由選擇的。

總結

其實包括閉包函數在內,這些特性都非常像JS。這也是語言融合的一種趨勢,不管是學習了JS來看PHP的這些特性還是先學了PHP再去看JS,都會讓我們更容易理解它們的作用與能力,這就是語言特性融合帶來的好處。不管怎麼樣,學就是了,繼續加油吧!!

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/234668.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-11 20:13
下一篇 2024-12-12 11:49

相關推薦

發表回復

登錄後才能評論