Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/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 - Fatal编程技术网

Php 查找具有特定类常量的类

Php 查找具有特定类常量的类,php,Php,我有许多产品类,它们扩展了父产品类。其中每一个都实现了自己版本的PRODUCT_ID const。customer对象中的方法将从DB中提取产品ID。然后我想实例化相关的产品对象并将其添加到数组中 我可以动态地找出哪个产品对象具有特定的产品ID常量吗 抱歉,如果这有点混乱的话 唯一的方法是首先循环所有声明的类,然后检查它们是否是父产品的子类,最后检查product_ID常量是否已定义并等于您要查找的产品 这里有一个例子: <?php class Product { } class St

我有许多产品类,它们扩展了父产品类。其中每一个都实现了自己版本的PRODUCT_ID const。customer对象中的方法将从DB中提取产品ID。然后我想实例化相关的产品对象并将其添加到数组中

我可以动态地找出哪个产品对象具有特定的产品ID常量吗


抱歉,如果这有点混乱的话

唯一的方法是首先循环所有声明的类,然后检查它们是否是父产品的子类,最后检查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种),它们会不断变化,因此我认为解决方案越动态越好。