我正在使用PHP 7在Apache Server(2.4)中设置Ajax-Chat,但出现此错误
不建议使用:不应在第37行的 C:\ Apache24 \ htdocs \ services \ chat \ lib \ class \ AJAXChatTemplate.php 中静态调用非静态方法AJAXChatFileSystem :: getFileContents() / p>
我尝试将function getContent()
更改为public static function getContent()
,但之后显示:
致命错误:未捕获的错误:在不在C:\ Apache24 \ htdocs \ services \ chat \ lib \ class \ AJAXChatTemplate.php:36的对象上下文中时使用$ this
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;
}
}
答案 0 :(得分:1)
在PHP中静态调用非静态方法是deprecated behaviour since version 7.0,并引发E_DEPRECATED
警告。这意味着对这种行为的支持有效,但是在将来的版本中可能会(可能会)删除。
此行为在PHP版本5 *中引发了E_STRICT
警告。
将自己的AJAXChatTemplate::getContent()
方法更改为静态方法是行不通的,因为它使用的$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版本可能会删除对静态调用非静态方法的支持。
希望这会有所帮助:)