1. PHP / Говнокод #14182

    +154

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    abstract class Service_Gallery_Work extends Form_Service {
    
        public static function factory($object, $model_name = NULL)
        {
            return new self($object, $model_name);
        }
    ...

    ХИТ

    Запостил: invision70, 05 Декабря 2013

    Комментарии (6) RSS

    • Названия - говно, а так, чет вроде ничего такого предосудительного не наблюдается? Или self в таком случае всегда будет Service_Gallery_Work? Я почему-то думал, что ПХП динамически его зарезолвит.
      Ответить
    • это своеобразный construct?? может быть со временем это расширится до синглтона?
      Ответить
    • self это именно Service_Gallery_Work
      для того чтоб использовался класс наследник надо писать:
      return new static($object, $model_name);
      Ответить
      • Верно!

        Доказываем:

        abstract class Service {
        	public static function initial()
        	{
        		return new self;
        	}
        }
        class Form_Service extends Service { }
        
        var_dump(Form_Service::initial()); // выдает Fatal error: Cannot instantiate abstract class Service


        В проекте ошибка не вылетала т.к метод был переназначен.

        http://php.net/manual/ru/language.oop5.late-static-bindings.php
        Ответить
      • Ну, как обычно, ПХП. Непонятно зачем наследовать статические методы, но если уж наследовать, то зачем в них разрешать использовать self, но если уж и разрешать, то зачем это разрешать в абстрактных классах, где оно по определению будет ошибкой? Почему не сделать нормальную машину классов / наследования + оставить лазейку для дураков, которые хотят поэкспереминтировать в виде метакласса? Все были бы довольны...
        Ответить
      • PHP - это просто и понятно!
        Ответить

    Добавить комментарий