2010-08-02 80 views
3

我想檢測所有在php文件中定義的對象(類)(例如:flavors.php)。對象的數量將被動態地定義,所以我需要在運行時用函數處理可用對象,直到對象耗盡。對象耗盡後,程序停止。PHP:如何循環遍歷動態數量的類

我完全控制了代碼,所以如果有更好的方法來存儲變量,並保持它們只使用PHP組織,請讓我知道。

作爲一種學習體驗,我試圖讓php在不知道數字或者事先存在的對象名稱的情況下操作一組對象。

這是我想要的代碼的邏輯:

while(THERE ARE STILL CLASSES TO PROCESS IN FLAVORS.php) 
{ 
    $var = description_generator(CLASS_NAME SENT TO THE FUNCTION); 
    print($var); 
} 

爲背景,這是整個程序:

flavors.php 

class vanilla 
{ 
    // property declaration 
    public $color = 'white'; 
    public $price = '1.25'; 
} 

class chocolate 
{ 
    // property declaration 
    public $color = 'brown'; 
    public $price = '1.50'; 
} 

main.php 
{ 
function description_generator($class_name) 
{ 

    $selected_flavor_class = new $class_name(); 
    $flavor_color = $selected_flavor_class->flavor_color; 
    $flavor_price = $selected_flavor_class->flavor_price; 

    return "$flavor_color"."<br />"."$flavor_price"; 
} 

while(THERE ARE STILL CLASSES TO PROCESS) 
{ 
    print($var = description_generator(CLASS_NAME)); 
} 

總之,有沒有辦法通過,使PHP程序未確定數量的課程?還有更好的方法來創建和組織存儲多個變量的對象,如巧克力='棕色','1.50',而不需要使用簡單的數組?

+0

get_declared_classes()查看http://php.net/manual/en/function.get-declared-classes.php – 2010-08-02 06:58:20

回答

2

可以使用Zend_Reflection包,它擴展了regular Reflection API

$r = new Zend_Reflection_File('flavors.php'); 
$classes = $r->getClasses(); 
echo "File holds " . count($classes) . ":\n"; 
foreach ($classes as $class) { 
    echo $class->getName() . "\n"; 
} 

由於Zend框架有一個用戶自定義架構,您不必使用任何其他類。您不必將應用程序遷移到Zend Framework,並且可以使用獨立版本Zend_Reflection

此外,你可能想給你的類的interface

interface IFlavor 
{ 
    public function getName(); 
    public function getPrice(); 
    public function getColor(); 
} 

這種方式,可以反映出一個類是否是濃香型,例如

$class->implementsInterface('IFlavor') 

確保文件中的類真的是Flavors。這也將讓你的代碼更易於維護,因爲這將確保您的口味都具有相同的基本方法,你可以使用該接口爲TypeHintit is generally good practise to code against an interface.

但是,如果味類只持有這兩個屬性,並沒有其他的責任,你可能想把它們變成一個Flavor類,而不是像多個不同的類

class Flavor implements IFlavor 
{ 
    protected $_name; 
    protected $_color; 
    protected $_price; 

    public function __construct($name, $color, $price) 
    { 
     $this->_name = $name; 
     $this->_color = $color; 
     $this->_price = $price; 
    } 

    // getter methods 
} 

而是使用反射來找到你的口味文件類的,你可以簡單地用一個配置文件來存儲可用的口味。有一個知道如何加載配置文件的類,並根據需要爲其提供一個延遲初始化Flavors的方法。由於Flavors實際上是Value Objects (in the DDD sense),因此不需要多個同名的Flavor實例,因此管理類也可以保存以前創建的任何實例,並在請求時返回這些實例。

+1

這似乎是一個很好的答案。我應該能夠實現這個沒有問題。 Zend框架看起來像一個勝利者,因爲它是隨意使用的。我也非常感謝你提供了一個關於更好的數據存儲方式的問題的答案。非常感謝。 – JMC 2010-08-02 07:34:33

+0

@acidjazz不用客氣 – Gordon 2010-08-02 07:47:59

0

您需要將風味列表存儲在數組中。一旦他們在一個數組,你可以通過他們循環&過程中他們

$flavours = array('vanilla', 'chocolate'); 

foreach($flavours as $flavour) { 
    echo description_generator($flavour); 
} 
2

你應該看看token_get_all()

+0

+1該解決方案對於此任務非常適用。 $ tokens = token_get_all(file_get_contents('flavors.php')); 然後你可以使用類似正則表達式的東西來找到處理的類名。 – JMC 2010-08-04 03:58:25