我有很多产品类可以扩展父产品类。其中每个都实现了自己的PRODUCT_ID const版本。客户对象中的方法将从数据库中提取PRODUCT_ID。然后,我想实例化相关的产品对象并将其添加到数组中。
如何动态找出哪个产品对象具有特定的PRODUCT_ID const?
对不起,如果有点混乱!
答案 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 ];
您有两个解决方案来构建该数组:
如果您的课程很少,如果他们没有太多改变,那么第一个解决方案就更好了:它更快,更容易阅读/更改值,易于理解代码,并且您可以更好地控制数组值=&GT;你手动设置它们,这样你就没有错误的值。
第一个解决方案的问题是数组和所有产品类之间可能存在不一致:如果将PRODUCT_ID值更改为类,则必须手动将其更改为数组。
如果您有很多课程或经常更改,第二种解决方案会更好。但是,PHP反射可能会降低您的应用程序速度。要限制副作用,您可以:
您可以创建getProductClassById
之类的方法:
希望这会有所帮助,
干杯