Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Как получить имя класса внутри статической функции


Автор: Bog d`An 2.10.2009, 12:36
Как можно получить имя класса внутри статической функции этого класса?

или посоветуйте, пожалуйста, какой-нибудь другой метод дабы
Код

<?
class Atoms_class
{
    protected function class_preferences()
    {
        return get_class_vars(get_class($this));
    }
}

class B extends Atoms_class
{
    var $a;
    var $b='c';
    
    function show_self()
    {
        var_dump($this->class_preferences());echo'<hr>'; 
    }
}

$foo= new B();
$foo->show_self();
?>


преобразовать в нечто такое

Код

<?
class Atoms_class
{
    protected static function class_preferences()
    {
        return get_class_vars(???);
    }
}

class B extends Atoms_class
{
    var $a;
    var $b='c';
    
    static function show_self()
    {
        var_dump(parent::class_preferences());echo'<hr>'; 
    }
    
}

B::show_self();
?>


чтобы результат был одинаков:

Код

array(2) { ["a"]=>  NULL ["b"]=>  string(1) "c" } 

Автор: sTa1kEr 2.10.2009, 13:14
Для того, что бы получить имя класса в статическом методе необходимо вызвать метод http://ru.php.net/get_class без параметров или воспользоваться http://ru.php.net/manual/en/language.constants.predefined.php __CLASS__
Если же необходимо получить имя класса-наследника, то это возможно только в PHP >= 5.3 при помощи http://ru.php.net/lsb и метода http://ru.php.net/get-called-class

Автор: Bog d`An 2.10.2009, 14:05
Да, нужно было именно последнее. Как жаль что самое вкусное ещё не скоро можно будет использовать широко)

Автор: youri 2.10.2009, 19:58
Цитата(Bog d`An @  2.10.2009,  14:05 Найти цитируемый пост)
Как жаль что самое вкусное ещё не скоро можно будет использовать широко

непонятно, зачем эта новая функциональность нужна. Можно конкретный пример?

Автор: sTa1kEr 3.10.2009, 12:46
Цитата(youri @  2.10.2009,  20:58 Найти цитируемый пост)
непонятно, зачем эта новая функциональность нужна. Можно конкретный пример? 

Код

class A
{
    public static function getInstance() {
        static $instance;
        if ($instance === null) {
            $class = get_called_class();
            $instance = new $class();
        }
        return $instance;
    }
}

class B extends A
{
    public function foo() {
        // ...
    }
}

B::getInstance()->foo();

Автор: youri 3.10.2009, 15:33
могу привести авторитетное мнение smile
http://phpclub.ru/talk/showthread.php?postid=871184#post871184
могу даже свои мысли по этом поводу высказать: это как минимум "неправильно", нестандартно/неочевидно (синглтон обычно узнают по методу get_instance в классе, а не по extends Singleton), кроме того будут небольшие сложности при необходимости унаследовать B от кого-то еще. И это сложно назвать Singleton'ом. Зато удобно. 
еще интересная дискуссия на тему правильности http://phpclub.ru/talk/showthread.php?s=&threadid=112864&highlight=static+singleton+%ED%E0%F1%EB%E5%E4%EE%E2%E0%ED%E8%E5

Автор: sTa1kEr 3.10.2009, 15:44
Где вы увидели в названии класса "A" слово "Singleton"? 

Автор: youri 3.10.2009, 21:01
ну как-то напоминает... а вы согласны что теоретически так делать не стоит? Это скорее удобно (практически). В любом случае, я бы не сказал, что late static binding очень нужная штука /* интересно, можно ее синтаксическим сахаром назвать :-? */

Автор: sTa1kEr 5.10.2009, 09:52
Цитата(youri @  3.10.2009,  22:01 Найти цитируемый пост)
а вы согласны что теоретически так делать не стоит?

Согласен, что наследоваться, исключительно ради синглтона бессмысленно.

Цитата(youri @  3.10.2009,  22:01 Найти цитируемый пост)
интересно, можно ее синтаксическим сахаром назвать :-?

Разве late binding вносит какой-то новый синтаксис в PHP?

Автор: youri 5.10.2009, 11:38
Цитата(sTa1kEr @  5.10.2009,  09:52 Найти цитируемый пост)
Согласен, что наследоваться, исключительно ради синглтона бессмысленно.

тогда я не совсем понимаю. Если A - Singleton, то там наследование исключительно ради Singleton'а. Если A - не Singleton, то как будет выглядеть наследование ради Singleton'а? И ради чего еще можно наследоваться?

Цитата(sTa1kEr @  5.10.2009,  09:52 Найти цитируемый пост)
Разве late binding вносит какой-то новый синтаксис в PHP?

ну если считать, что это должен быть обязательно синтаксис, то, конечно, нельзя

Автор: sTa1kEr 5.10.2009, 13:21
А - Singleton с некоторым функционалом, который (функционал) мы хотим унаследовать.

Автор: youri 5.10.2009, 14:17
а почему наследоваться исключительно ради Sinleton'а бессмысленно? Слишком мало кода, причем код стандартный?

Автор: nerezus 5.10.2009, 14:43
Была такая проблема, решается паттерном AbstractFactory.

Цитата

Разве late binding вносит какой-то новый синтаксис в PHP?
 Ага. static::

Автор: sTa1kEr 5.10.2009, 15:39
Цитата(youri @  5.10.2009,  15:17 Найти цитируемый пост)
а почему наследоваться исключительно ради Sinleton'а бессмысленно?

По тем же причинам, что вы приводили в своем посте.

Цитата(nerezus @  5.10.2009,  15:43 Найти цитируемый пост)
Была такая проблема, решается паттерном AbstractFactory.

А в некоторых случаях можно решить ее проще - наследованием.

Цитата(nerezus @  5.10.2009,  15:43 Найти цитируемый пост)
Ага. static:: 

Действительно, есть такая буква в этом слове.

Автор: youri 6.10.2009, 09:30
Цитата(sTa1kEr @  5.10.2009,  15:39 Найти цитируемый пост)
По тем же причинам, что вы приводили в своем посте

т.е. если наследоваться только ради Singleton, то плюсы этого решения (исключение дублирования кода), не перевешивают минусы, потому что кода немного и он стандартный. Если же есть дополнительная функциональность, то это может иметь смысл. Но еще есть альтернативный вариант - агрегация. Все зависит от цели наследования: наследование реализации/интерфейса. Для наследования реализации, думаю, лучше подойдет агрегация. В общем пример до сих пор слишком абстрактный

p.s. а как тут AbstractFactory поможет?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)