在非对象上调用成员函数createTemplate()

时间:2012-08-13 11:07:31

标签: php smarty

我正在迁移一个基于Smarty的网站,我试图满足所有的先决条件,这样就不会有任何问题,但是(“总是”我可能会添加)我有这个问题,安装后所有的必要的软件包网站不起作用(浏览器中有HTTP 500错误)我在错误日志中发现了这个错误:

  

PHP致命错误:在第47行的/var/www/vhosts/placeholder.com/httpdocs/includes/sysplugins/smarty_internal_templatebase.php中的非对象上调用成员函数createTemplate()

这实际上出现在index.php文件中,我有这段代码

$smarty = new SmartyEC($page->template);
$smarty->display('index.tpl');

问题在于在某处显示索引模板,但我无法弄清楚原因。

为了提供更多上下文,我的构造函数如下所示:

<?php

require 'Smarty.class.php';

class SmartyEC extends Smarty{

    function SmartyEC()
    {
        function __construct()  
        {
            parent::__construct();
            $appname ='website';
            $path= Utils::getTemplatesPath();   
            $this->caching = false;

        }       

    }
}

?>

服务器有PHP 5.3.2。已安装并安装了最新版本的Smarty。我检查了配置路径并相应地更改了它们以及文件包含。

提前谢谢!

更新#1

我也试过删除这样的函数定义:

class SmartyEC extends Smarty {
    public function __construct()  
    {
        parent::__construct();
        $appname ='website';
        $path= Utils::getTemplatesPath();   
        $this->caching = false;
    }
}

但错误现在变为:

  

未捕获的异常'SmartyException',消息'无法加载   模板文件'index.tpl''   /var/www/vhosts/website/httpdocs/includes/sysplugins/smarty_internal_templatebase.php:127\nStack   追踪:\ n#0   /var/www/vhosts/website/httpdocs/includes/sysplugins/smarty_internal_templatebase.php(374):   Smarty_Internal_TemplateBase-&gt; fetch('index.tpl',NULL,NULL,NULL,   true)\ n#1 /var/www/vhosts/website/httpdocs/index.php(58):   Smarty_Internal_TemplateBase-&gt; display('index.tpl')\ n#2 {main} \ n   投入   /var/www/vhosts/website/httpdocs/includes/sysplugins/smarty_internal_templatebase.php   在第127行

更新2

我发现这个主题CodeIgniter + Smarty = Error会出现同样的错误,但与此处的情况不同。更令人感兴趣的是,在另一台服务器上它运行正常,所以我的猜测是有一个配置下降而不是编程问题。

2 个答案:

答案 0 :(得分:1)

您确定__construct()SmartyEC()内的嵌套吗? (修辞问题,抱歉)

如果你明确命名了你的函数public,那么错误就会立刻浮出水面:

class SmartyEC extends Smarty {
    public function SmartyEC()
    {
        public function __construct()  
        {
            parent::__construct();
            $appname ='website';
            $path= Utils::getTemplatesPath();   
            $this->caching = false;
        }
    }
}

给你

Parse error: syntax error, unexpected T_PUBLIC in test.php on line 7

从PHP5开始,我们不再使用class-name-constructors了。我们使用__construct()。除非您在某处明确地调用$ec = new SmartyEC(); $ec->SmartyEC();,否则应删除该函数声明:

class SmartyEC extends Smarty {
    public function __construct()  
    {
        parent::__construct();
        $appname ='website';
        $path= Utils::getTemplatesPath();   
        $this->caching = false;
    }
}

另请注意,您的示例调用$smarty = new SmartyEC($page->template);会传递一个参数 - 一个既不SmartyEC()也不__construct()的参数。

答案 1 :(得分:0)

最后我明白了......这是一个由四个因素构成的复杂因素:

  1. 我从聪明的3.1.11降级到3.0.7
  2. 我找到了另一个与旧主机相关的配置路径 - 得到它很容易
  3. .tpl文件包含php代码,例如“{php} some code here {/ php}” 并在构造函数
  4. 中使用$this->allow_php_tag = true;修复它
  5. 即使我设置了正确的权限,系统也无法 重写编译文件夹因此我删除了所有内容 编译文件夹。