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

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

17 августа 2003 11:30

Улитка (инкогнито)
17 августа 2003, 16:43

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

bolk (bolknote.ru)
17 августа 2003, 16:43, ответ предназначен Улитка

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

Улитка (инкогнито)
17 августа 2003, 17:05

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

bolk (bolknote.ru)
17 августа 2003, 17:05, ответ предназначен Улитка

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

Улитка (инкогнито)
17 августа 2003, 17:39

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

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

bolk (bolknote.ru)
17 августа 2003, 17:39, ответ предназначен Улитка

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

Улитка (инкогнито)
17 августа 2003, 18:00

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

bolk (bolknote.ru)
17 августа 2003, 18:00, ответ предназначен Улитка

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

Улитка (инкогнито)
17 августа 2003, 18:14

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

bolk (bolknote.ru)
17 августа 2003, 18:14, ответ предназначен Улитка

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

Улитка (инкогнито)
17 августа 2003, 18:34

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

bolk (bolknote.ru)
17 августа 2003, 18:34, ответ предназначен Улитка

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

Улитка (инкогнито)
17 августа 2003, 18:56

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

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

bolk (bolknote.ru)
17 августа 2003, 18:56, ответ предназначен Улитка

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

Улитка (инкогнито)
17 августа 2003, 19:34

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

Mash (инкогнито)
18 августа 2003, 16:14

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

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

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)