Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:如何循环遍历动态数量的类_Php_Variables_Class_Object_Organization - Fatal编程技术网

PHP:如何循环遍历动态数量的类

PHP:如何循环遍历动态数量的类,php,variables,class,object,organization,Php,Variables,Class,Object,Organization,我想检测php文件(例如:flavors.php)中定义的所有对象(类)。对象的数量将动态定义,因此我需要在运行时使用函数处理可用对象,直到对象耗尽为止。对象耗尽后,程序停止 我完全可以控制代码,所以如果有更好的方法来存储变量,并且只使用php来组织它们,请告诉我 作为学习经验,我试图让php在不知道预先存在的对象的数量或名称的情况下操作一组对象 这就是我试图编写的逻辑: while(THERE ARE STILL CLASSES TO PROCESS IN FLAVORS.php) { $

我想检测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));
}
flavors.php
香草类
{
//财产申报
公共$color=‘白色’;
公开美元价格='1.25';
}
等级巧克力
{
//财产申报
公共$color=‘棕色’;
公开美元价格='1.50';
}
main.php
{
函数描述\u生成器($class\u名称)
{
$selected_flavor_class=新的$class_name();
$flavor\u color=$selected\u flavor\u class->flavor\u color;
$flavor\u price=$selected\u flavor\u class->flavor\u price;
返回“$flavor\u color”。
“$flavor\u price”; } while(仍有类要处理) { 打印($var=description_generator(CLASS_NAME)); }

总而言之,有没有一种方法可以让PHP通过数量不确定的类进行处理?还有没有更好的方法可以创建和组织存储多个变量的对象,例如chocolate='brown',1.50',而不必使用简单的数组?

您需要将味道列表存储在一个数组中。一旦它们在一个数组中,您就可以循环通过它们并处理它们

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

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

您应该看看

您可以使用这个包,它扩展了

由于Zend Framework具有随意使用的体系结构,因此您不必使用任何其他类。您不必将应用程序迁移到Zend Framework,并且可以使用
Zend_Reflection
standalone

此外,您可能希望为您的类提供:

通过这种方式,您可以反映类是否是一种风味类型,例如

$class->implementsInterface('IFlavor')
确保文件中的类确实是Flavors。这也将使您的代码更易于维护,因为它将确保您的Flavors都具有相同的基本方法,并且您可以将接口用作和

但是,如果flavor类只拥有这两个属性,并且没有其他责任,那么您可能希望将它们组成一个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。创建一个知道如何加载配置文件的类,并根据需要为其提供一个lazy init flavors方法。由于flavors是有效的,您不需要多个同名的Flavor实例,因此g类还可以保存任何以前创建的实例,并在请求时返回这些实例。

get_declared_classes()看,这似乎是一个很好的答案。我应该能够毫无问题地实现这一点。Zend框架看起来像是一个赢家,因为它可以随意使用。我也很感激您为我的问题提供了一个关于更好地存储数据的方法的答案。非常感谢。+1此解决方案非常适合此任务。$tokens=token\u get\u all(file_get_contents('flavors.php');然后可以使用正则表达式之类的东西来查找要处理的类名。
$class->implementsInterface('IFlavor')
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
}