这是我在每个页面上调用的类:
class ActionHandler {
var $smarty = NULL;
public function __construct() {
if($this->smarty == NULL){
$this->smarty = new Smarty();
$this->smarty->template_dir = TEMPLATE_DIR;
$this->smarty->compile_dir = COMPILE_DIR;
}
}
public function do_something($page_id) {
return $page_id + 1;
}
}
现在我有一个我想在模板中使用的自定义插件:
function smarty_function_something($params, &$smarty) {
return ActionHandler::do_something($params['page_id']);
}
但是我得到了Fatal error: Using $this when not in object context.
我知道为什么但不知道如何解决这个问题。有什么想法吗?
答案 0 :(得分:1)
尝试将do_something设为ActionHandler
class ActionHandler {
public static $smarty = NULL;
public function __construct()
{
if($this->smarty == NULL)
{
$this->smarty = new Smarty();
$this->smarty->template_dir = TEMPLATE_DIR;
$this->smarty->compile_dir = COMPILE_DIR;
}
}
public static function do_something($page_id)
{
return $page_id + 1;
}
}
当您尝试访问非静态方法时,我认为__construct在方法可用之前执行,但由于您尚未创建对象的实例,因此关键字$this
不存在。< / p>
您必须创建特定的静态方法。如果你要去MyObject::SomeMethod($param)
您还应该通过静态方法查看对象自动加载和自动初始化对象。
你也不需要专门定义public static $smarty = NULL;
的值,因为Null是任何新变量的默认值,只需执行
public static $smarty;
对你的问题稍微深入一点,你应该添加一个像这样的单例方法..
class ActionHandler
{
public static $smarty;
public static $singleton;
public function __construct()
{
if($this->smarty == NULL)
{
$this->smarty = new Smarty();
$this->smarty->template_dir = TEMPLATE_DIR;
$this->smarty->compile_dir = COMPILE_DIR;
}
}
public static GetSingleton()
{
if(self::$singleton == null)
{
self::$singleton = new ActionHandler();
}
return self::$singleton;
}
public static function do_something($page_id)
{
$_this = self::GetSingleton();
return $page_id + 1;
}
}
答案 1 :(得分:0)
您省略了几段代码:Smarty或ActionHandler对象的实例化,模板函数的注册,模板内容和Smarty::display()
调用,但在我自己的测试中,您的代码运行正常。在您的代码中,您没有尝试使用$this
而不在对象上下文中。
如果您有其他代码要发布(最好是仍会触发错误的完全减少),这可能有助于调试。
smarty的-test.php的:
<?php
include 'Smarty.class.php';
class ActionHandler {
var $smarty = NULL;
public function __construct() {
if($this->smarty == NULL){
$this->smarty = new Smarty();
$this->smarty->template_dir = __DIR__ . '/t';
$this->smarty->compile_dir = __DIR__ . '/tc';
$this->smarty->plugins_dir = __DIR__ . '/plugins';
}
}
public function do_something($page_id) {
return $page_id + 1;
}
}
$ah = new ActionHandler;
$ah->smarty->display('index.tpl');
插件/ function.something.php:
<?php
function smarty_function_something($params, &$smarty) {
return ActionHandler::do_something($params['page_id']);
}
T /在index.tpl:
Test: {something page_id=1}
输出:
测试:2