簡體   English   中英

PHP 引用在 Laravel 宏中不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM