"PHP" / Говнокод #22043 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
class Cms extends Object
{

  static $tree;

  static $routes;

  static $smartyVars;


  function &getInstance()
  {
    static $instance = array();

    if (!$instance) {
      $instance[0] = new Cms();
    }
    return $instance[0];
  }

Класс полностью не писал в 100 строк не влезет , так и не понял что делает метод getInstance
это радость в недо-ЦМС с элементами CakePhp

Запостил: als_1984 als_1984, (Updated )

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

  • Паттерн «Одиночка» (Singleton). Если объект не инициализировался, создаём экземпляр. Если экземпляр уже создан, возвращаем его.

    Смущает только массив. Задел на будущее, если вдруг понадобится создать несколько экземпляров?
    Ответить
    • Синглтон легко превращается из одиночки в не одиночку!
      function &getInstance()
        {
          static $instance = array();
          static $i = 0;
      
          $instance[i] = new Cms();
      
          return $instance[i++];
        }
      Ответить
          • но фабрика как правило не хранит указателей на созданные объекты.

            конвеер?
            Ответить
            • > но фабрика как правило не хранит указателей на созданные объекты.
              Паттерн godfather:

              Good. Someday, and that day may never come, I'll call upon you to do a service for me. But until that day, accept this instance as a gift on my daughter's wedding day.
              Ответить
    • не удивит если какие пышники пробенчмаркнули и установили что проверка наличия элементов в массиве быстрее чем проверка поинтера. там на php.net таких завались.
      Ответить
    • singleton activerecord найди 10 отличий
      <?php
      /**
      * @package ActiveRecord
      */
      namespace ActiveRecord;
      /**
      * This implementation of the singleton pattern does not conform to the strong definition
      * given by the "Gang of Four." The __construct() method has not be privatized so that
      * a singleton pattern is capable of being achieved; however, multiple instantiations are also
      * possible. This allows the user more freedom with this pattern.
      *
      * @package ActiveRecord
      */
      abstract class Singleton
      {
      /**
      * Array of cached singleton objects.
      *
      * @var array
      */
      private static $instances = array();
      /**
      * Static method for instantiating a singleton object.
      *
      * @return object
      */
      final public static function instance()
      {
      $class_name = get_called_class();
      if (!isset(self::$instances[$class_name]))
      self::$instances[$class_name] = new $class_name;
      return self::$instances[$class_name];
      }
      /**
      * Singleton objects should not be cloned.
      *
      * @return void
      */
      Ответить
      • ох лол, это Универсальный Синглетон: по объекту на класс чтоли?

        Вообще конечно говно. В нормальных ЯП синглетон делается одной строчкой
        Ответить
        • и какие языки нормальные? пример из с++
          // Singleton.h
          class Singleton
          {
          private:
          static Singleton * p_instance;
          // Конструкторы и оператор присваивания недоступны клиентам
          Singleton() {}
          Singleton( const Singleton& );
          Singleton& operator=( Singleton& );
          public:
          static Singleton * getInstance() {
          if(!p_instance)
          p_instance = new Singleton();
          return p_instance;
          }
          };

          // Singleton.cpp
          #include "Singleton.h"

          Singleton* Singleton::p_instance = 0;
          Ответить
          • Плюсы не очень лаконичный язык, но от них и не ждут такого. А вот скриптовые языки могли бы, но пхп не осилил.

            В котлине
            object MySingleton


            В питоне. Создаем метакласс, потом юзаем
            class Singleton(type):
                _instances = {}
                def __call__(cls, *args, **kwargs):
                    if cls not in cls._instances:
                        cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
                    return cls._instances[cls]


            И потом просто:
            class MySingleton:
                __metaclass__ = Singleton


            Груви:
            @Singleton //Аннотация такая 
            class MySingleton {
            }


            Руби
            class MySingleton
               include Singleton # https://ruby-doc.org/stdlib-1.9.3/libdoc/singleton/rdoc/Singleton.html
            end


            В общем пых, как всегда, доказал свою ущербность
            Ответить
                • Содержимое инклюдника:

                  class << Singleton # :nodoc:
                      def __init__(klass) # :nodoc:
                        klass.instance_eval {
                          @singleton__instance__ = nil
                          @singleton__mutex__ = Mutex.new
                        }
                        def klass.instance # :nodoc:
                          return @singleton__instance__ if @singleton__instance__
                          @singleton__mutex__.synchronize {
                            return @singleton__instance__ if @singleton__instance__
                            @singleton__instance__ = new()
                          }
                          @singleton__instance__
                        end
                        klass
                      end
                  
                      private
                  
                      # extending an object with Singleton is a bad idea
                      undef_method :extend_object
                  
                      def append_features(mod)
                        #  help out people counting on transitive mixins
                        unless mod.instance_of?(Class)
                          raise TypeError, "Inclusion of the OO-Singleton module in module #{mod}"
                        end
                        super
                      end
                  
                      def included(klass)
                        super
                        klass.private_class_method :new, :allocate
                        klass.extend SingletonClassMethods
                        Singleton.__init__(klass)
                      end
                    end


                  Это только фрагмент. Всё в комментарий не влезет.
                  Ответить
                  • а не похую-ли что там написано, если это есть уже готовое?
                    Ответить
                    • Ну тогда почти на любом языке можно найти фреймворк/библиотеку, где лежит уже готовый класс Singleton.
                      Ответить
            • > Плюсы не очень лаконичный язык, но от них и не ждут такого.

              Я вас умоляю... Написал один раз шаблон и делай себе Singleton<MyClazz>::get(). Другое дело, что синглетоны не нужны.
              Ответить
              • Ну речь же шла не о написании, а о стандартной либе. Или такойтшаблон уже есть?

                Синглтоны нужны, но управлять ими должен DI. Самопись не нужна, правда
                Ответить
        • PHP не Питон. В PHP чуть ли не любой код можно записать в одну строчку.
          Ответить
        • да и весь прикол в логике, свойство $instance должно быть в классе, но никак не в методе, да и я не видел чтоб singleton наследовался
          Ответить
      • Нашёл одно: в недо-ЦМС ссылка на экземпляр всегда пишется в нулевой элемент массива, а в activerecord запись производится по ключу, соответствующему имени класса. Т. е. в activerecord оставлен задел для наследования класса Singleton без доработки, а в недо-ЦМС каждый синглтон нужно писа́ть с нуля.
        Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8