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_Design Patterns - Fatal编程技术网

Php 在级联中运行类方法

Php 在级联中运行类方法,php,oop,design-patterns,Php,Oop,Design Patterns,我有一个系统,它被设计成做一种级联——在前一个条件成功时获得调用的方法序列 下面的代码就是一个例子,我认为这不是一个最好的实践,所以如果我能得到一些重构的建议,可能会使用一个设计模式或者一个不同于这个系统的设计模式,那就太好了 <?php class Model { public function isOk() { return true; } } class OtherClass { public function isOk()

我有一个系统,它被设计成做一种级联——在前一个条件成功时获得调用的方法序列

下面的代码就是一个例子,我认为这不是一个最好的实践,所以如果我能得到一些重构的建议,可能会使用一个设计模式或者一个不同于这个系统的设计模式,那就太好了

<?php
class Model
{
    public function isOk()
    {
        return true;
    }
}

class OtherClass
{
    public function isOk()
    {
        return true;
    }
}

class AnotherClass
{
    public function verifies()
    {
        return true;
    }
}

class Sequence
{
    public function fire()
    {

        $model = new Model();
        if($model->isOk()) {

            $otherclass = new OtherClass();
            if($otherclass->isOk()) {

                $anotherclass = new AnotherClass();
                if($anotherclass->verifies()) {

                    echo "We're done with the sequence.";

                    return true;

                } else {
                    return false;
                }

            } else {
                return false;
            }
        } else {
            return false;
        }

    }
}

$sequence = new Sequence();
echo $sequence->fire();
?>

我会避免深入嵌套if/else语句以增强可读性。一种方法是使用提前归还:

class Test1
{
    public function isOk()
    {
        echo 'Test1';
        return true;
    }
}

class Test2
{
    public function isOk()
    {
        echo 'Test2';
        return true;
    }
}

class Sequence
{
    public function fire()
    {
        $test1 = new Test1();
        if (!$test1->isOk()) {
            return false;
        }

        $test2 = new Test2();
        if (!$test2->isOk()) {
            return false;
        }

        echo "We're done with the sequence.";
        return true;
    }
}
如果您需要它更动态,您可以使用或


谢谢第二个例子看起来更清晰,但我在每个序列中都有一些“东西”,所以第一个例子可能是选项。我会看看是否有人提出了其他的解决方案,并会接受一个它会更好地解决我的问题。谢谢您是否考虑过将命令与责任链模式一起使用?嗨,Henrique,谢谢您的建议,但在这种情况下,责任链模式不符合目的。为什么不呢?你能解释一下吗?首先,我看不出有什么原因……我们的目的是,调用的类方法必须返回true,才能继续下面的操作。false表示总体失败,脚本执行必须终止。从我对CR d模式的理解来看,情况并非如此,但如果我没有正确理解,请纠正我。
class Sequence
{

    protected $sequence = array(
        array('Test1', 'isOk'),
        array('Test2', 'isOk'),
    );

    public function fire()
    {
        foreach ($this->sequence as $callback) {
            if (!call_user_func(array(new $callback[0], $callback[1]))) {
                return false;
            }
        }
        echo "We're done with the sequence.";
        return true;
    }
}