Загадка про PHP. Номер 10.
Дано:
error_reporting(0);
$a = 'Kn';
$a = new $a.'ock';
class Knock
{
function Knock()
{
global $a;
print_r($a);
}
}
class Kn
{
function Kn()
{
global $a;
print_r($a);
}
}
Что будет в результате?
Будет ’Kn’ и сообщение об ошибке.
Комментарий для Улитка:
Во-первых, error_reporting(0), а во-вторых, даже без этого сообщения об ошибке не будет. Хотя, возможно, последнее зависит от версии, но я просто не вижу места где эта ошибка может возникнуть. у new просто более высокий приоритет по сравнению с конкатенацией, поэтому единственное спорное место там синтаксически верно.
Сообщение об ошибке будет в логе, по поводу того, что мы пытаемся выполнить конкатенацию объекта со строкой.
Комментарий для Улитка:
Странно, приведи строчку, пожалуйста. Мне кажется, что точка должна перевести объект в строковое представление (т. е. в «Object») с чем и произойдёт конкатенация.
Проверил — все так, никаких ошибок, в $a записывается ’Objectock’.
Кстати, пример твой не работает, пришлось его руками набирать.
Специально так сделал или случайно получилось?
Комментарий для Улитка:
Как это не работает? Только что попробовал — всё работает.
Сама программа работает, но если ее вставить в Блокнот через Copy+Paste, то интерпретатор начинает жаловаться на определение функции Knock:
Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or ’}’ in test.php on line 7
Содержимое седьмой строки:
function Knock()
Комментарий для Улитка:
Странно, даже если я вставляю через блокнот у меня всё работает. Ты точки с запятой где не надо не поставил случайно?
Наверно это Opera все портит. Надо из IE попробовать.
Комментарий для Улитка:
Попробуй. У меня IE.
В IE все работает нормально. Гадская Опера. Но дома — только ей.
Комментарий для Улитка:
Странно, а что же там не так-то?
Попробовал переключать кодировки — то же самое.
Хитрая защита от копирования программ реализована в Опере :-)
По байтам тоже совпадает. Должно работать — ан нет.
Комментарий для Улитка:
Может там Unicode какой-нить? :)
Про Unicode я в первую же очередь подумал! В Windows 2000 Блокнот уникодовский стал, часто такие штуки выкаблучивает.
Еще интересно: на определение класса он не ругается, не нравится интерпретатору именно функция-конструктор.
2Улитка:
Opera 7.11, Notepad, WinXP, Copy&Paste => всё работает.
Что делаю не так? :)))
з.ы. Почему все всегда всё валят на Оперу?