php 自动加载指定函数中抛出异常乱码问题


昨天在德问看到一个问题,经过问题的描述,以及 @cx1934 的回答,我复现了那个乱码的问题,以下是复现过程,以及一些疑问:
相关问题 @php 诡异问题: 类找不到出现乱码

问题不好描述,只能贴出几段相关测试代码。

测试环境 WAMP5 Version 1.7.4 php 5.2.5
php.ini :
zlib.output_compression = On

详细代码如下(A):

   
  spl_autoload_register(array('c','autoload'));
  

class a extends b{}

class c {

public static function autoload($className){
echo $className;
throw new Exception('xxx');
}
}

请输入图片描述

代码(B):

   
  spl_autoload_register(array('c','autoload'));
  
//class a extends b{}
class c {

public static function autoload($className){
echo $className;
throw new Exception('xxx');
}
}

try{
c::autoload('b');
}catch(Exception $e) {
echo $e->getMessage();
}

请输入图片描述
代码(C):

   
  spl_autoload_register(array('c','autoload'));
  

class a extends b{}

class c {

public static function autoload($className){
ini_set('zlib.output_compression','Off');
echo $className;
throw new Exception('xxx');
}
}

请输入图片描述

代码(D)

   
  spl_autoload_register(array('c','autoload'));
  

class a extends b{}

class c {

public static function autoload($className){
header("Content-Encoding: gzip");
echo $className;
throw new Exception('xxx');
}
}

请输入图片描述

代码(E)

   
  spl_autoload_register(array('c','autoload'));
  

class a extends b{}

class c {
public static function autoload($className){
echo $className;

}
}

请输入图片描述

1,以上代码共同点就是(除B),都无法catch autoload函数抛出的异常;
2,通过 A 与 B 比较,只有spl_autoload_register()函数触发调用的 autoload() 方法 抛出异常才会 乱码;说明是spl_autoload_register()问题。
3,通过 A 与 C,D比较,说明是gzip的问题。
4,通过 A,C,D 与 E 比较,说明是 throw new Exception('xxx');

以上最核心的问题其实还没有找到。请大家运行上边的代码,找到问题的真正原因,更重要的是详细说明下是什么导致的。

php

恋文★86 12 years, 6 months ago

我提的那个问题找到 php5.2.x spl_autoload 对应的方法中不能 throw 异常
不知道 5.3是不是修改了 擦
https://bugs.php.net/bug.php?id=45656

传说D一日君 answered 12 years, 6 months ago

Your Answer