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

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

  • alexeevdv

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

    Spritz 12 ноября 2010 г. 20:52

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

    class Ololo
    {
    static private $Instance;

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

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

    }


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

    $Obj = Ololo::getInstance();

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

    $ClassName = &quot;Ololo&quot;;
    $Obj = $ClassName::getInstance();

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

    $ClassName = &quot;Ololo&quot;;
    eval (&#39;$Obj = &#39;.$ClassName.&#39;::getInstance();&#39;);

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

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

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

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

    $ClassName = &quot;Ololo&quot;;
    $ClassName = new ReflectionClass($ClassName);
    $Obj = $ClassName::getInstance();
    only php5 {+++130+++}
    еще попробуй 
    $ClassName = &quot;Ololo&quot;;
    $ClassName = new $ClassName();
    $Obj = $ClassName::getInstance();
  • alexeevdv

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

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


    $ClassName = &quot;Ololo&quot;;
    $ClassName = new ReflectionClass($ClassName);
    $Obj = $ClassName::getInstance();
    only php5 {+++130+++}
    еще попробуй 
    $ClassName = &quot;Ololo&quot;;
    $ClassName = new $ClassName();
    $Obj = $ClassName::getInstance();



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

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

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

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

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

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

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

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

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

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

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

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

    ${$name}->method();

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

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

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

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

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

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

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

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

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

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

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

    }


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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

  • Абырвалг

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

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

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

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

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

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

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

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

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

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

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

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

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