2015-01-04 46 views
0

好吧,假設我有一個名爲test的字符串,並且我知道該字符串實際上在我的某個類中用作屬性名稱。有沒有辦法找出哪個班有名字test檢查一個屬性是否屬於PHP

事情是這樣的,也許:

class Foobar { 
    private $foo; 
} 

class Bazbar { 
    private $test; 
} 

$attr_name = 'test'; 
echo get_class_name_by_attr($attr_name); // Would output Bazbar 

快速簡易此代碼...

有沒有辦法在PHP來實現這一目標?

+0

有一個從通過各種類循環和使用反射來檢查屬性這樣做,除了沒有簡單的方法....即使這樣,新的屬性可以被動態添加到類的任何實例....並且幾個不同的類可以具有相同名稱的屬性 –

+0

爲什麼要定義'$ test'' private'?無論如何,我認爲這不會起作用。 –

+0

什麼馬克貝克說:http://php.net/manual/en/function.get-declared-classes.php + http://php.net/manual/en/book.reflection.php –

回答

3

我同意那些認爲你必須重新分析你的問題的人。但問題的答案是這樣的:

foreach (get_declared_classes() as $class) { 
    if (property_exists($class, 'test')) { 
     echo $class. " has the propriety test.\n"; 
    } 
} 
0

這應該爲你工作:

(我還在問自己,爲什麼你需要這個,但我希望這會有所幫助)

<?php 

    class Foobar { 
     private $foo; 
    } 

    class Bazbar { 
     private $test; 
    } 


    $attr_name = "test"; 
    $check_classes = array("Foobar", "Bazbar"); 

    foreach($check_classes as $k => $v) { 
     $obj = new $v(); 
     $obj = new ReflectionClass($obj); 
     $classes[] = $obj->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED | ReflectionProperty::IS_PRIVATE); 
    } 

    foreach($classes as $class) { 
     foreach($class as $prop) { 

      if($prop->getName() == $attr_name) 
       echo "Class: " . $class[0]->class. " Prop: " . $prop->getName(); 

     } 
    } 

?> 

輸出:

Class: Bazbar Prop: test 

在這裏,我添加一個數組,在這些類中搜索attr。名稱。爲此我使用反射。你可以在這裏閱讀:http://uk.php.net/manual/en/book.reflection.php

+1

爲什麼不像'foreach(get_declared_classes()作爲$ class){if(property_exists($ class,'test')){echo $ class。 「有測試道具\ n」; }}'? – Federkun

+0

@Leggendario哈哈,沒有想到,你是絕對正確的,你可以寫一個答案,如果你想! – Rizier123