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 :: Одинаковое название класса и метода

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
arimanecro
Отправлено: 03 Сентября, 2015 - 17:05:11
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1. class Test {
  2.         public $a;
  3.         const LALA = "blablabla<br>";
  4.         public function test() {
  5.                 echo $this->a = self::LALA;
  6.         }
  7.        
  8. }
  9. $res = new Test;
  10. $res->test();


объясните пжл, почему выводится два раза "блаблабла", а не один?
 
 Top
DelphinPRO
Отправлено: 03 Сентября, 2015 - 17:17:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Историческое наследие. В php4 метод, совпадающий с названием класса, интерпретировался как конструктор класса.

Выхода два: не называть так метод; определить конструктор __consctruct().


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
arimanecro
Отправлено: 03 Сентября, 2015 - 17:20:00
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


Помог: 0 раз(а)




DelphinPRO
спс
 
 Top
Мелкий Супермодератор
Отправлено: 03 Сентября, 2015 - 17:48:04
Post Id



Активный участник


Покинул форум
Сообщений всего: 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
 
 Top
DelphinPRO
Отправлено: 03 Сентября, 2015 - 19:07:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Проверил на 5,6 - нет ошибок


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Мелкий Супермодератор
Отправлено: 03 Сентября, 2015 - 19:42:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Так ведь тоже проверял, оттуда и скопировал текст. Интересно...
(Добавление)
PHP - это что-то.
Эта фича ещё и тестами покрыта: ext/reflection/tests/ReflectionO bject_getConstructor_basic.phpt
Два класса, один кидает E_STRICT, другой нет.:
PHP:
скопировать код в буфер обмена
  1. class OldAndNewCtor {
  2.         function OldAndNewCtor() {}
  3.         function __construct() {}
  4. }
  5.  
  6. class NewAndOldCtor {
  7.         function __construct() {}
  8.         function NewAndOldCtor() {}
  9. }


-----
PostgreSQL DBA
 
 Top
DelphinPRO
Отправлено: 03 Сентября, 2015 - 20:08:32
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Зависит от порядка объявления Улыбка
если __construct - первый, ошибок не будет. гениально Улыбка


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
DeepVarvar Супермодератор
Отправлено: 03 Сентября, 2015 - 22:16:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




DelphinPRO пишет:
гениально
****, **** и в продакшн.
 
 Top
MiksIr
Отправлено: 03 Сентября, 2015 - 23:52:04
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


Вообще-то это осознанно заложенное поведение.
__construct всегда приоритетнее.

Считается, что конструктор находится в начале класса.

Если сначала идет __construct, потом метод с именем класса - считаем, что это нормальный php5 класс, зачем тут strict?

Если наоборот, то рассматривается случай, что у нас PHP4, но есть метод с именем __construct. В этом случае поведение этого старого класса при выполнении на PHP5 будет иным, т.е. нарушается обратная совместимость. Из-за этого кидаем предупреждение.

(Отредактировано автором: 04 Сентября, 2015 - 00:10:59)



-----
self-banned
 
 Top
LIME
Отправлено: 04 Сентября, 2015 - 00:59:26
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)





MiksIr хм
MiksIr пишет:
Если наоборот, то рассматривается случай, что у нас PHP4,

академик млин))

(Добавление)
учти кто есть ТС
не учи плохому
 
 Top
MiksIr
Отправлено: 04 Сентября, 2015 - 01:28:16
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


Имелось ввиду "у нас старый код, написанный под пхп4 в котором есть метод __construct (который что-то делает, но не конструктор ниразу, ибо в пхп4 это не было конструктором)" =)
Как раз учу хорошему - всегда объявляйте __construct и ставьте его первым в классе ;)

Зато полезно, пока проверял все это - нашел багу в пхп документации, которую туда месяц назад посадили ;)

(Отредактировано автором: 04 Сентября, 2015 - 01:29:58)



-----
self-banned
 
 Top
LIME
Отправлено: 04 Сентября, 2015 - 01:32:00
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




MiksIr пишет:
и ставьте его первым в классе ;)
както не думал никогда что можно его ставить не первымУлыбка
Опятьже PSR
Считаю что пых4 вообще не обсуждается
Минимум 5.4
(Добавление)
MiksIr хотя с тобой спорить не хочу
Мне спора про замыкания хватило навсегдаУлыбка досихпор не могу понять кто прав
С одной стороны есть определенная особенность
С другой ... впрочем другое я как и не принимаюУлыбка
НаилучшегоУлыбка!
 
 Top
MiksIr
Отправлено: 04 Сентября, 2015 - 02:10:57
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


Да о чем спор ;) О пхп4 думать не нужно... нам не нужно, а вот разработчикам ядра пхп - нужно ;)

Т.е. рассматривается случай, когда есть кучу старого кода пхп4, который нужно запустить под пхп5. А такого кода, на самом деле, хватает даже сегодня.

И может такое случится, что в какому-то из этого кода кто-то использовал метод с именем __construct. И код при запуске в ПХП5 становится нерабочим.

Вот об этом и нужно предупредить того, кто этот код запускает, что может быть проблема. Вот этот стрикт по сути об этом. Он о том, что у нас два конструктора. А не о том, что у нас старый конструктор. Если просто взять класс со старым конструктором - никаких стриктов не будет в пхп5 https://3v4l.org/Kjsbo

(Отредактировано автором: 04 Сентября, 2015 - 02:11:31)



-----
self-banned
 
 Top
DelphinPRO
Отправлено: 04 Сентября, 2015 - 08:04:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




MiksIr
если есть вероятность, что в старом коде вдруг присутствует метод с именем __construct (не конструктор), то есть такая же вероятность, что этот метод будет объявлен перед php4-конструктором (люди же не всегда пишут "как надо"). А значит стрикт следовало бы выкидывать в обоих случаях при наличии двух конструкторов (php4 и php5), вне зависимости от порядка их следования. Мой комментарий был об этом.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
MiksIr
Отправлено: 04 Сентября, 2015 - 14:08:59
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


В этом случае пострадали бы все нормальные программисты, которые используют метод с названием класса. Запрещать такое из-за обратной совместимости было бы верхом идиотизма.

А вероятность такого события много меньше, чем и так ничтожная вероятность "прямого" порядка.

Так что имхо вполне оправдана допущение.


-----
self-banned
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB