在PHP中,是否可以在对象上使用诸如array_values()
和array_key_exists()
之类的数组函数?在对象上使用数组函数
回答
array_key_exists()
用于对象的工作,但从PHP 5.3.0开始,它不再有了。您应该改用property_exists()
。
对于array_values()
的情况,请使用get_object_vars()
来获取其公共属性(取决于客户端代码的范围,如果您想获得受保护和私有属性)。
如果你想要更多的OO,ReflectionObject
可以做很多事情。
对不起,我读'array_values()'为'array_keys()'。呸。但是值得一读的是我希望,对你。 – yclian 2010-07-19 13:49:13
如果你绝对需要在array_values
和array_keys
的功能,你可以这样做:$keys = array_keys(get_object_vars($obj))
和$values = array_values(get_object_vars($obj))
更好,更面向对象的方法是创建一个方法的接口为keys
和values
。然后在你的类中实现这些方法来获得键和值。其他类似数组的接口整齐地呈现在ArrayIterator类中。
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体操最好的办法是依靠哪一种方法采用了最一流的语言结构和最少的方法调用我发现的最好的是(数组)演员。
- 1. 在对象数组上使用toString
- 2. 函数使用对象和对象使用函数
- 3. make_heap使用函数对象
- 4. 如何在对象数组上使用jQuery.map()来返回数组数组
- 5. 在对象数组上复制构造函数
- 6. iOS对象数组:在一个函数内部创建一个对象数组
- 7. 使用数组的对象
- 8. Coffeescript:从同一对象中的函数调用数组函数
- 9. 搜索对象从对象数组的数组 - 使用Javascript
- 10. 使用javascript函数将对象添加到我的对象数组
- 11. JavaScript函数,数组和对象
- 12. Javascript |对象,数组和函数
- 13. 将对象数组传递给函数
- 14. 对象构造函数的C++数组
- 15. 从函数返回对象数组 - VBA
- 16. 使用回调函数在数组上执行函数
- 17. 使用子对象填充数组的递归函数
- 18. 使用数组构造函数创建对象
- 19. 使用从PHP函数返回的对象数组
- 20. 使用array.map()函数获取对象作为数组的javascript()函数
- 21. 如何在JSON对象上使用foreach调用javascript函数?
- 22. 对多维数组使用unshift函数
- 23. 如何使用数组splice()函数删除对象中的子数组?
- 24. 在数组对象
- 25. 在数组对象
- 26. 在数组对象
- 27. 在非对象上的函数bindParam()
- 28. 在非对象上的函数css()
- 29. 使用数组索引在3D数组上应用2D数组函数
- 30. 如何使用.map从对象数组创建数组数组?
或者你可以使用isset(),它同时适用于两者 - 尽管如果值为NULL,它将返回false。 – igorw 2010-07-19 13:43:52
@ evil3 - 或者只是使用'is_array',然后'array_key_exists'或'property_exists'滚动自己。 – 2010-07-19 13:46:12
'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