<rmcreative>

RSS

Конструкторы PHP4

16 сентября 2013

Те, кто никогда не работал с PHP4, частенько тратят очень много времени на поиск причины очень странных багов, которые появляются в случае совпадения имени класса и имени метода.

Дело в том, что в PHP4 не было __construct. Вместо него использовался метод с тем же именем, что и класс. Ради обратной совместимости это работает до сих пор. Будьте осторожны и не делайте так:

class Cck
{
  // ...
 
  public function cck()
  {
    // ...
  }
}

Комментарии RSS

  1. №8366
    Сергей
    Сергей 16 сент. 2013 г., 17:45:09

    Гениально.............................

  2. №8367
    MT
    MT 16 сент. 2013 г., 22:17:55

    Те, кто никогда не работал с PHP4

    …и C++. ;-)

  3. №8368
    Дмитрий
    Дмитрий 16 сент. 2013 г., 22:53:21

    Настало время удивительных историй.

  4. №8369
    Sam
    Sam 16 сент. 2013 г., 23:36:29

    Ну тогда уж и с Java и ещё много с чем.

  5. №8370
    Евгений Степанищев
    Евгений Степанищев 17 сент. 2013 г., 8:56:33

    Бывают куда более интересные ситуации: bolknote.ru/2013/01/10/~3830/

  6. №8410
    Павел
    Павел 25 сент. 2013 г., 12:24:13

    Всегда так и оформляю конструкторы, уж очень уродской мне кажется конструкция __construct. Возможно это отголосок явы. Не совсем понятно, в чем профит?

  7. №8411
    Sam
    Sam 25 сент. 2013 г., 14:28:29

    Павел, единообразие.

  8. №8412
    Павел
    Павел 25 сент. 2013 г., 14:39:57

    Возможно, хотя довольно спорный аргумент. Как уже было упомянуто, на java нет данного единообразия и никто не возмущается. Но возможно виной тому статическая типизация, т.е. явное указание того, что возвращает функция. Вот и получается, что функция class Array { public Array() { ...} } сразу говорит, что она возвращает (объект своего класса), в то время как с __construct данный аспект становится менее прозрачным. Но опять же становится более явным обозначение конструктора. Осталось определится, что же более приоритетней. Отличная тема для холивара.

  9. №8427
    comm1x
    comm1x 03 окт. 2013 г., 19:21:12

    Сегодня долго не мог понять, почему приложение выбрасывает исключение и не журналирует его. Журналирование происходит в конструкторе. Вспомнил, что про этот пост и тот факт, что недавно увел все исключения из глобального простанства в неймспейсы. Конструкторы все имели ява-форму, т.е. версии 4. Решил исправить все на __construct. Мистика, но журнал заработал. Видимо старые конструкторы начинают неадекватно себя вести в пространствах имен. Другого объяснения не нашел.

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.