【问题标题】:How to know if static property is inherited in php?如何知道静态属性是否在php中被继承?
【发布时间】:2015-09-30 06:23:16
【问题描述】:

我有一个$class_name = 'B';

还有:

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

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

我如何知道 $class_name::$foo 是 $class_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()功能如何实现?

【问题讨论】:

标签: php class oop inheritance static


【解决方案1】:

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

get_parent_classisset and variable variables 结合使用:

function isOwnStaticProperty($class, $property)
{
    $parent = get_parent_class($class);
    return isset($class::$$property) && ($parent === FALSE || !isset($parent::$$property));
}

这会检查$class 是否有一个名为$property 的静态属性,或者没有父类,或者父类没有这样的属性。

注意isOwnStaticPropertyproperty 之前的两个$

这样称呼

echo isOwnStaticProperty('A', 'foo'); // TRUE
echo isOwnStaticProperty('A', 'bar'); // FALSE
echo isOwnStaticProperty('B', 'foo'); // FALSE
echo isOwnStaticProperty('B', 'bar'); // TRUE

【讨论】:

  • 有一种情况不起作用。这是我的错,我没有在我的例子中提出这个案例,我编辑问题。如果在父级和当前类中定义了静态属性
  • 您是否必须一直回到“根”类(即第一个不扩展任何内容的类)才能正确知道静态变量是否被继承?使函数递归应该很容易。
  • @SverriM.Olsen 如果继承链中的任何类包含属性,则每个继承类都将包含属性,包括相关类的直接父类。因此,如果直接父级不包含它,则链上的任何类都不会包含它。
  • @Siguza 是的,这是有道理的。 +1
【解决方案2】:

您可以使用ReflectionClassgetProperties 方法来检索反射的属性。要过滤你可以使用ReflectionProperty

<?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"; 

输出:

真的
错误
真的
错误
真的
真的

【讨论】:

  • 它也适用于应注意的非静态属性,在他的情况下可能不适合
  • @insanebits 是的,我明白了,我现在会更新,只是一个验证
  • @insanebits 我更新了我的答案,过滤器仅用于静态属性
  • @Matrix 如果你使用 getStaticProperties 你会得到没有他的类的继承属性,测试手册中的例子
猜你喜欢
  • 2014-02-11
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 2011-04-16
  • 2011-11-10
  • 2016-10-10
  • 1970-01-01
相关资源
最近更新 更多