在PHP中是否有这种JavaScript代码的等价物?php中的Object.hasOwnProperty.call(object,key)
var object = {}, key;
Object.hasOwnProperty.call(object, key)
在PHP中是否有这种JavaScript代码的等价物?php中的Object.hasOwnProperty.call(object,key)
var object = {}, key;
Object.hasOwnProperty.call(object, key)
为属性:
property_exists($class_instance, 'YourProperty');
为方法:
method_exists($class_instance, 'YourMethod');
请注意,事先到php 5.3'property_exists'将在'protected'和'private'属性上返回false。 – Yoshi 2011-05-18 14:00:16
为什么这个答案被接受?这看起来不正确。 hasOwnProperty对继承的属性返回false,property_exists返回true。 – Alex 2012-12-12 16:50:49
正如@Alex已经说过的,这个答案是错误的,因为它考虑了继承的属性,而不是Javascript的'hasOwnProperty()'**。这就是“自己”所代表的...... – 2016-05-02 16:16:48
或者使用反射(见:http://www.php.net/manual/en/book.reflection.php):
<?php
$obj = (object)array('test' => 1);
$key = 'test';
$refObj = new ReflectionObject($obj);
var_dump($refObj->hasProperty($key));
下面是使用反射我的做法。 http://php.net/manual/en/class.reflectionclass.php
比方说,我有这样的配置:
class A
{
// ...
public static function hasOwnProperty($property_name)
{
$property = (new \ReflectionClass(static::class))->getProperty($property_name);
return $property->class === static::class;
}
}
然后,我可以从基类本身和所有子类调用它:
class A
{
protected static $name = 'blabla';
}
class B extends A
{
//
}
class C extends A
{
protected static $name = null;
}
class D extends A
{
protected static $name = '324';
}
我在基类中定义此函数:
>>> A::hasOwnProperty('name');
=> true
>>> B::hasOwnProperty('name');
=> false
>>> C::hasOwnProperty('name');
=> true
>>> D::hasOwnProperty('name');
=> true
请注意,它返回true
即使值为null
,这是我认为的预期行为。这似乎采取isset()
和property_exists()
的最好。
请记住,反射是一个性能击中过程。
只需注意:上述正确的JavaScript表单是'object.hasOwnProperty(key)'(不是'Object.hasOwnProperty.call(object,key)',尽管它有效)。在[规范](http://www.ecma-international.org/publications/standards/Ecma-262.htm)中的'Object'上没有'hasOwnProperty'函数,仅仅在Object.prototype上(并且继承了由所有对象)。现在被授予,“Object”继承自Object.prototype,但仍然没有理由绕过这样的房屋,直接进入有问题的实例。我也*强烈*建议不要使用'object'作为变量名称。 ;-) – 2011-05-18 13:59:45
我只是在研究json_parser,我碰到它,我不知道它是什么意思:) https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js line 272 – Val 2011-05-18 14:04:42
这是一个有点特殊的用例。基本上,如果有可能你所测试的东西可能不是一个对象,那么你可能会走很长的路。但我们正在谈论一个边缘案例。 [而且我也没有看到他的'对象'也可能不是一个非客体对象,而且我看到他违背了我对变量命名的建议。这是克罗克福德给你的。 ;-)] – 2011-05-18 14:08:22