簡體   English   中英

PHP運算符 - > {...}是什么意思?

[英]What does PHP operator ->{…} mean?

我最近在PHP代碼中看到了這一行:

$dbObject = json_decode($jsonString);
$dbObject->{'mysql-5.4'}[0]->credentials

這是什么意思? PHP文檔中我們可以閱讀,那

方括號和花括號可以互換使用來訪問數組元素(例如$ array [42]和$ array {42}在上面的例子中都會做同樣的事情)。

但是如何定義Object $ dbObject以允許->{...}[...]訪問? 這段代碼有點不安全嗎? 哪個PHP版本允許這個?

我錯過了PHP文檔中的任何內容嗎?

這是為了能夠訪問屬於無效語法的屬性作為裸文字。 含義:

$dbObject->mysql-5.4[0]->credentials

這是無效/模糊的語法。 為了向PHP明確說明mysql-5.4是一個屬性而不是一個屬性減去一個浮點數,你需要使用{'..'}語法。

確切地說, ->{..}使您可以使用任何表達式作為屬性名稱。 例如:

$dbObject->{ sprintf('%s-%.1f', 'mysql', 5.4) }

示例中的花括號語法不是來自數組語法,而是來自可能的語法來訪問具有變量名稱的變量。

也可以使用卷曲括號來清楚地界定屬性名稱。 當訪問包含數組的屬性中的值,屬性名稱由多個部分組成時,或者屬性名稱包含其他方式無效的字符時(例如,來自json_decode()或SimpleXML),它們最有用。

PHP文檔中的示例:

echo $foo->{$baz[1]} . "\n";
echo $foo->{$start . $end} . "\n";
echo $foo->{$arr[1]} . "\n";

請參閱“PHP變量變量”: http//php.net/manual/en/language.variables.variable.php (有關其用法的更多示例...)

作為@deceze答案的補充:

->運算符表示您正在訪問對象屬性。 在這種情況下,屬性名稱應該是mysql-5.4 ,它不是有效的PHP標識符(它必須包含字母,數字或下划線,請參見此處 )。 因此,它100%確定已動態創建屬性名稱。

PHP允許使用名為__get()魔術方法重載屬性。 此方法的主體允許您處理您希望的任何屬性 - 這可以是任何字符串,或任何變量,甚至是轉換為字符串的對象。

所以在你的情況下,有人創建了一個帶有__get()魔術方法的類,它處理字符串mysql-5.4 花括號{}用於表示該字符串應被視為屬性名稱(但是沒有具有此名稱的屬性)。

大括號語法允許您使用字符串文字或變量作為屬性或方法名稱。

由於以下幾個原因,這很有用:

  1. (根據@ Deceze的回答):它允許您訪問本身不具有有效PHP語法的屬性名稱 - 例如,如果屬性名稱包含點或破折號,則根據您的示例。 通常,這樣的屬性可以通過__get()魔術方法訪問,因為它們也是無效的語法,可以定義為類中的實際屬性。

  2. (按@ feela的答案):它允許您使用變量來引用您的屬性。 這類似於$$變量變量語法。 這通常不是很好的練習,但在某些情況下很有用。

  3. (尚未提及任何其他答案):它允許您從代碼中刪除某些潛在的歧義。 例如,請考慮以下代碼:

     $output = $foo->$bar['baz']; 

    這是模棱兩可的。 您可以通過添加大括號或括號來解決歧義:

     $output = $foo->{$bar['baz']}; //gets the value of a property from $foo which has a name that is defined in $bar['baz'] $output = ($foo->$bar)['baz']; //gets the ['baz'] element of $foo->$bar array. 

    這一點尤為重要,因為即將發布的PHP 7將會改變代碼的默認行為。 這將使語言表現得更加一致,但會破壞沒有大括號的現有代碼。

    另請參閱此更改的PHP文檔: https//wiki.php.net/rfc/uniform_variable_syntax

    但即使沒有語言變化來強迫這個問題,這樣的代碼也應該有大括號來幫助提高可讀性 - 如果你不戴括號,那么你最終可能會努力弄清楚當你來時你想要做什么六個月后回到代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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