在PHP中,可以在对象上使用array_values()
和array_key_exists()
等数组函数吗?
答案 0 :(得分:5)
array_key_exists()
曾经用于对象,但从PHP 5.3.0开始,它不再存在了。您应该使用property_exists()
代替。
答案 1 :(得分:2)
PHP对象可以在没有方法调用的情况下强制转换为数组,并且几乎没有性能损失,这将允许您在属性上使用任何您喜欢的数组函数。
$arr = (array) $obj;
在PHP中使用语言结构几乎总是比调用方法快得多。 isset
被视为语言构造。
我意识到这有一个过早优化的微弱气味,但在PHP 5.3中运行以下代码的结果可能会让您感到惊讶。
<?php
$count = 50000;
class Pants
{
public $mega='wad';
public $pung=null;
}
$s = microtime(true);
for ($i=0; $i < $count; $i++) {
$p = new Pants;
$e = property_exists($p, 'mega');
$e = property_exists($p, 'pung');
}
var_dump(microtime(true) - $s);
$s = microtime(true);
for ($i=0; $i < $count; $i++) {
$p = new Pants;
$p = get_object_vars($p);
$e = isset($p['mega']);
$e = isset($p['pung']);
}
var_dump(microtime(true) - $s);
$s = microtime(true);
for ($i=0; $i < $count; $i++) {
$p = new Pants;
$p = (array) $p;
$e = isset($p['mega']);
$e = isset($p['pung']);
}
var_dump(microtime(true) - $s);
输出:
float(0.27921605110168)
float(0.22439503669739)
float(0.092200994491577)
这清楚地表明,在PHP中进行这些体操的最佳方式是依赖于使用最一流语言结构和最少方法调用的方法,而我发现的最好的方法是(数组)铸造。
答案 2 :(得分:0)
对于array_values()
的情况,使用get_object_vars()
获取其公共属性(取决于客户端代码的范围,如果您想获取受保护和私有属性)。
如果你想要更多OO,ReflectionObject
可以做很多事情。
答案 3 :(得分:0)
如果您绝对需要array_values
和array_keys
中的功能,则可以执行以下操作:$keys = array_keys(get_object_vars($obj))
和$values = array_values(get_object_vars($obj))
更好的OO方式是使用keys
和values
的方法创建一个界面。然后在类中实现这些方法以获取键和值。其他类似数组的接口整齐地呈现在ArrayIterator类中。