2010-10-02 116 views
3
class ParentClass 
{ 
    public function list() 
    { 
     foreach ($this as $property => $value) 
     { 
      if (is_public($this->$property)) 
       echo 'public: '; 
      else if (is_protected($this->$property)) 
       echo 'protected: '; 
      echo "$property => $value" . PHP_EOL; 
     } 
    } 
} 

class ChildClass extends ParentClass 
{ 
    protected $Size = 4; 
    protected $Type = 4; 
    public $SubT = 1; 
    public $UVal = NULL; 
} 

$CC = new ChildClass; 
$CC->list(); 
+1

問題是什麼?如何[實際使用Reflectionclases提供給你?](http://www.php.net/reflection) – Wrikken 2010-10-02 20:13:12

+0

反射類是唯一的方法來做到這一點?爲什麼沒有可用的直接功能? – 2010-10-02 20:19:44

+1

因爲它對於存在的函數沒有意義。該函數將獲取變量的值。除非它是這樣的:'is_public($ this,'propertyName')'...但即使這樣也沒有意義,因爲有一些可以模擬這些屬性的魔術方法('__get')。所以反射是最好的方法... – ircmaxell 2010-10-02 20:59:57

回答

5

使用ReflectionProperty,這是可能的。你可以創建一個輔助函數,如果你想減少冗長:

<?php 
function P($obj, $name) 
{ 
    return new ReflectionProperty($obj, $name); 
} 

class Foo 
{ 
    public $a; 

    public function __construct() 
    { 
    foreach (array_keys(get_object_vars($this)) as $name) 
    { 
     if (P($this, $name)->isPublic()) 
     { 
     echo "Public\n"; 
     } 
    } 
    } 
} 

new Foo(); 

?>