2011-05-18 55 views
3

在PHP中是否有这种JavaScript代码的等价物?php中的Object.hasOwnProperty.call(object,key)

var object = {}, key; 
Object.hasOwnProperty.call(object, key) 
+3

只需注意:上述正确的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

+0

我只是在研究json_parser,我碰到它,我不知道它是什么意思:) https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js line 272 – Val 2011-05-18 14:04:42

+0

这是一个有点特殊的用例。基本上,如果有可能你所测试的东西可能不是一个对象,那么你可能会走很长的路。但我们正在谈论一个边缘案例。 [而且我也没有看到他的'对象'也可能不是一个非客体对象,而且我看到他违背了我对变量命名的建议。这是克罗克福德给你的。 ;-)] – 2011-05-18 14:08:22

回答

3

为属性:

property_exists($class_instance, 'YourProperty'); 

为方法:

method_exists($class_instance, 'YourMethod'); 

http://php.net/manual/en/function.property-exists.php

http://php.net/manual/en/function.method-exists.php

+1

请注意,事先到php 5.3'property_exists'将在'protected'和'private'属性上返回false。 – Yoshi 2011-05-18 14:00:16

+2

为什么这个答案被接受?这看起来不正确。 hasOwnProperty对继承的属性返回false,property_exists返回true。 – Alex 2012-12-12 16:50:49

+0

正如@Alex已经说过的,这个答案是错误的,因为它考虑了继承的属性,而不是Javascript的'hasOwnProperty()'**。这就是“自己”所代表的...... – 2016-05-02 16:16:48

0

下面是使用反射我的做法。 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()的最好。

请记住,反射是一个性能击中过程。