在PHP代码中使用UTF8字符时,get_class_methods与method_exists不一致

时间:2010-02-19 11:05:50

标签: php oop encoding

我把这个类放在一个名为 EnUTF8.Class.php 的UTF-8编码文件中:

class EnUTF8 {

    public function ñññ() {

        return 'ñññ()';

    }
}

并在另一个UTF-8编码文件中:

require_once('EnUTF8.Class.php');
require_once('OneBuggy.Class.php');

$utf8 = new EnUTF8();
//$buggy = new OneBuggy();

echo (method_exists($utf8, 'ñññ')) ? 'ñññ() exists!' : 'ñññ() does not exist...';

echo "\n\n----------------------------------\n\n"

print_r(get_class_methods($utf8));

echo "\n----------------------------------\n\n"

echo $utf8->ñññ();

产生预期结果:

ñññ() exists!

----------------------------------

Array
(
    [0] => ñññ
)

----------------------------------

ñññ()

但是如果......

require_once('EnUTF8.Class.php');
require_once('OneBuggy.Class.php');

$utf8 = new EnUTF8();
$buggy = new OneBuggy();

echo (method_exists($utf8, 'ñññ')) ? 'ñññ() exists!' : 'ñññ() does not exist...';

echo "\n\n----------------------------------\n\n"

print_r(get_class_methods($utf8));

echo "\n----------------------------------\n\n"

echo $utf8->ñññ();

然后出现了怪异!!!:

ñññ() does not exist!

----------------------------------

Array
(
[0] => ñññ
)

----------------------------------

Fatal error: Call to undefined method EnUTF8::ñññ() in /var/www/test.php on line 16

嗯,问题是 OneBuggy.Class.php 也是UTF-8编码,与 EnUTF8.Class.php 绝对分享,所以...

错误在哪里?

更新:

好了,经过长时间的调试,我在 OneBuggy.Class.php 构造函数中找到了这个:

setlocale (LC_ALL, "es_ES@euro", "es_ES", "esp");

所以我做了......

//setlocale (LC_ALL, "es_ES@euro", "es_ES", "esp");

现在它有效,但为什么?。

2 个答案:

答案 0 :(得分:1)

如果您正在使用PHP 5.x,则不应使用UTF-8中的名称开发变量/ classes / functions / ...:在某些情况下,对于某些字符,它将起作用,但在一般情况,它不会。

请注意这对于标识符是正确的,但是对于变量的内容你也会遇到同样的问题 - 例如,要操作UTF-8中的字符串,你必须使用{{3职业家庭。


这是因为PHP 5.x并没有真正使用Unicode:它是 计划用于PHP 6 的大事(它甚至还没有在alpha阶段)

答案 1 :(得分:1)

重新更新,我认为它是朝这个方向发展的:

使用setlocale()等设置

  

LC_CTYPE用于字符分类和转换,例如strtoupper()

method_exists()case insensitive,因此在method_exists()中,必须进行一些大小写转换。我打赌那个字符串断了。如果您明确设置西班牙语语言环境,为什么会中断,但如果不这样做则不会,但我不明白。

是否有一个特定的西班牙语规则用于大写ñ而不是Ñ?是否可以小写ñ

也可能是函数试图切换到的西班牙语语言环境根本没有安装在你的系统上,而且回退语言环境与PHP默认使用的不同。