2014-01-10 54 views
-2

我已經搜索了Google和堆棧溢出論壇幾個小時,並且只發現get_declared_classes函數,它只返回聲明對象名稱的類名。在php中聲明的類的名稱

這裏我想要做的事情:我需要獲取頁面內聲明對象的所有名稱,以便它可以基本返回範圍,因爲我正在處理大型mvc框架工作項目,其中某些類實例具有動態名稱。

例如

$a = new foo(); 
$b = new foo(); 
$c = new foo(); 

$x = new bar(); 
$y = new bar(); 
$z = new bar(); 

我需要返回A,B,CX,Y,基於所述類名輸入

例如

function blah(foo/bar){ 
return name of for/bar 
} 

我不Z A功能甚至不知道這是否可能,但是確定班級是如何申報的確實很有幫助。

+0

我竭力要明白你的意思。 'var_dump($ this)''做你需要的嗎? – Ryan

+1

你應該閱讀關於反射在PHP中http://il1.php.net/manual/en/intro.reflection.php –

+0

var_dump返回一個特定變量的信息,我需要一個類實例的列表,我不知道命名。 –

回答

2

我希望我能正確理解你。

  1. 獲取所有定義的變量:get_defined_vars()

  2. 過濾對象按類型:is_object()


→ Ideone.com live version

class Bar { 
} 
$blub = new Bar(); 

$vars = get_defined_vars(); 
$vars = array_filter($vars, function($var) { 
    return is_object($var) && $var instanceof Bar; 
}); 

foreach ($vars as $object) { 
    echo 'There is one "Bar"!'; 
} 

您可以在也可以使用get_class()來動態檢查類名。 → Ideone.com live version

class Bar {} 
class Foo {} 

// we do not want them to be listed in the output 
class EvilBar {} 
class EvilFoo {} 

$a = new Bar(); 
$b = new Foo(); 
$c = new EvilBar(); 
$d = new EvilFoo(); 

$vars = get_defined_vars(); 
$vars = array_filter($vars, function($var) { 
    return is_object($var) && strpos(get_class($var), 'Evil') !== 0; 
}); 

foreach ($vars as $object) { 
    // Doesn't begin with "Evil" 
    if (strpos(get_class($object), 'Evil') !== 0) { 
     echo 'There is one non-evil object and its class name is: ', get_class($object), "\r\n"; 
    } 
} 
+0

當我發佈我的答案 - 我制定了這是我認爲他的想法 - 我想你'對了這個。 +1 –

+1

雖然也許要列出所有實例化對象,而不是特定類型的所有對象,只需要使用foreach($ var作爲$ object)echo get_class($ object); –

+0

請注意,變量範圍的規則仍然適用 –