类实例之间的通信


communication between instances of classes

>我有一个循环来创建类的 1-* 实例。所有类都是一个抽象类的子类,因此它们都响应相同,尽管它们执行不同的事情。此循环运行 3 次:创建、验证、运行。但是,我在类之间遇到了业务逻辑。如果已创建,则无法运行。如果已创建,则必须运行。目前,所有这些检查本身都在循环中,它变得越来越混乱,使其不如我最初的想法灵活。

问:有没有办法将业务逻辑移动到类的验证函数中?

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();
}

您可以尝试将所有创建的实例保存为父类的静态属性

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;
  }

也许你应该把验证移出类。如果你把关注点分成起作用的对象和告诉它们工作的对象,那么你可能拥有你想要的东西。

class A{}
class B{}
class ABValidator{
    public function validate($instances = array())
}
ABValidator::validate(array(
    new A(),
    new B(),
));