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

Php 类实例之间的通信

Php 类实例之间的通信,php,oop,Php,Oop,我有一个创建类的1-*实例的循环。所有类都是一个抽象类的子类,因此它们的响应都是相同的,尽管它们做的事情不同。 此循环运行3次:创建、验证、运行。但是,我遇到了类之间的业务逻辑。如果已创建,则无法运行。如果已创建,则必须运行。 目前,所有这些检查都在循环中,变得越来越混乱,并不如我最初的想法灵活 问:有没有办法将业务逻辑转移到类的验证函数中 class Parent{ abstract function validate(); abstract function run(); }

我有一个创建类的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 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(),
));

也许您应该将验证移出类。如果您将关注点分为可以工作的对象和告诉它们可以工作的对象,那么您可能会得到您想要的

class A{}

class B{}

class ABValidator{
    public function validate($instances = array())
}

ABValidator::validate(array(
    new A(),
    new B(),
));

你能再解释一下你的课是什么样子吗?也许你犯了一个OOP假设错误。给出的答案并不能让我满意。所有扩展父类的子类都有一个依赖关系,问题是,class
B
是否应该知道
a
是否存在,class
C
是否应该知道
B
是否存在。对我来说最明显的是一个进行验证的类,例如依赖性检查。函数名
isClassAThere
实际上是说
Class
,这是否检查类
A
是否存在?或者类
A
的实例化对象?您能再解释一下类的外观吗?也许你犯了一个OOP假设错误。给出的答案并不能让我满意。所有扩展父类的子类都有一个依赖关系,问题是,class
B
是否应该知道
a
是否存在,class
C
是否应该知道
B
是否存在。对我来说最明显的是一个进行验证的类,例如依赖性检查。函数名
isClassAThere
实际上是说
Class
,这是否检查类
A
是否存在?或者类
A
的实例化对象?我会试试这个。我喜欢这个主意。我试试这个。我喜欢这个主意。