2013-05-15 103 views
3

我想知道是否可以從PHP中的屬性引用獲取類名和屬性名?從屬性引用獲取類名

class Test { 
    public static $TestProp; 
} 
GetDoc(& Test::$TestProp); 
function GetDoc($prop) { 
    $className = getClassName($prop); 
    $propertyName = getPropertyName($prop); 
} 

我在找的是如果可以創建函數getClassName和getPropertyName?

+0

只是想知道;你想找出來的原因是什麼? – Sherlock

+0

我想創建一個方法,我可以通過傳遞屬性來創建html控件,傳入的類和屬性名稱太過笨拙IMO。 –

+0

我找到了一種方法來獲取類名,工作的方式來獲取屬性名稱,當我知道我會發布我的答案。 –

回答

0

我已經想通過這種方式來實現這個工作,有很多魔法只是爲了讓它起作用,但在我的情況下是值得的。

class Test { 
    private $props = array(); 
    function __get($name) { 
     return new Property(get_called_class(), $name, $this->props[$name]); 
    } 
    function __set($name, $value) { 
     $props[$name] = $value; 
    } 
} 
class Property { 
    public $name; 
    public $class; 
    public $value; 
    function __construct($class, $name, $value) { 
     $this->name = $name; 
     $this->class = $class; 
     $this->value = $value; 
    } 
    function __toString() { 
     return $value.''; 
    } 
} 
function GetClassByProperty($prop) { 
    return $prop->class.'->'.$prop->name; 
} 
$t = new Test(); 
$t->Name = "Test"; 
echo GetClassByProperty($t->Name); 

這個例子是的,我知道這是複雜的,但它的工作如何我想它,會打印出「測試 - >名稱」我也可以這樣說:$丙得到值>值。如果我想的值與另一個對象,我可以簡單地這樣做:

if($t->Name == "Test") { echo "It worked!!"; } 

希望這不是太混亂,但它是一個有趣的探索PHP。

+0

現在這個解決方案的不好之處在於,如果你想將值設置爲另一個變量,你必須記住說「$ t-> Name-> value」 –

+0

這真的好像你在這裏做錯了,但沒有更深入的理解爲什麼它應該以這種方式工作,恐怕我的回答不能更有幫助:) –

+0

這正是我期待得到的結果,只是沒有想到它會花費所有的這樣才能工作。創建一個方法來爲每個屬性創建一個控件,我只想傳入屬性引用,而不是實際上是同一個東西,但嘿它有效,現在語法很簡單。 –

-1

Php有一個名爲get_class的函數內建

+0

這需要傳遞一個對象,而不是一個類的靜態屬性。 –

+0

如果我首先給輸入對象調用「clone」然後使用get_class,那麼它可行嗎? –

+0

我只想傳遞一個屬性的引用並獲取類名和屬性名,這可以用其他語言完成,只是想知道是否可以用PHP完成。 –

2

你想要什麼基本上是不可能的;一個財產不知道它的父母結構。

我能想到的唯一明智的就是使用反射吧:

class Test 
{ 
    public static $TestProp = '123'; 
} 

//GetDoc(& Test::$TestProp); 
GetDoc('Test', 'TestProp'); 

function GetDoc($className, $propName) 
{ 
    $rc = new ReflectionClass($className); 

    $propValue = $rc->getStaticPropertyValue($propName); 
} 

Test類,你可以使用__CLASS__作爲類名稱的方便的參考。