问题描述
尝试在我的 Xampp Apache 服务器上安装最新的 Invision Power Board 时,出现此错误:
Fatal error: Cannot make static method XMLReader::open() non static in class IPS\Xml\_XMLReader in D:\xampp\htdocs\PATH_TO_IPS_INSTALL\system\Xml\XMLReader.PHP on line 34
这是我的 PHP.ini 扩展部分的摘录
extension=bz2
extension=curl
extension=ffi
extension=ftp
extension=fileinfo
extension=gd
extension=gettext
extension=gmp
extension=intl
extension=imap
extension=ldap
extension=mbstring
extension=exif
extension=MysqLi
extension=oci8_12c
extension=odbc
extension=openssl
extension=pdo_firebird
extension=pdo_MysqL
extension=pdo_oci
extension=pdo_odbc
extension=pdo_pgsql
extension=pdo_sqlite
extension=pgsql
extension=shmop
extension=soap
extension=sockets
extension=sodium
extension=sqlite3
extension=tidy
extension=xsl
我该怎么做才能消除错误?
编辑: 这是从第 23 行开始的内容
class _XMLReader extends \XMLReader
{
/**
* Open a file or URL with XMLReader to read it
*
* @param string $uri The URI/path to open
* @param string $encoding The encoding to use,or NULL
* @param int $options Bitmask of LIBXML_* constants
* @return bool
* @note We are disabling network access while loading the content to prevent XXE
*/
public function open( $uri,$encoding=NULL,$options=0 )
{
if( $options === 0 )
{
$options = LIBXML_NONET;
}
return parent::open( $uri,$encoding,$options );
}
}
解决方法
错误似乎是子类试图用非静态 open()
方法重载静态 open()
方法。来自https://www.php.net/manual/en/migration80.incompatible.php:
XMLReader
XMLReader::open() 和 XMLReader::xml() 现在是静态方法。他们 仍然可以作为实例方法调用,但继承类需要 如果它们覆盖这些方法,则将它们声明为静态。
由于这是 PHP 8.0.0 中的更改,我猜测您使用的 PHP 版本 >= 8.0.0 与 PowerBoard 不兼容。
可能有一种方法可以将这段代码更改为在 8.0.0 上运行,但我的猜测是,如果您使用的是不受支持的主要版本,您可能会遇到除此之外的更多问题。
我的建议是安装 Power Board 推荐的 PHP 版本。我试图在 Power Board 网站上找到那个版本,但简单地看一看并没有发现任何东西。