您好我有一个包含两种方法的课程。 其中一个是初始化会话,另一个是重定向网页 我写了这个课,可以反复调用它。
$obj->setSession(key,value)->redirect(url);
在此模式下,会话首先被初始化,然后重定向到下一页。 但如果它是这样写的
$obj->redirect(url)->setSession(key,value);
它只是重定向到定义的位置q会话不再被初始化.. 调用resirect方法时,页面会立即更改并导致第二种方法不被调用。 有没有办法能够反复调用方法而不需要考虑它们的顺序?
答案 0 :(得分:0)
当我经常遇到这个问题时,我会在$obj
对象中添加一个名为render()
或done()
的方法或类似的东西来检查我之前定义的所有标志。其中一个标记可能是header
标记,这是redirect
方法通常header(Location: $yourDestUrl)
的标记。
所以你最终得到的结果是:
$obj->redirect(url)->setSession(key,value)->render();
答案 1 :(得分:0)
当您调用redirect
或setSession
等方法时,请将这些操作放入"堆栈"作为你上课的财产。
然后,当调用所有方法时,调用一个名为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();