Получить имя класс наследника в классе родителе.

bobroff

Новичок
Получить имя класс наследника в классе родителе.

Здравствуйте.

К примеру есть два класса:

PHP:
abstract class iCore_Model_Element_Abstract
{

   public static function classinfo()
   {
   }

}
и

PHP:
class Model_User_ImageSmall extends iCore_Model_Element_Abstract
{
}
Класс iCore_Model_Element_Abstract является родителем для многих классов, например для Model_User_ImageSmall.

Необходимо написать метод (возможно статический) в классе iCore_Model_Element_Abstract, который возвращал бы название класса наследника (естественно при условии иннициализации класса).
Это возможно? Если да, то как?

Заранее, спасибо...
 

fixxxer

К.О.
Партнер клуба
1) такое желание - признак архитектурных проблем; лучше постараться обойтись без статики
2) если очень хочется - это возможно в php 5.3, читай про late static binding
 

bobroff

Новичок
Автор оригинала: fixxxer
1) такое желание - признак архитектурных проблем; лучше постараться обойтись без статики
2) если очень хочется - это возможно в php 5.3, читай про late static binding
Знаю про late static binding но, к сожалению, это не очень удачный вариант, т.к. в каждом жлементе наследнике придется писать одну и туже функцию определения имения класса, а таких элементов может быть более 100...

Поясню для чего мне это нужно.
У меня множество классов, родителем которых является iCore_Model_Element_Abstract.
Именуются классы-наследники определенным образом, например:
Model_ГруппаЭлементов_ИмяКонтретногоЭлемента.
Каждый класс-наследник может передаваться в другой такой-же класс.
Необходимо сделать проверку класса на принадлежность к определенной ГруппеЭлементов, чтобы нельзя было передать элемент из одной группы, в элемент из другой группы.
 

fixxxer

К.О.
Партнер клуба
если я все верно понял, это гораздо проще сделать интерфейсами-маркерами:
PHP:
interface Model_Group1_Interface {};
interface Model_Group2_Interface {};
....
class Model_Foo implements
        Model_Group1_Interface,
        Model_Group3_Interface {
...
}

class Foo {
   public function doSmth(Model_Group1_Interface $Model) {
   ...
   }
}
Но тупые маркеры это тоже решение хреновое.

Ведь наверняка причина по которой должно быть "нельзя" есть и при этом четко архитектурная. Вот ее и выразить в наборе методов, объявленных в этих самых интерфейсах.
 

bobroff

Новичок
В принципе можно ограничится и одним интерфейсом, но опять же, как-то это не "красиво" писать во всех элементах одну и туже функцию определения имени элемента, в то время как этих элементов может быть 100, 200, 300...
 

whirlwind

TDD infected, paranoid
Что то я не понял, никто не знает про [m]get_class[/m], [m]get_parent_class[/m] и полиморфизм ?
 

fixxxer

К.О.
Партнер клуба
Я специально не стал писать про get_class, прочитав ответ на первый мой комментарий. Хотел, но представил себе код типа switch(get_class($this)) в базовом родителе - и не стал )

Судя по описанию похоже на проблему множественного наследования.

-~{}~ 09.03.10 09:34:

Автор оригинала: bobroff
В принципе можно ограничится и одним интерфейсом, но опять же, как-то это не "красиво" писать во всех элементах одну и туже функцию определения имени элемента, в то время как этих элементов может быть 100, 200, 300...
Зачем ее писать? И откуда навязчивое желание завязаться на имя?
Я знаю только один случай когда имя класса имеет значение - autoload.
 

bobroff

Новичок
Автор оригинала: fixxxer
Я специально не стал писать про get_class, прочитав ответ на первый мой комментарий. Хотел, но представил себе код типа switch(get_class($this)) - и не стал )

Судя по описанию похоже на проблему множественного наследования.

-~{}~ 09.03.10 09:34:


Зачем ее писать? И откуда навязчивое желание завязаться на имя?
Можно конечно и не завязываться на имя, а в каждом элементе задавать название группы элементов...

Автор оригинала: whirlwind
Что то я не понял, никто не знает про [m]get_class[/m], [m]get_parent_class[/m] и полиморфизм ?
Когда пишешь get_class в родительском классе, то метод и возвращает имя родительского класса. А нужно чтобы возвращал имя класса наследника, но был написан в родительском классе.
 

fixxxer

К.О.
Партнер клуба
Ты бы объяснил поподробнее, какая задача-то решается.

Мой модуль телепатии разрывается между множественным наследованием и acl =)
 

whirlwind

TDD infected, paranoid
bobroff привязка к именам классов, это худшее что можно сделать. Вынеси группу в атрибут и не мучайся.
 

bobroff

Новичок
Вроде нашел решение с помощью ReflectionClass

-~{}~ 09.03.10 09:40:

Автор оригинала: whirlwind
bobroff привязка к именам классов, это худшее что можно сделать. Вынеси группу в атрибут и не мучайся.
Согласен, но только от части. Эти два метода получения имени группы можно совместить: еслиимя группы не указано, то используется имя группы "по-умолчанию" (из имени класса.)
 

whirlwind

TDD infected, paranoid
Когда пишешь get_class в родительском классе, то метод и возвращает имя родительского класса. А нужно чтобы возвращал имя класса наследника, но был написан в родительском классе.
Чушь не пиши, а возьми да попробуй

-~{}~ 09.03.10 09:43:

Автор оригинала: bobroff
Вроде нашел решение с помощью ReflectionClass

-~{}~ 09.03.10 09:40:


Согласен, но только от части. Эти два метода получения имени группы можно совместить: еслиимя группы не указано, то используется имя группы "по-умолчанию" (из имени класса.)
Ну так задавай имя группы по умолчанию в конструкторе. Привязка к именам классов убивает твое ооп.
 

fixxxer

К.О.
Партнер клуба
о господи
PHP:
class Model_Base {

   protected $group_name = 'default';

   public function getGroupName() {
        return $this->group_name;
   }

}

class Model_Foo extends Model_Base {

    protected $group_name = 'other';

}

class Bazzz {

     public function handleModelByGroup($Model) {
          $group_name = $Model->getGroupName();
          // ...
     }

}
тебе это надо чтоли? :)
 

bobroff

Новичок
Автор оригинала: whirlwind
Чушь не пиши, а возьми да попробуй

Написал после того, как попробовал.

-~{}~ 09.03.10 09:43:


Ну так задавай имя группы по умолчанию в конструкторе. Привязка к именам классов убивает твое ооп.
 
Сверху