2017-07-27 55 views
0
<?php 

class S { 
    public $a = 'a'; 
    protected $b = 'b'; 
    private $c = 'c'; 

    function get_last_child_public_properties() { 
     /* HOW TO */ 
    } 
} 

class A extends S 
{ 
    public $d = 'd'; 
    protected $e = 'e'; 
    private $f = 'f'; 
} 

class B extends A 
{ 
    public $g = 'public_g'; 
    protected $h = 'h'; 
    private $i = 'i'; 
    public $j = 'public_j'; 
} 

$b = new B(); 
$props = $b->get_last_child_public_properties(); 
/** 
* I expect $props to be equals to : 
* Array : ['g' => 'public_g', 'j' => 'public_j'] 
*/ 
+0

如果您**只有**想要父母的公共属性,您可以使用此代码:'$ reflect = new ReflectionClass(__ CLASS__);返回$ reflect-> GetProperties(ReflectionProperty :: IS_PUBLIC);'在你的函数'get_last_child_public_properties()'中。 ('var_dump'结果)。否则,你可以递归地检查每个类,看看父类是否存在,如果没有获得公共属性(因为它是最后一个类,并且不会继承其他任何东西) - 尽管我不知道有什么用途? – ctwheels

回答

2

你应该看看PHP中的Relection-classes。

特别是getProperties() - 方法返回对象中所有属性的数组作为ReflectionProperty的实例。

$classInfo= new ReflectionClass($b); 
foreach($classInfo->getProperties() as $prop) { 
    if ($prop->isPublic() && $prop->getDeclaringClass()->name == $classInfo->name) { 
     // $prop is public and is declared in class B 
     $propName = $prop->name; 
     $propValue = $prop->getValue($b); 

     // Since it is public, this will also work: 
     $propValue = $b->$propName 
     // $prop->getValue($b) will even work on protected or private properties 
    } 
} 
+0

感谢您的学习。 – user544262772