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

Создание объекта из динамического имени класса

  • alexeevdv

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

    Spritz 13 ноября 2010 г. 4:52

    Для примера берем простой синглтон
    <?php
    error_reporting(E_ALL);

    class Ololo
    {
    static private $Instance;

    private function __construct()
    {
    echo "Я новое Ололо";
    }

    static public function getInstance()
    {
    if (self::$Instance !== null)
    {
    return self::$Instance;
    }
    self::$Instance = new self;
    return self::$Instance;
    }

    }


    А дальше начинаем ебать мозги:

    $Obj = Ololo::getInstance();

    Тут вопросов нет. Объект рождается без кесарева сечения

    $ClassName = "Ololo";
    $Obj = $ClassName::getInstance();

    Вот тут наступает полный пиздец, который обходится следующим способом:

    $ClassName = "Ololo";
    eval ('$Obj = '.$ClassName.'::getInstance();');

    Опять же объект у нас нормально создается

    А теперь вопрос: есть ли какой-то менее ректальный способ??
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 13 ноября 2010 г. 5:20, спустя 28 минут 8 секунд

    $ClassName = "Ololo";
    $ClassName = new ReflectionClass($ClassName);
    $Obj = $ClassName::getInstance();
    only php5
    Спустя 130 сек.
    еще попробуй 
    $ClassName = "Ololo";
    $ClassName = new $ClassName();
    $Obj = $ClassName::getInstance();
  • alexeevdv

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

    Spritz 13 ноября 2010 г. 5:42, спустя 21 минуту 54 секунды


    $ClassName = "Ololo";
    $ClassName = new ReflectionClass($ClassName);
    $Obj = $ClassName::getInstance();
    only php5
    Спустя 130 сек.
    еще попробуй 
    $ClassName = "Ololo";
    $ClassName = new $ClassName();
    $Obj = $ClassName::getInstance();



    Второй метод не канает по двум причинам:
    1. Все та же ошибка (Нахуя вам в этом месте двойное двоеточие)
    2. Это синглтон. И создать объект через new не получится, т.к. конструктор приватный

    А первый метод не канает, т.к.:
    1. ReflectionClass насколько я понимаю используется для извлечения информации о классе. Методы, иерархия и т.д. Поэтому в данном случае он ни к чему
    2. Все та же пежня с ::

    Задача казалось бы проста: имея имя класса в переменной, вызвать его статический метод
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 13 ноября 2010 г. 6:00, спустя 18 минут 11 секунд

    2. Это синглтон. И создать объект через new не получится, т.к. конструктор приватный

    сори ))) просто поздно…
    Спустя 24 сек.
    Задача казалось бы проста: имея имя класса в переменной, вызвать его статический метод

    а нахуй это нужно?
  • alexeevdv

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

    Spritz 13 ноября 2010 г. 6:06, спустя 5 минут 23 секунды

    Ну скажем так есть дохуя классов у которых есть одинаковые методы. Мне надо их как-то вызывать. Я подгружаю класс из файла по имени класса, и по имени класса мне нужно вызвать в этом классе некоторые методы. Да и вообще разобраться с этим вопросом хотелось бы.

    Ведь есть такое:
    $name = 'a';
    $a = new Ololo();

    ${$name}->method();

    Это же прокатывает? :)
  • artoodetoo

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

    Spritz 13 ноября 2010 г. 6:17, спустя 10 минут 46 секунд

    А дальше начинаем ебать мозги:

    Действительно. Так зачем ты ебешь мозги?
    Забудь про ебаные сингтоны. Сначала напиши простыми словами свою цель. Решение на поверхности.
    ιιlllιlllι унц-унц
  • alexeevdv

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

    Spritz 13 ноября 2010 г. 6:27, спустя 10 минут 18 секунд

    Хорошо, давай забудем про синглтон и локализуем проблему

    Допустим есть функция на на вход которой подается имя класса, а в теле функции мне нужно вызвать статический метод этого класса. Как мне это осуществить?

    function MyFunction(ИМЯКЛАССА)
    {

    ИМЯКЛАСС::МЕТОД();

    }


    Я уже приводил в начале вариант через Eval, но хотелось бы выяснить есть ли этому какие-то альтернативы
  • artoodetoo

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

    Spritz 13 ноября 2010 г. 6:38, спустя 10 минут 36 секунд

    ответ в лоб: call_user_func или call_user_func_array

    ответ от Рабиновича: а ты уверен, что тебе в этом месте необходим статический метод?
    ιιlllιlllι унц-унц
  • alexeevdv

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

    Spritz 13 ноября 2010 г. 6:45, спустя 7 минут 5 секунд

    Спасибо, это именно то что я искал
    $Obj = call_user_func(array($ClassName, 'getInstance'));


    Может быть статический метод мне там и не нужен, но все же гораздо лучше иметь возможность его вызвать в случае необходимости :)
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 13 ноября 2010 г. 10:23, спустя 3 часа 38 минут 4 секунды

    mario, что за хуйню ты насоветовал?

    $className::staticFunc(); работает с 5.3. Для <5.3 - используй то, что artoodetoo предложил
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 13 ноября 2010 г. 14:55, спустя 4 часа 32 минуты

    mario, что за хуйню ты насоветовал?

    ты читать видимо разучился? ;)
    сори ))) просто поздно…

  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 13 ноября 2010 г. 16:18, спустя 1 час 23 минуты 38 секунд

    анонимус не прощает
  • Sinkler

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

    Spritz 13 ноября 2010 г. 16:20, спустя 1 минуту 53 секунды

    Абырвалг негодуе на пiха.ру
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 13 ноября 2010 г. 16:27, спустя 6 минут 24 секунды

    Абырвалг годуе пташок ))
  • Astro

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

    Spritz 18 августа 2012 г. 22:48, спустя 644 дня 5 часов 21 минуту

    конечно не будет, что ты сможешь ему дать? плод фантазии ученых…

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