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