ФорумПрограммированиеPHP для идиотов → Передача неизвестного количества аргументов при динамическом создании объекта

Передача неизвестного количества аргументов при динамическом создании объекта

  • Rinat

    Сообщения: 6 Репутация: N Группа: Кто попало

    Spritz Окт. 6, 2015, 2:03 п.п.

    Всем привет!
    Значит так:
    Есть старый старый-пристарый код, чуть-ли не пятнадцатилетней давности, который должен работать в том числе старых версиях php (от 5 до 5.4).

    Есть разные объекты, которые вызываются по всему коду и хранятся в глобальных переменных.
    Например так:

    
    $db = new db('localhost', 'user', 'password');
    

    ну и дальше пошло в функциях

    
    function getlist()
    {
     global $db;
    
     $db->getlist($sql)
    
    ... блабла бла
    }
    

    А я хочу, чтобы:

    
    objects::create('db', 'localhost', 'user', 'password');
    

    потом где надо

    
     $db = objects::get('db');
    

    Делаю что-то вроде хранилища, в котором все эти объекты будут хранится, вместо глобальных переменных.

    
    class objects
    {
        private static $obj;
        private $row = array();
    
        public static function obj()
        {
            if (is_null(self::$obj))
            {
                self::$obj = new self;
            }
            return self::$obj;
        }
    
        public static function create()
        {
            $args   = func_get_args();
            $object = $args[0];
    
             unset($args[0]);
            if (is_null(self::get($object)))
             {
                //!!!Вот тут object() мне надо передать $args - но н в в массив.
                // Можно new $object(...$args), однако это будет работать только в php > 5.4
                self::obj()->row[$object] = new $object();
            }
            return self::get($object);
    
        }
    
        static public function get($object)
        {
            if (!empty(self::obj()->row[$object]))
            {
                return self::obj()->row[$object];
            }
        }
    }
    

    Но вот беда! Я не знаю количество аргументов, которое будет передаваться этому самому объекту!
    По идее мог бы сделать и передать аргументы в виде массива:

    
     new $object(...$args)
    

    Но это будет работать только в php > 5.4, а мне нужно сохранить поддержку и старых версий php.
    Есть какое-то решение, помимо eval пожалуй?

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Окт. 6, 2015, 3:20 п.п., спустя 46 минут 47 секунд

    топик не читал, но возможно вот это интересует PHP: func_get_args - Manual [php.net]

    Сапожник без сапог
  • Rinat

    Сообщения: 6 Репутация: N Группа: Кто попало

    Spritz Окт. 6, 2015, 3:37 п.п., спустя 17 минут 2 секунды

    @Sinkler, спасибо, то что надо. Я правда рыл до этого справку по этому классу, не нашел там ничего.
    @phpdude, это вообще не в тему.

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Окт. 6, 2015, 4:12 п.п., спустя 34 минуты 27 секунд

    @Rinat, упс :)

    некогда читать

    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!