不应静态调用非静态方法AJAXChatFileSystem :: getFileContents()

问题描述 投票:1回答:1

我正在使用PHP 7在我的Apache服务器(2.4)中设置Ajax-Chat,但是我收到了这个错误

不推荐使用:非静态方法AJAXChatFileSystem :: getFileContents()不应在第37行的C:\ Apache24 \ htdocs \ services \ chat \ lib \ class \ AJAXChatTemplate.php中静态调用

我尝试将function getContent()更改为public static function getContent(),但之后它显示:

致命错误:未捕获错误:当不在C:\ Apache24 \ htdocs \ services \ chat \ lib \ class \ AJAXChatTemplate.php中的对象上下文中时使用$ this:36

class AJAXChatTemplate {

    var $ajaxChat;
    var $_regExpTemplateTags;
    var $_templateFile;
    var $_contentType;
    var $_content;
    var $_parsedContent;

    // Constructor:
    function __construct(&$ajaxChat, $templateFile, $contentType=null) {
        $this->ajaxChat = $ajaxChat;
        $this->_regExpTemplateTags = '/\[(\w+?)(?:(?:\/)|(?:\](.+?)\[\/\1))\]/se';
        $this->_templateFile = $templateFile;
        $this->_contentType = $contentType;
    }

    function getParsedContent() {
        if(!$this->_parsedContent) {
            $this->parseContent();
        }
        return $this->_parsedContent;
    }

     function getContent() {
        if(!$this->_content) {
            $this->_content = AJAXChatFileSystem::getFileContents($this->_templateFile);
        }
        return $this->_content;
    }
}
php ajax chat non-static
1个回答
1
投票

在PHP中静态调用非静态方法是deprecated behaviour since version 7.0并引发E_DEPRECATED警告。这意味着对此行为的支持有效,但可能(并且可能将)在将来的版本中删除。

此行为在PHP版本5 *中引发了E_STRICT警告。

将自己的AJAXChatTemplate::getContent()方法更改为static不起作用,因为它使用$this,它只在类的实例的上下文中有意义。因此,它会在静态上下文中触发致命错误。

您正在使用AJAX-Chat库 - 您尚未说明您使用的是哪个版本,但有一个issue可以讨论您遇到的错误。

与此报告的问题一致,a commit对此库的最新版本进行了更改,这是一种静态行为。


要解决您的问题,您有两种选择:

继续使用您当前安装的AJAX-Chat版本

只需非静态地使用AJAXChatFileSystem::getFileContents()。创建类的实例并通过修改getContent()方法来使用它,如下所示:

function getContent()
{
    if (!$this->_content) {
        $ajaxChatFileSystem = new AJAXChatFileSystem(); 
        $this->_content = $ajaxChatFileSystem->getFileContents($this->_templateFile); 
    }

    return $this->_content;
}

升级到此库的最新版本并使用静态方法

似乎没有更改日志,因此您应该在使用AJAX-Chat的任何地方测试代码,以确保没有重大更改。


从技术上讲,你有第三种选择:因为这是一个E_DEPRECATED警告 - 意味着该功能在未来日期被标记为删除 - 你现在可以安全地忽略此警告。

应禁止在生产代码中向用户显示E_DEPRECATED警告(与所有通知,警告和错误一样)。

但是,我不建议这样做,因为您的日志将充满E_DEPRECATED警告。此外,如前所述,PHP的未来版本可能会删除对静态调用非静态方法的支持。

希望这可以帮助 :)

© www.soinside.com 2019 - 2024. All rights reserved.