Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Одинаковое название класса и метода
объясните пжл, почему выводится два раза "блаблабла", а не один?
DelphinPRO
Отправлено: 03 Сентября, 2015 - 17:17:18
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
Историческое наследие. В php4 метод, совпадающий с названием класса, интерпретировался как конструктор класса.
Выхода два: не называть так метод; определить конструктор __consctruct().
----- Чем больше узнаю, тем больше я не знаю.
arimanecro
Отправлено: 03 Сентября, 2015 - 17:20:00
Частый гость
Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014
Помог: 0 раз(а)
DelphinPRO
спс
Мелкий
Отправлено: 03 Сентября, 2015 - 17:48:04
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
DelphinPRO пишет:
определить конструктор __consctruct().
Такое решение для версий PHP >= 5.3.0 и < 7.0.0 будет генерировать Strict Standards: Redefining already defined constructor for class Test
А в PHP7 уже не будет. Там будет Deprecated, если не будет __construct, но будет метод, одноимённый имени класса.
----- PostgreSQL DBA
DelphinPRO
Отправлено: 03 Сентября, 2015 - 19:07:34
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
Проверил на 5,6 - нет ошибок
----- Чем больше узнаю, тем больше я не знаю.
Мелкий
Отправлено: 03 Сентября, 2015 - 19:42:42
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Так ведь тоже проверял, оттуда и скопировал текст. Интересно... (Добавление)
PHP - это что-то.
Эта фича ещё и тестами покрыта: ext/reflection/tests/ReflectionO bject_getConstructor_basic.phpt
Два класса, один кидает E_STRICT, другой нет.:
Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014
Помог: 10 раз(а)
[+]
Вообще-то это осознанно заложенное поведение.
__construct всегда приоритетнее.
Считается, что конструктор находится в начале класса.
Если сначала идет __construct, потом метод с именем класса - считаем, что это нормальный php5 класс, зачем тут strict?
Если наоборот, то рассматривается случай, что у нас PHP4, но есть метод с именем __construct. В этом случае поведение этого старого класса при выполнении на PHP5 будет иным, т.е. нарушается обратная совместимость. Из-за этого кидаем предупреждение.
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
MiksIr хм
MiksIr пишет:
Если наоборот, то рассматривается случай, что у нас PHP4,
академик млин))
(Добавление)
учти кто есть ТС
не учи плохому
MiksIr
Отправлено: 04 Сентября, 2015 - 01:28:16
Забанен
Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014
Помог: 10 раз(а)
[+]
Имелось ввиду "у нас старый код, написанный под пхп4 в котором есть метод __construct (который что-то делает, но не конструктор ниразу, ибо в пхп4 это не было конструктором)" =)
Как раз учу хорошему - всегда объявляйте __construct и ставьте его первым в классе ;)
Зато полезно, пока проверял все это - нашел багу в пхп документации, которую туда месяц назад посадили ;)
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
MiksIr пишет:
и ставьте его первым в классе ;)
както не думал никогда что можно его ставить не первым
Опятьже PSR
Считаю что пых4 вообще не обсуждается
Минимум 5.4 (Добавление) MiksIr хотя с тобой спорить не хочу
Мне спора про замыкания хватило навсегда досихпор не могу понять кто прав
С одной стороны есть определенная особенность
С другой ... впрочем другое я как и не принимаю
Наилучшего!
MiksIr
Отправлено: 04 Сентября, 2015 - 02:10:57
Забанен
Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014
Помог: 10 раз(а)
[+]
Да о чем спор ;) О пхп4 думать не нужно... нам не нужно, а вот разработчикам ядра пхп - нужно ;)
Т.е. рассматривается случай, когда есть кучу старого кода пхп4, который нужно запустить под пхп5. А такого кода, на самом деле, хватает даже сегодня.
И может такое случится, что в какому-то из этого кода кто-то использовал метод с именем __construct. И код при запуске в ПХП5 становится нерабочим.
Вот об этом и нужно предупредить того, кто этот код запускает, что может быть проблема. Вот этот стрикт по сути об этом. Он о том, что у нас два конструктора. А не о том, что у нас старый конструктор. Если просто взять класс со старым конструктором - никаких стриктов не будет в пхп5 https://3v4l.org/Kjsbo
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
MiksIr
если есть вероятность, что в старом коде вдруг присутствует метод с именем __construct (не конструктор), то есть такая же вероятность, что этот метод будет объявлен перед php4-конструктором (люди же не всегда пишут "как надо"). А значит стрикт следовало бы выкидывать в обоих случаях при наличии двух конструкторов (php4 и php5), вне зависимости от порядка их следования. Мой комментарий был об этом.
----- Чем больше узнаю, тем больше я не знаю.
MiksIr
Отправлено: 04 Сентября, 2015 - 14:08:59
Забанен
Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014
Помог: 10 раз(а)
[+]
В этом случае пострадали бы все нормальные программисты, которые используют метод с названием класса. Запрещать такое из-за обратной совместимости было бы верхом идиотизма.
А вероятность такого события много меньше, чем и так ничтожная вероятность "прямого" порядка.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.