PHP: как перебрать динамическое количество классов - PullRequest
3 голосов
/ 02 августа 2010

Я хочу обнаружить все объекты (классы), определенные в php-файле (пример: flavors.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 через неопределенное количество классов?Кроме того, есть ли лучший способ создания и организации объектов, которые хранят несколько переменных, таких как chocolate = 'brown', '1.50', без использования простого массива?

Ответы [ 3 ]

2 голосов
/ 02 августа 2010

Вы должны взглянуть на token_get_all()

2 голосов
/ 02 августа 2010

Вы можете использовать пакет Zend_Reflection, который расширяет обычный API Reflection .

$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 IFlavor
{
    public function getName();
    public function getPrice();
    public function getColor();
}

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

$class->implementsInterface('IFlavor')

, чтобы убедиться, что классы в файле действительно являются Flavors.Это также сделает ваш код более понятным, поскольку все ваши разновидности будут иметь одинаковые базовые методы, и вы сможете использовать интерфейс как TypeHint и . В общем случае рекомендуется использовать код для интерфейса.

Однако, если классы ароматизаторов содержат только эти два свойства и не несут никакой другой ответственности, вы можете захотеть превратить их в один класс 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 для поиска классов в файле вариантов, вы можете просто использовать файл Config для хранения доступных вариантов.Иметь класс, который знает, как загрузить файл конфигурации, и дать ему метод для ленивых инициализаторов при необходимости.Поскольку Flavors фактически являются объектами значений (в смысле DDD) , вам не нужно более одного экземпляра Flavor с одним и тем же именем, поэтому управляющий класс также может содержать любые ранее созданные экземпляры и возвращать их по запросу.

0 голосов
/ 02 августа 2010

Вам нужно хранить список ароматов в массиве.Как только они будут в массиве, вы можете проходить через них и обрабатывать их

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

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