定义类方法的方法,而不需要保持调用它们的顺序

时间:2016-09-12 16:06:20

标签: php class oop design-patterns methods

您好我有一个包含两种方法的课程。 其中一个是初始化会话,另一个是重定向网页 我写了这个课,可以反复调用它。

  $obj->setSession(key,value)->redirect(url);

在此模式下,会话首先被初始化,然后重定向到下一页。 但如果它是这样写的

  $obj->redirect(url)->setSession(key,value);

它只是重定向到定义的位置q会话不再被初始化.. 调用resirect方法时,页面会立即更改并导致第二种方法不被调用。 有没有办法能够反复调用方法而不需要考虑它们的顺序?

2 个答案:

答案 0 :(得分:0)

当我经常遇到这个问题时,我会在$obj对象中添加一个名为render()done()的方法或类似的东西来检查我之前定义的所有标志。其中一个标记可能是header标记,这是redirect方法通常header(Location: $yourDestUrl)的标记。

所以你最终得到的结果是:

$obj->redirect(url)->setSession(key,value)->render();

答案 1 :(得分:0)

当您调用redirectsetSession等方法时,请将这些操作放入"堆栈"作为你上课的财产。

然后,当调用所有方法时,调用一个名为exec的方法(例如),该方法将执行" stack"中的所有操作。

这是一个基于这个想法的基类,使用魔术方法:

class Stack {

    private $_stack = array();

    public function __call($method, $args) {

        // Adding method to stack
        $this->_stack[$method] = $args;

        return $this;
    }

    public function __isset($name) {

        // Checks if method is in stack
        return isset($this->_stack[$name];
    }

    public function exec() {

        // setSession is executed first
        if (isset($this->setSession))
            call_user_func_array('setSessionMethod', $this->_stack['setSession']);


        // redirect is executed second
        if (isset($this->redirect))
            call_user_func_array('redirectMethod', $this->_stack['redirect']);

    }
}

要使用此课程,您可以:

$stack = new Stack;
$stack->redirect('arg')
      ->setSession('arg1', 'arg2')
      ->exec();