2010-08-02 2 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 –

ответ

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 Framework имеет архитектуру использования по требованию, вам не нужно использовать какой-либо из других классов. Вам не нужно переносить свое приложение в Zend Framework и использовать автономный режим Zend_Reflection.

Кроме того, вы можете дать свои классы interface:

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

Таким образом, вы можете отражать класс является ли тип Flavor, например,

$class->implementsInterface('IFlavor') 

, чтобы убедиться, что классы в файле действительно являются ароматизаторами. Это также сделает ваш код более ремонтопригодны, потому что это будет гарантировать, что Ваши вкусы все имеют те же основные методы и вы можете использовать интерфейс, как TypeHint и it 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 
} 

Вместо того, чтобы использовать Reflection, чтобы найти классы в файле вкусы, вы могли бы просто использовать конфигурационный файл для хранения доступных вкусов. Имейте класс, который знает, как загрузить файл конфигурации и дать ему метод ленивого init Flavors по мере необходимости.Так как Flavors эффективно Value Objects (in the DDD sense), вам не нужно больше одного экземпляра Flavor с тем же именем, поэтому класс управления может также содержать любые ранее созданные экземпляры и возвращать их по запросу.

+1

это кажется отличным ответом. Я должен быть в состоянии реализовать это без проблем. Zend Framework выглядит как победитель, так как он используется по желанию. Я также благодарю вас за ответ на мой вопрос о том, как лучше хранить данные. Большое спасибо. – JMC

+0

@acidjazz добро пожаловать – Gordon

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

Смежные вопросы