2010-07-19 81 views

回答

5

array_key_exists()用于对象的工作,但从PHP 5.3.0开始,它不再有了。您应该改用property_exists()

+0

或者你可以使用isset(),它同时适用于两者 - 尽管如果值为NULL,它将返回false。 – igorw 2010-07-19 13:43:52

+0

@ evil3 - 或者只是使用'is_array',然后'array_key_exists'或'property_exists'滚动自己。 – 2010-07-19 13:46:12

+0

'array_key_exists'仍然可以与对象一起工作,区别仅在于静态属性。 'array_walk'和'array_walk_recursive'也可以工作。请参阅http://codepad.viper-7.com/I55G4X和http://wiki.php.net/internals/engine/objects#get_properties – Artefacto 2010-07-26 20:42:00

0

对于array_values()的情况,请使用get_object_vars()来获取其公共属性(取决于客户端代码的范围,如果您想获得受保护和私有属性)。

如果你想要更多的OO,ReflectionObject可以做很多事情。

+0

对不起,我读'array_values()'为'array_keys()'。呸。但是值得一读的是我希望,对你。 – yclian 2010-07-19 13:49:13

0

如果你绝对需要在array_valuesarray_keys的功能,你可以这样做:$keys = array_keys(get_object_vars($obj))$values = array_values(get_object_vars($obj))

更好,更面向对象的方法是创建一个方法的接口为keysvalues。然后在你的类中实现这些方法来获得键和值。其他类似数组的接口整齐地呈现在ArrayIterator类中。

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体操最好的办法是依靠哪一种方法采用了最一流的语言结构和最少的方法调用我发现的最好的是(数组)演员。