找到具有特定类const的类

时间:2011-07-05 17:40:19

标签: php

我有很多产品类可以扩展父产品类。其中每个都实现了自己的PRODUCT_ID const版本。客户对象中的方法将从数据库中提取PRODUCT_ID。然后,我想实例化相关的产品对象并将其添加到数组中。

如何动态找出哪个产品对象具有特定的PRODUCT_ID const?

对不起,如果有点混乱!

3 个答案:

答案 0 :(得分:0)

执行此操作的唯一方法是首先遍历所有声明的类,然后检查它们是否是父产品的子类,最后检查是否定义了PRODUCT_ID常量并且等于您的产品寻找。

这是一个例子:

<?php

class Product
{
}

class Stack extends Product
{
  const PRODUCT_ID = 1;
}

class Overflow extends Product
{
  const PRODUCT_ID = 2;
}

function getSubclasses($parentClassName)
{
    $classes = array();
    foreach (get_declared_classes() as $className)
    {
        if (is_subclass_of($className, $parentClassName))
            $classes[] = $className;
    }

    return $classes;
}

function find_product($product_id)
{
  foreach ( get_declared_classes() as $class )
    if ( is_subclass_of($class, 'Product') )
      if ( constant($class . '::PRODUCT_ID') == $product_id )
        return $class;
}

echo find_product(1); // Outputs "Stack"

答案 1 :(得分:0)

使用字段$ product_id和访问者创建类:

class Product
{
    protected $product_id;

public function __construct($id)
{
    $this->id = $id;
}

    public function getProductId()
    {
        return $this->product_id;
    }

    public function setProductId($product_id)
    {
        $this->product_id = $product_id;
    }
}

然后:

$t = new Product(1254899);

答案 2 :(得分:0)

每个PRODUCT_ID值对应一个唯一的产品类名称,对吗?所以如果没有关联的类,你就不能拥有PRODUCT_ID?因此,在这种情况下,您知道您拥有多少产品类别。 如果一切都是真的,我认为最好的解决方案是创建一个像这样的数组

$pairs = array(
    PRODUCT_ID_VALUE_ONE => 'classNameOne',
    PRODUCT_ID_VALUE_TWO => 'classNameTwo',
    // [...]
);

然后,当您想要检索与特定PRODUCT_ID关联的类名时,您必须

    $className = $pairs[ $myProductId ];

您有两个解决方案来构建该数组:

  • 手动构建,
  • 自动使用PHP reflexion构建它(如Francois所示)

如果您的课程很少,如果他们没有太多改变,那么第一个解决方案就更好了:它更快,更容易阅读/更改值,易于理解代码,并且您可以更好地控制数组值=&GT;你手动设置它们,这样你就没有错误的值。

第一个解决方案的问题是数组和所有产品类之间可能存在不一致:如果将PRODUCT_ID值更改为类,则必须手动将其更改为数组。

如果您有很多课程或经常更改,第二种解决方案会更好。但是,PHP反射可能会降低您的应用程序速度。要限制副作用,您可以:

  • 一次构建数组一次,
  • 仅在需要时构建一次数组

您可以创建getProductClassById之类的方法:

  • 检查上面数组的存在,
  • 根据需要创建数组,
  • 在该数组中搜索,
  • 返回值,

希望这会有所帮助,

干杯