Php 查找具有特定类常量的类
我有许多产品类,它们扩展了父产品类。其中每一个都实现了自己版本的PRODUCT_ID const。customer对象中的方法将从DB中提取产品ID。然后我想实例化相关的产品对象并将其添加到数组中 我可以动态地找出哪个产品对象具有特定的产品ID常量吗Php 查找具有特定类常量的类,php,Php,我有许多产品类,它们扩展了父产品类。其中每一个都实现了自己版本的PRODUCT_ID const。customer对象中的方法将从DB中提取产品ID。然后我想实例化相关的产品对象并将其添加到数组中 我可以动态地找出哪个产品对象具有特定的产品ID常量吗 抱歉,如果这有点混乱的话 唯一的方法是首先循环所有声明的类,然后检查它们是否是父产品的子类,最后检查product_ID常量是否已定义并等于您要查找的产品 这里有一个例子: <?php class Product { } class St
抱歉,如果这有点混乱的话 唯一的方法是首先循环所有声明的类,然后检查它们是否是父产品的子类,最后检查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"
使用字段$product\u 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);
每个产品ID值对应一个唯一的产品类名,对吗?因此,如果没有关联的类,就不能有产品ID?所以,在本例中,您知道您有多少产品类。
如果一切都是真的,我认为最好的解决方案是创建这样一个数组
$pairs = array(
PRODUCT_ID_VALUE_ONE => 'classNameOne',
PRODUCT_ID_VALUE_TWO => 'classNameTwo',
// [...]
);
然后,当您想要检索与特定产品ID关联的类名时,您必须执行以下操作
$className = $pairs[ $myProductId ];
构建该阵列有两种解决方案:
- 手动构建
- 使用自动构建(如Francois所示)
如果您的类很少,并且没有太多更改,那么第一种解决方案会更好:它更快、易于读取/更改值、易于理解代码,并且您可以更好地控制数组值=>您可以手动设置它们,这样您就不会有错误的值
第一种解决方案的问题是数组和所有products类之间可能存在不一致:如果将PRODUCT_ID值更改为类,则必须手动将其更改为数组
如果您有很多类或者它们经常更改,那么第二种解决方案会更好。但是,PHP反射可能会降低应用程序的速度。要限制这种副作用,您可以:
- 只构建一次阵列
- 仅在需要时构建阵列一次
您可以创建类似于getProductClassById
的方法,该方法将:
- 检查上面的数组是否存在
- 如果需要,创建数组
- 在该数组中搜索
- 返回值
希望这会有所帮助
干杯每个类名只能有一个常量,而不是类实例。因此,使用您的方法,每个对象只能实例化一个产品。这就是你想要的吗?不确定,克林特。所有产品类的命名都不同。i、 e.产品1、产品2、产品3。所有扩展产品,但都有自己版本的类const product_ID。我只想动态地找出哪一个具有特定的product_ID值。啊,这正是我需要的!非常感谢。谢谢你,波莫,非常有帮助!我曾想过类似于第一个解决方案的东西,但我不想硬编码任何东西。我知道这可能会慢一些,但我只讨论少数产品(目前为5种),它们会不断变化,因此我认为解决方案越动态越好。