1

我有一个在 FuelPHP 框架上构建的 Web 应用程序。我的本地开发环境正在运行 PHP 5.4,而我的服务器正在运行 PHP 5.3。在我的开发环境中,从我的主模板文件中,我能够

<?php var_dump($this->active_request); ?>

这导致一堆关于请求的数据(一个 Fuel\Core\Request 对象)被转储到一个模式对话框中供我参考。但是,当我尝试在生产服务器(PHP 5.3)上运行完全相同的脚本时,它给了我旧的“ErrorException [错误]:不在对象上下文中使用 $this”

我知道使用实例化对象和静态访问方法之间的区别。我的问题是,为什么不同版本的 PHP 会将相同的模板文件视为具有不同的上下文?或者是否存在其他一些配置细微差别会导致两个环境的功能明显不同?

4

2 回答 2

2

我不知道 FuelPHP,但看起来模板包含在闭包中。从 PHP 5.4 开始,闭包可以绑定到一个对象并具有$this. 默认情况下,它是创建闭包的对象。另请参阅:https ://stackoverflow.com/a/5734109/664108

于 2013-02-05T01:16:14.113 回答
1

正确的。视图呈现在一个闭包中,该闭包旨在充当沙箱。

视图中的 $this 应该不起作用,但看起来在 PHP 5.4 中它会在调用堆栈中拾取更高的对象,因为它给你请求,而不是视图或你的控制器。这已经表明它使用起来不可靠,因为 $this 所代表的将取决于调用堆栈。

即使您不使用模板引擎,在视图中使用“逻辑”也被认为是不好的做法,而不是生成 HTML 所需的逻辑。将所需的数据从控制器传递给视图,或者使用 Viewmodel 来准备数据。

于 2013-02-13T09:46:16.287 回答