1

假设我想要一组对象,每个对象都应该有自己的唯一 ID。不需要什么花哨的东西,只需要一个字母表示它是哪种类型的对象,一个数字表示已经创建了多少个对象。例如,a0、a1、b0、c0、c1、c2、c3 等等。

我不想设置全局变量来跟踪每个对象有多少已经存在,我想用一个类来做。像这样:

class uniqueIDGenerator
{
  private $numberAObjs;
  private $numberBObjs;
  private $numberCObjs;

  public function generateID ($type) {
    if($type === "A") {
      return 'a' . (int) $this->$numberAObjs++;
    } else if($type === "B") {
      return 'b' . (int) $this->$numberBObjs++;
    } else if($type === "C") {
        return 'c' . (int) $this->$numberCObjs++;
    }
  }
}

class obj
{
  private $id;

  function __construct($type) {
    $this->id = uniqueIDGenerator::generateID($type);
  }
}

这样做的问题是,如果 uniqueIDGenerator 未实例化,它的 generateID 函数将始终为每种类型(例如 a0、b0、c0 等)返回相同的值,因为它的私有变量实际上并未在内存中创建。同时,让它成为 obj 的属性是行不通的,因为每次创建一个 obj 时,它都会有自己的 uniqueIDGenerator 实例,所以它也总是返回 a0, b0, c0,(假设它只被调用一次在该对象的方法中)等等。

唯一的选择似乎是让 uniqueIDGenerator 成为自己的全局实例,以便 obj 的构造函数可以引用它,但这似乎是糟糕的编码实践。是否有任何好的 OOP 方法可以使所有对象保持分离和组织?

4

1 回答 1

1

首先您可以修改对象构造函数:

class obj
{
  private $id;

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

...

$id_generator = new uniqueIDGenerator(); // instanciation of the generator

$obj1 = new obj(type, $id_generator->generateID($type));
$obj2 = new obj(type, $id_generator->generateID($type));
$obj3 = new obj(type, $id_generator->generateID($type));
...

在我的项目中,我会创建一个名为 ObjectFactory 的类:

    class ObjectFactory {
       private $id_generator;

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

       public function create_object($type) {
          return new obj($this->id_generator->generateID($type));
       }
    }

...

$id_generator = new uniqueIDGenerator(); // instanciation of the generator
$obj_factory = new ObjectFactory($id_generator); 

$obj1 = obj_factory->create_object($type);
$obj2 = obj_factory->create_object($type);
$obj3 = obj_factory->create_object($type);

最后,为了避免使用这个类的全局实例,你可以做一个单例(适应你的情况):

class uniqueIDGenerator
{
  private $numberAObjs;
  private $numberBObjs;
  private $numberCObjs;

  public static $instance = null;

  public function __construct() {
    $numberAObjs = 0;
    $numberBObjs = 0;
    $numberCObjs = 0;
  }

  public static function generateID($type) {
     if(!self::$instance)
        self::$instance = new uniqueIDGenerator();

     return self::$instance->generateID2($type);
  }

  private function generateID2 ($type) {
    if($type === "A") {
      return 'a' . (int) $this->numberAObjs++;
    } else if($type === "B") {
      return 'b' . (int) $this->numberBObjs++;
    } else if($type === "C") {
        return 'c' . (int) $this->numberCObjs++;
    }
  }
}

uniqueIDGenerator::generateID("A");
于 2013-10-30T17:19:24.837 回答