如何知道php中是否继承了静态属性?

如何知道php中是否继承了静态属性?,php,class,oop,inheritance,static,Php,Class,Oop,Inheritance,Static,我有一个$class_name='B' 以及: 如何知道$class\u name::$foo是$class\u name的静态属性还是继承的静态属性 我需要以下结果: $class_name = 'A'; isOwnStaticProperty($class_name, 'foo'); //TRUE : is a static property of this class $class_name = 'B'; isOwnStaticProperty($class_name, 'foo');

我有一个
$class_name='B'

以及:

如何知道
$class\u name::$foo
是$class\u name的静态属性还是继承的静态属性

我需要以下结果:

$class_name = 'A';
isOwnStaticProperty($class_name, 'foo'); //TRUE : is a static property of this class

$class_name = 'B';
isOwnStaticProperty($class_name, 'foo'); //FALSE : is NOT a static property of this class

$class_name = 'B';
isOwnStaticProperty($class_name, 'bar'); //TRUE : is a static property of this class

$class_name = 'A';
isOwnStaticProperty($class_name, 'bar'); //FALSE : is NOT a static property of this class

$class_name = 'B';
isOwnStaticProperty($class_name, 'baz'); //TRUE : is a static property of this class

$class_name = 'A';
isOwnStaticProperty($class_name, 'baz'); //TRUE : is a static property of this class
如何实现
isOwnStaticProperty()
函数?

编辑:当父类不包含同名属性时,此答案仅对问题的修订版1有效。 结合使用:

这将检查
$class
是否具有名为
$property
的静态属性,或者没有父类,或者父类没有此类属性

请注意
isOwnStaticProperty
属性之前的两个
$

就像

echo isOwnStaticProperty('A', 'foo'); // TRUE
echo isOwnStaticProperty('A', 'bar'); // FALSE
echo isOwnStaticProperty('B', 'foo'); // FALSE
echo isOwnStaticProperty('B', 'bar'); // TRUE
可以将与方法一起使用来检索反射的属性。要进行筛选,可以使用


您可以在“是”中选择“获取父类”,但在“是”之后选择“获取父类”?如何检查它是类的属性还是父类的属性?我用你的las更新更新我的答案,检查代码,我现在就写解释,有一种情况不起作用。这是我的错,我没有在我的例子中展示这个案例,我编辑了这个问题。如果静态属性是在父类和当前类中定义的,那么您不需要一直返回到“根”类(即第一个不扩展任何内容的类)来正确地知道静态变量是否是继承的吗?使函数递归应该很容易。@SverriM.Olsen如果继承链中的任何类都包含属性,则每个继承类都将包含属性,包括所讨论类的直接父类。因此,如果直接父级不包含它,则链上没有类包含它。@Siguza是的,这是有意义的+1它也适用于非静态特性,应注意,这可能不是his中的预期特性case@insanebits是的,我知道了,我现在会更新,只是验证一下,直接使用怎么样?@InaseBits我更新了我的答案,仅使用静态过滤器properties@Matrix如果您使用getStaticProperties,您将在没有他的类的情况下获得inherits属性,请在手册中测试该示例
function isOwnStaticProperty($class, $property)
{
    $parent = get_parent_class($class);
    return isset($class::$$property) && ($parent === FALSE || !isset($parent::$$property));
}
echo isOwnStaticProperty('A', 'foo'); // TRUE
echo isOwnStaticProperty('A', 'bar'); // FALSE
echo isOwnStaticProperty('B', 'foo'); // FALSE
echo isOwnStaticProperty('B', 'bar'); // TRUE
<?php

class A
{
    static $foo = 42;
    static $baz = 4;
}

class B extends A
{
   static $bar = 2;
   static $baz = 44;
}

function isOwnStaticProperty($class, $prop) {
    $reflect = new ReflectionClass($class);
    //Filtering only the statics values with ReflectionProperty::IS_STATIC
    $props   = $reflect->getProperties(ReflectionProperty::IS_STATIC);
    foreach ($props as $object) {
        if($object->class == $class && $object->name == $prop) {
            return true;
        }    
    }
    return false;
}   


$class_name = 'A';
echo isOwnStaticProperty($class_name, 'foo') ? "TRUE<br>\n" : "FALSE<br>\n"; 

$class_name = 'B';
echo isOwnStaticProperty($class_name, 'foo') ? "TRUE<br>\n" : "FALSE<br>\n"; 

$class_name = 'B';
echo isOwnStaticProperty($class_name, 'bar') ? "TRUE<br>\n" : "FALSE<br>\n"; 

$class_name = 'A';
echo isOwnStaticProperty($class_name, 'bar') ? "TRUE<br>\n" : "FALSE<br>\n"; 

$class_name = 'B';
echo isOwnStaticProperty($class_name, 'baz') ? "TRUE<br>\n" : "FALSE<br>\n"; 

$class_name = 'A';
echo isOwnStaticProperty($class_name, 'baz') ? "TRUE<br>\n" : "FALSE<br>\n";