链调用结束时的PHP调用方法

时间:2014-09-02 17:36:40

标签: php chaining

我有一个使用Singleton原理的类,我有允许链接的方法。在它们的末尾你必须调用output()方法来呈现类,但我想知道是否有任何方法可以自动执行此操作。我尝试过使用__destruct,但它处理的时间很晚。我需要在脚本退出之前完成它。

class View {

private static $_instance = null,
               $_view;

public static $data;

private static function getInstance()
{
    // Instantiate the class
    if( self::$_instance === null ){
        self::$_instance = new self;
    }
    return self::$_instance;
}
public static function make( $view )
{
    $instance = self::getInstance();
    $file = explode( '.', $view );
    $file = DIR . 'core/views/' . $file[0] . '/' . $file[1] . '.php';
    self::$_view = $file;
    return $instance;
}
public function with($data)
{
    self::$data = $data;
    return $this;
}

}

它会像这样使用:

return View::make($view)->with($data);

2 个答案:

答案 0 :(得分:1)

我认为有些东西需要返回值,并将其回显(例如控制器)?如果是这样,您可以为View类使用__toString()魔术方法:

public function __toString()
{
    return $this->output();
}

理论逻辑:

$view = $controller->getIndex() // Returns your View instance
echo $view; // Magically converted to a string

旁注,你也可以用它来铸造:

$view = (string) View::make($view)->with($data); // will be the rendered view

关于__toString()的一个重要注意事项是不能在函数内抛出异常(即你的视图不能抛出一个异常)。如果抛出一个,PHP实际上会抛出一个不太有用的“__toString()不能抛出异常”异常。

答案 1 :(得分:0)

您可以使用__call(),但这需要$this上下文。

public function __call($method, $args)
{
    // ...
    // check if the current method being called is the last one needed, then
    // render the view output
    if ('lastMethod' == $method) {
        $this->render();
    }
}

在此示例中,如果您知道在视图呈现发生之前需要调用的最后一个方法的名称,那么您可以自动调用它。虽然,我建议你重写大部分View课程。