0

クラスの 1-* インスタンスを作成するループがあります。すべてのクラスは 1 つの抽象クラスの子クラスであるため、動作は異なりますが、応答はすべて同じです。このループは、作成、検証、実行の 3 回実行されます。ただし、クラス間のビジネス ロジックに遭遇しています。が作成された場合、実行できません。が作成された場合は、実行する必要があります。現在、これらのチェックはすべてループ自体にあり、複雑になり、元のアイデアよりも柔軟性が低下しています。

Q: ビジネス ロジックをクラスの検証関数に移動する方法はありますか?

class Parent{
    abstract function validate();
    abstract function run();
}

class A extends Parent{
    function validate(){/*validation*/}
    function run(){/*what A does*/}
}

class B extends Parent{
    function isClassAthere(){}
    function validate(){
       // validation
       if($this->isClassAthere()) return FALSE; // this is the one I want
    }
    function run(){/*what B does*/}
}

class C extends Parent{
    function isClassBthere(){}
    function validate(){
       // validation
       if($this->isClassBthere()) return TRUE;
    }
    function run(){/*what C does*/}
}

すべての呼び出し元

foreach( $classnames as $index=>$name ){
    $instances[$index] = new $name();
    if(!$instances[$index]->validate()) return FALSE;
    // Business logic is here, I want to move it to validate()
}
foreach( $instances as $instance ){
    $instance->run();
}
4

2 に答える 2

2

作成したすべてのインスタンスを親クラスの静的プロパティとして保存してみることができます

class B{
  // static properties are accessible
  // though no instance of the class
  // has been created yet
  static public instances = array();

  // php magic function __construct
  // gets called every time an object
  // of this class gets created
  public function __construct(){
    B::instances[] = $this;
  }
  ..
}

class C{
  ...
  public function validate(){
    // as said before, B::instances
    // is available, even if there is no
    // object of class B.
    return ( count(B::instances) > 0 ) ? true : false;
  }
于 2013-10-04T16:38:54.597 に答える