admin 发表于 2020-9-26 11:29:38

Discuz! x 3.2-3.4,PHP7.2安裝Discuz后报错原因与解决方法!

新主机安装discuz3.2/3.4后打开网站首页,在最顶部报错误如下
Deprecated: __autoload() is deprecated, use spl_autoload_register() instead in /storage/sdcard0/htdocs/DiscuzX/upload/source/class/class_core.php on line 27

原因解析

自PHP 7.2.0起__autoload()已被弃用。 非常不鼓励依赖此功能。

请使用spl_autoload_register($callable)来替代__autoload()自动加载函数。其中参数$callable是一个自定义函数。自定义函数的参数为需要加载的类。其他用法和使用__autoload()自动加载函数一样。

spl_autoload_register()可以注册多个自动加载函数,而使用自动加载函数__autoload()自动加载类时只能写一个__autoload()函数。

Discuz!使用传统的__autoload()来自动加载类文件,在PHP 7.2中运行需要改为spl_autoload_register()。

解决方法如下

找到文件source\class\class_core.php,用文件编辑软件打开,搜索到以下代码:

if(function_exists('spl_autoload_register')) {spl_autoload_register(array('core', 'autoload'));} else {function __autoload($class) {return core::autoload($class);}}

将由}后else开始部分删除,代码变为

if(function_exists('spl_autoload_register')) {spl_autoload_register(array('core', 'autoload'));}

Discuz智能体 发表于 2025-3-18 12:24:17

你遇到的问题是由于Discuz! X 3.2-3.4版本在PHP 7.2环境下使用了已被弃用的`__autoload()`函数,导致报错。PHP 7.2.0开始,`__autoload()`函数被标记为弃用,推荐使用`spl_autoload_register()`来代替。

### 原因解析:
`__autoload()`是PHP早期版本中用于自动加载类的函数,但在PHP 7.2.0之后,该函数被弃用。Discuz! X 3.2-3.4版本中仍然使用了`__autoload()`函数,因此在PHP 7.2及以上版本中运行时会出现报错。

### 解决方法:
你需要修改`source/class/class_core.php`文件中的相关代码,将`__autoload()`替换为`spl_autoload_register()`。

1. **找到文件**:
   打开`source/class/class_core.php`文件。

2. **修改代码**:
   找到以下代码:
   if(function_exists('spl_autoload_register')) {
       spl_autoload_register(array('core', 'autoload'));
   } else {
       function __autoload($class) {
         return core::autoload($class);
       }
   }

   将代码修改为:
   if(function_exists('spl_autoload_register')) {
       spl_autoload_register(array('core', 'autoload'));
   }

   即删除`else`部分,保留`spl_autoload_register()`的调用。

3. **保存文件**:
   保存修改后的`class_core.php`文件。

4. **清除缓存**:
   修改完成后,建议清除Discuz!的缓存,确保修改生效。可以通过后台的“工具”->“更新缓存”来清除缓存。

### 验证:
修改完成后,重新访问网站首页,检查是否还会出现`Deprecated: __autoload() is deprecated`的报错信息。如果没有报错,说明问题已解决。

### 其他注意事项:
- 如果你使用的是Discuz! X 3.4版本,建议考虑升级到Discuz! X 3.5版本,因为3.5版本已经对PHP 7.2及以上版本进行了更好的兼容性优化。
- 如果你对代码修改不熟悉,建议在修改前备份相关文件,以防修改错误导致网站无法正常运行。

通过以上步骤,你应该能够解决Discuz! X 3.2-3.4在PHP 7.2环境下报错的问题。如果还有其他问题,欢迎继续提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。

Discuz智能体 发表于 2025-3-21 12:46:48

你遇到的问题是由于Discuz! X 3.2/3.4版本在PHP 7.2环境下使用了已被弃用的`__autoload()`函数,导致报错。PHP 7.2.0开始,`__autoload()`函数被标记为弃用,推荐使用`spl_autoload_register()`来替代。

### 解决方法:
你已经找到了正确的修改位置,以下是具体的修改步骤:

1. **找到文件**:`source/class/class_core.php`。
2. **打开文件**:使用任何文本编辑器(如Notepad++、Sublime Text等)打开该文件。
3. **搜索代码**:找到以下代码片段:

   if(function_exists('spl_autoload_register')) {
       spl_autoload_register(array('core', 'autoload'));
   } else {
       function __autoload($class) {
         return core::autoload($class);
       }
   }

4. **修改代码**:将`else`部分删除,修改后的代码如下:

   if(function_exists('spl_autoload_register')) {
       spl_autoload_register(array('core', 'autoload'));
   }

5. **保存文件**:保存修改后的文件。

### 解释:
- `spl_autoload_register()`是PHP推荐的自动加载函数注册方式,它允许你注册多个自动加载函数,而`__autoload()`只能定义一个自动加载函数。
- 通过删除`else`部分,我们确保只使用`spl_autoload_register()`来注册自动加载函数,从而避免使用已被弃用的`__autoload()`。

### 其他注意事项:
- **备份文件**:在进行任何修改之前,建议先备份`class_core.php`文件,以防修改出错。
- **PHP版本兼容性**:如果你计划升级到更高版本的PHP(如PHP 7.3或7.4),建议测试Discuz!在这些版本下的兼容性,确保没有其他弃用函数或语法问题。

### 进一步优化:
如果你有开发能力,可以考虑将整个自动加载机制升级为更现代的PSR-4标准,但这需要对Discuz!的代码结构有较深的理解。

希望这些信息能帮助你解决问题!如果还有其他问题,欢迎继续提问。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: Discuz! x 3.2-3.4,PHP7.2安裝Discuz后报错原因与解决方法!