Несовместимый get_class_methods против method_exists при использовании символов UTF8 в коде PHP - PullRequest
1 голос
/ 19 февраля 2010

У меня есть этот класс в файле в кодировке UTF-8 с именем EnUTF8.Class.php :

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 ]

1 голос
/ 19 февраля 2010

Ре ваше обновление, я думаю, что оно идет в этом направлении:

С помощью setlocale(), помимо прочего, вы устанавливаете

LC_CTYPE для классификации и преобразования символов, например strtoupper ()

method_exists() равно без учета регистра , поэтому в методе method_exists () необходимо выполнить некоторое преобразование регистра. Бьюсь об заклад, разрывы строк в этой точке. Почему это сломалось бы, если бы вы явно указали испанский язык, а если нет, то я не понимаю.

Существует ли специальное испанское правило для заглавных букв ñ, кроме как сделать его Ñ? Можно ли в нижнем регистре ñ?

Возможно также, что испанский язык, на который пытается переключиться функция, вообще не установлен в вашей системе, и резервный язык отличается от используемого по умолчанию PHP.

1 голос
/ 19 февраля 2010

Если вы работаете с PHP 5.x, вам не следует разрабатывать использование имен в UTF-8 для ваших переменных / classes / functions / ...: в некоторых случаях для некоторых символов это будет работать, но в общая ситуация, это не будет.

И обратите внимание, что это верно для идентификаторов, но у вас будет такая же проблема, например, для содержимого переменных - например, чтобы манипулировать строками в UTF-8, вам придется работать с mb_* семейство функций.


Это потому, что PHP 5.x на самом деле не использует Unicode: это большая вещь, которая запланирована для PHP 6 (которая еще даже не находится в стадии альфа) * ​​1012 *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...