gpt4 book ai didi

php - 什么是整数属性以及 '\0A\0A' 的含义是什么?

转载 作者:可可西里 更新时间:2023-11-01 13:18:01 25 4
gpt4 key购买 nike

我是从 PHP manual 上读到的:

If an object is converted to an array, the result is an array whose elements are the object's properties. The keys are the member variable names, with a few notable exceptions: integer properties are unaccessible; private variables have the class name prepended to the variable name; protected variables have a '*' prepended to the variable name. These prepended values have null bytes on either side. This can result in some unexpected behaviour:

class A {
private $A; // This will become '\0A\0A' }

class B extends A {
private $A; // This will become '\0B\0A'
public $AA; // This will become 'AA' }

var_dump((array) new B());

The above will appear to have two keys named 'AA', although one of them is actually named '\0A\0A'.

this这样的字体,我不是很明白。

什么是整数属性?

“这些前置值的两边都有空字节。这会导致一些意外行为”是什么意思?

和“?上面的内容看起来有两个名为“AA”的键,尽管其中一个实际上名为“\0A\0A””是什么意思

最佳答案

整数属性

这是指名称为十进制整数的字符串表示形式的属性。例如:

$o = new stdClass;
$o->{"123"} = 'foo'; // create a new integer property

echo $o->{"123"}, PHP_EOL; // verify it's there

$a = (array)$o; // convert to array

echo $a['123']; // OOPS! E_NOTICE: Undefined offset!

var_dump(array_keys($a)); // even though the key appears to be there!
print_r($a); // the value appears to be there too!

一般来说,PHP 中的整数属性不应该靠近 if you value your sanity。 .

null 包围的前置值

对于 privateprotected 属性,生成的数组键将包含不可打印的字符 "\0"。这可能很有用(因为该字符对于属性名称是不合法的,您可以使用此信息来确定属性的可见性),但如果您不希望它在那里,它也可能是一个麻烦。示例:

class A {
private $A; // This will become '\0A\0A'
}

class B extends A {
private $A; // This will become '\0B\0A'
public $AA; // This will become 'AA'
}

$a = (array) new B();

// The array appears to have the keys "BA", "AA" and "AA" (twice!)
print_r(array_keys($a));

// But in reality, the 1st and 3rd keys contain NULL bytes:
print_r(array_map('bin2hex', array_keys($a)));

您可以像这样从数组键中提取可见性信息:

$a = (array) new B();
foreach ($a as $k => $v) {
$parts = explode(chr(0), $k);
if (count($parts) == 1) {
echo 'public $'.$parts[0].PHP_EOL;
}
else if ($parts[1] == "*") {
echo 'protected $'.$parts[2].PHP_EOL;
}
else {
echo 'private '.$parts[1].'::$'.$parts[2].PHP_EOL;
}
}

关于php - 什么是整数属性以及 '\0A\0A' 的含义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14547187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com