0

我正在迁移一个基于 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;
    }
}

但现在错误变为:

在 /var/www/vhosts/website/httpdocs/includes/sysplugins/smarty_internal_templatebase.php:127 中带有消息“无法加载模板文件 'index.tpl'”的未捕获异常“SmartyException”:127\n堆栈跟踪:\n#0 /var /www/vhosts/website/httpdocs/includes/sysplugins/smarty_internal_templatebase.php(374): Smarty_Internal_TemplateBase->fetch('index.tpl', NULL, NULL, NULL, true)\n#1 /var/www/vhosts/ website/httpdocs/index.php(58): Smarty_Internal_TemplateBase->display('index.tpl')\n#2 {main}\n 在 /var/www/vhosts/website/httpdocs/includes/sysplugins/smarty_internal_templatebase 中抛出。第 127 行的 php

更新 2

我发现这个主题CodeIgniter + Smarty = Error给出了相同的错误,但情况与这里不同。更有趣的是,在另一台服务器上它工作正常,所以我的猜测是存在配置故障而不是编程问题。

4

2 回答 2

1

你确定 inside 的嵌套__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 开始,我们不再使用类名构造函数。我们使用__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()预期的参数。

于 2012-08-13T12:33:06.490 回答
0

最后我明白了......这是一个无效的 4 个因素的复合体:

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