Smarty自定义插件使用基类

时间:2010-09-10 14:06:45

标签: php smarty

这是我在每个页面上调用的类:

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.

我知道为什么但不知道如何解决这个问题。有什么想法吗?

2 个答案:

答案 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