![](/img/trans.png)
[英]What does the '0x0'. do in this equation $intTotal += '0x0'.$value;
[英]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.