Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить имя класса внутри статической функции 
V
    Опции темы
Bog d`An
Дата 2.10.2009, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 217
Регистрация: 26.3.2005
Где: Украина:Днепропет ровск

Репутация: нет
Всего: 3



Как можно получить имя класса внутри статической функции этого класса?

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

<?
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" } 


Это сообщение отредактировал(а) Bog d`An - 2.10.2009, 12:38
--------------------
Удача откроет двери даже там, где их нет.Генри Морган--------------------[Furry team][Agent`s team][СРУКер]   
PM MAIL WWW   Вверх
sTa1kEr
Дата 2.10.2009, 13:14 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Для того, что бы получить имя класса в статическом методе необходимо вызвать метод get_class() без параметров или воспользоваться магической константой __CLASS__
Если же необходимо получить имя класса-наследника, то это возможно только в PHP >= 5.3 при помощи Late Static Bindings и метода get_called_class

Это сообщение отредактировал(а) sTa1kEr - 2.10.2009, 13:18
PM MAIL   Вверх
Bog d`An
Дата 2.10.2009, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 217
Регистрация: 26.3.2005
Где: Украина:Днепропет ровск

Репутация: нет
Всего: 3



Да, нужно было именно последнее. Как жаль что самое вкусное ещё не скоро можно будет использовать широко)
--------------------
Удача откроет двери даже там, где их нет.Генри Морган--------------------[Furry team][Agent`s team][СРУКер]   
PM MAIL WWW   Вверх
youri
Дата 2.10.2009, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 6
Всего: 16



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

непонятно, зачем эта новая функциональность нужна. Можно конкретный пример?
PM   Вверх
sTa1kEr
Дата 3.10.2009, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Цитата(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();

PM MAIL   Вверх
youri
Дата 3.10.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 6
Всего: 16



могу привести авторитетное мнение smile
http://phpclub.ru/talk/showthread.php?post...1184#post871184
могу даже свои мысли по этом поводу высказать: это как минимум "неправильно", нестандартно/неочевидно (синглтон обычно узнают по методу get_instance в классе, а не по extends Singleton), кроме того будут небольшие сложности при необходимости унаследовать B от кого-то еще. И это сложно назвать Singleton'ом. Зато удобно. 
еще интересная дискуссия на тему правильности здесь
PM   Вверх
sTa1kEr
Дата 3.10.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Где вы увидели в названии класса "A" слово "Singleton"? 
PM MAIL   Вверх
youri
Дата 3.10.2009, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 6
Всего: 16



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

Это сообщение отредактировал(а) youri - 3.10.2009, 21:01
PM   Вверх
sTa1kEr
Дата 5.10.2009, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



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

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

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

Разве late binding вносит какой-то новый синтаксис в PHP?
PM MAIL   Вверх
youri
Дата 5.10.2009, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 6
Всего: 16



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

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

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

ну если считать, что это должен быть обязательно синтаксис, то, конечно, нельзя
PM   Вверх
sTa1kEr
Дата 5.10.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



А - Singleton с некоторым функционалом, который (функционал) мы хотим унаследовать.
PM MAIL   Вверх
youri
Дата 5.10.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 6
Всего: 16



а почему наследоваться исключительно ради Sinleton'а бессмысленно? Слишком мало кода, причем код стандартный?
PM   Вверх
nerezus
Дата 5.10.2009, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 12
Всего: 43



Была такая проблема, решается паттерном AbstractFactory.

Цитата

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


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
sTa1kEr
Дата 5.10.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



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

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

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

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

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

Действительно, есть такая буква в этом слове.
PM MAIL   Вверх
youri
Дата 6.10.2009, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 6
Всего: 16



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

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

p.s. а как тут AbstractFactory поможет?
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1175 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.