我有一个使用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);
答案 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
课程。