[英]PHP references doesn't work in Laravel macros
嘗試為數組創建一個輔助方法,將鍵替換為給定值而不使用引用返回,但它不起作用。
Arr::macro('replaceKey', function (string $from, string $into, array &$inside) {
if (! array_key_exists($from, $inside)) {
throw new Exception("Undefined offset: $from");
}
$inside[$into] = $inside[$from];
unset($inside[$from]);
});
用特征和簡單的 function 嘗試了同樣的事情,它可以工作。
// inside trait
public function replaceKey(string $from, string $into, array &$inside)
{
if (! array_key_exists($from, $inside)) {
throw new Exception("Undefined offset: $from");
}
$inside[$into] = $inside[$from];
unset($inside[$from]);
}
誰能解釋為什么?
macro
方法的第二個參數是閉包,在這種特殊情況下,是匿名 function。
要通過引用傳遞值,您實際上需要使用use
關鍵字並以這種方式通過引用傳遞值( function (...) use (&$inside)
),但是因為沒有實際變量可以從周圍的 scope 傳遞到這樣做,則無法通過引用傳遞該值。
另一方面,在特征中,您正在創建一個非匿名 function (又名“函數”),它允許在不use
關鍵字的情況下通過引用傳遞值。
你得到 null 因為你沒有從 function 返回任何東西。
public function replaceKey(string $from, string $into, array &$inside)
{
if (! array_key_exists($from, $inside)) {
throw new Exception("Undefined offset: $from");
}
$inside[$into] = $inside[$from];
unset($inside[$from]);
return $inside;
}
還有宏
Arr::macro('replaceKey', function (string $from, string $into, array &$inside) {
if (! array_key_exists($from, $inside)) {
throw new Exception("Undefined offset: $from");
}
$inside[$into] = $inside[$from];
unset($inside[$from]);
return $inside;
});
在調用宏時會調用匿名 function 之前有一個方法調用; __callStatic
被調用。 這需要一個方法名稱和一個傳遞給方法調用的參數數組。
不可能從該方法的方法簽名端__callStatic
聲明參數數組的元素是引用,因為它只接收傳遞給不存在方法replaceKey
的所有 arguments 的數組,如一個論點。
您在匿名 function 中獲得了對傳遞給宏方法調用的數組副本的引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.