我有一个创建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();
}
答案 0 :(得分: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;
}
答案 1 :(得分:1)
也许您应该将验证移出课程。如果您将关注点分离为有效的对象,以及告诉他们做什么工作的对象,那么您可能拥有自己想要的东西。
class A{}
class B{}
class ABValidator{
public function validate($instances = array())
}
ABValidator::validate(array(
new A(),
new B(),
));