Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

Загадка про 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);
  }
}

Что будет в результате?

16 комментариев
Улитка 2003

Будет ’Kn’ и сообщение об ошибке.

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Улитка:

Во-первых, error_reporting(0), а во-вторых, даже без этого сообщения об ошибке не будет. Хотя, возможно, последнее зависит от версии, но я просто не вижу места где эта ошибка может возникнуть. у new просто более высокий приоритет по сравнению с конкатенацией, поэтому единственное спорное место там синтаксически верно.

Улитка 2003

Сообщение об ошибке будет в логе, по поводу того, что мы пытаемся выполнить конкатенацию объекта со строкой.

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Улитка:

Странно, приведи строчку, пожалуйста. Мне кажется, что точка должна перевести объект в строковое представление (т. е. в «Object») с чем и произойдёт конкатенация.

Улитка 2003

Проверил — все так, никаких ошибок, в $a записывается ’Objectock’.

Кстати, пример твой не работает, пришлось его руками набирать.
Специально так сделал или случайно получилось?

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Улитка:

Как это не работает? Только что попробовал — всё работает.

Улитка 2003

Сама программа работает, но если ее вставить в Блокнот через 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()

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Улитка:

Странно, даже если я вставляю через блокнот у меня всё работает. Ты точки с запятой где не надо не поставил случайно?

Улитка 2003

Наверно это Opera все портит. Надо из IE попробовать.

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Улитка:

Попробуй. У меня IE.

Улитка 2003

В IE все работает нормально. Гадская Опера. Но дома — только ей.

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Улитка:

Странно, а что же там не так-то?

Улитка 2003

Попробовал переключать кодировки — то же самое.
Хитрая защита от копирования программ реализована в Опере :-)

По байтам тоже совпадает. Должно работать — ан нет.

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Улитка:

Может там Unicode какой-нить? :)

Улитка 2003

Про Unicode я в первую же очередь подумал! В Windows 2000 Блокнот уникодовский стал, часто такие штуки выкаблучивает.
Еще интересно: на определение класса он не ругается, не нравится интерпретатору именно функция-конструктор.

Mash 2003

2Улитка:
Opera 7.11, Notepad, WinXP, Copy&Paste => всё работает.
Что делаю не так? :)))

з.ы. Почему все всегда всё валят на Оперу?