簡體   English   中英

為什么$ {0x0}正確?

[英]Why is ${0x0} correct?

以下代碼完美運行:

${0x0} = 'test';
echo ${0x0}; // prints "test"

但我無法弄清楚為什么。 0x0 (或0 ,非十六進制人稱之為)是一個隨機容器,它可能是任何數字,但php變量不能以數字開頭。 這里使用的{ }什么特別之處,它們的局限性是什么?

首先, 0x0只是十六進制表示中的常規0 ,當與變量變量語法一起使用時會被轉換為字符串'0 ':

var_dump(0x0===0); // prints "bool(true)"

${0x0} = 'test';
echo ${0x0}; // prints "test"
echo ${'0'}; // prints "test" as well
var_dump(get_defined_vars()); // contains ["0"] => string(4) "test"

你說它不是一個有效的變量名稱 ,你是對的:

變量名稱遵循與PHP中其他標簽相同的規則。 有效的變量名稱以字母或下划線開頭,后跟任意數量的字母,數字或下划線。 作為正則表達式,它將表示為:'[a-zA-Z_ \\ x7f- \\ xff] [a-zA-Z0-9_ \\ x7f- \\ xff] *'

這就是$0foo = 'Test';的原因$0foo = 'Test'; 觸發解析錯誤。

使用變量語法進行的一些快速測試表明,實際上,PHP似乎並不真正關心變量名稱,只要它們是字符串:

${'123 abc xyz    '} = 'Test';
echo ${'123 abc xyz    '}; // Test
echo ${'123 abc xyz   '}; // PHP Notice:  Undefined variable: 123 abc xyz    in ...
var_dump(get_defined_vars()); // ["123 abc xyz    "] => string(4) "Test"

我的猜測是上述命名限制是由源代碼解析器而不是語言核心強加的。 在分析PHP代碼時,它需要這樣的規則來區分變量。 在內部,支持PHP的Zend引擎將變量作為哈希映射處理:

通常,PHP變量由兩部分組成:標簽,例如,可能是符號表中的條目,以及實際的變量容器。

因此,只要它收到標簽的有效字符串,它就很高興。

文檔

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

對我來說,這意味着如果你使用${...} ,對變量名中可能使用的字符沒有限制。 不管你應該......

換句話說,在這種情況下花括號內的所有東西都是一個字符串!

所以s 0x0確實是0的十六進制版本,但這里都是字符串! 這就是${0x0}${0}工作的原因,其中$0$0x0不會!

PHP解析器提供了一種特殊的語法,可以從任何返回字符串的表達式(或者可以轉換為字符串)創建變量名,例如:

<?php

define('A', 'aaa');

${'    _   '} = 'blah';
${'test' . A . (2 + 6)} = 'var';

echo ${'    _   '}; // blah
echo ${'testaaa8'}; // var

${'123'} = 'blah';
echo ${100 + 23}; // blah

function returnVarName() {
    return 'myVar';
}

$myVar = 12;
echo ${returnVarName()}; // 12

此語法也可用於對象屬性:

$object->{' some property    ... with strage name'};

0x0只是0字面的十六進制表示。

除了@Michael Robinson所說的,在你的例子中,這也是有效的:

${0x0} = 'test';
$var = "0";
echo $$var; // prints "test"

暫無
暫無

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

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