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

Voyager2K

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

Есть один класс, наследуемый от другого. Вопрос каким образом из метода родителя [ fun() ] узнать имя дочернего(test2) класа?

- Переорпределять метод в дочернем классе не хочется, т.к. таких классов будет много и все их переопределять не есть гуд.
- Передавать переменной имя класса в методы [ such_func_will_be_too($classname)] тоже не хочется.
- для НЕ static проблему можно решить переменной объекта $this->className к которой и будут обращаться методы из test1. А вот для стати методово что придумать?

PHP:
class test1
{
	public function fun()
	{
		echo 'AT TEST1.... '.__CLASS__.'<br>';;
	}
	
	static public function such_func_will_be_too()
	{
		echo 'AT TEST1.... '.__CLASS__.'<br>';
	}
}

class test2 extends test1 
{
	function __construct()
	{
		echo 'AT TEST2.... '.__CLASS__.'<br>';;
	}
	
	/*
	static public function such_func_will_be_too($classname)
	{
		test1::such_func_will_be_too($classname);
	}*/
}

$t = new test2();
$t->fun();

test2::such_func_will_be_too();
Какие могут быть выходы?
 

hermit_refined

Отшельник
зачем - что вы с этим именем хотите делать?..

P.S. ибо даже если вам это действительно нужно - всё равно придется искать другие способы.
 

Voyager2K

Новичок
static public function
чем обосновано?
Именно такая запись?
или статик функции?

зачем - что вы с этим именем хотите делать
test1 будет реализовывать доступ дочерних объектов к БД.
Статик функции, например, для взятия кучи объектов:
$objs = test2::getObjects($params);
// $objs - массив объектов test2 удовлетвор. пар-ам $params.

Имя класса нужно дабы статик функция из test1 знала какие объекты создавать.

Это можно будет использовать. Хотя, мне почему-то больше нравится вариант:
в конструкторе test2 или при объявлении переменных класса:
$this->className = __CLASS__;
 

Voyager2K

Новичок
почему статик?
А это запрещено ;) для чего бы то ни были нужны статк методы...

Например:
test1 будет реализовывать доступ дочерних объектов к БД(и остальную работу в этой области, сортировка, удаление и т.д.).
Статик функции, например, для взятия кучи объектов:
$objs = test2::getObjects($params);
// $objs - массив объектов test2 удовлетвор. пар-ам $params.

Имя класса нужно дабы статик функция из test1 знала какие объекты создавать.
 

hermit_refined

Отшельник
test1 будет реализовывать доступ дочерних объектов к БД.
Статик функции, например, для взятия кучи объектов:
да, это самый распространенный случай, когда подобное требуется.
увы, никак. только вариации на тему test1::findAll('test2', ...);
а чтобы test2::findAll() - приходится переопределять явно.
Это можно будет использовать. Хотя, мне почему-то больше нравится вариант:
в конструкторе test2
зря. зачем хранить информацию, которая и так всегда есть?
кстати, вот это уже редко когда нужно. ибо можно пользоваться полиморфизмом.
 

Voyager2K

Новичок
Кстати, такое еще вопрос. А то мож я не вижу более простого решения.

Если в test1 из статик функции нужно выполнить некие действия с статик переменными test2:

PHP:
static function test1_func($classname)
{
eval($classname.'::$test2_var = "something";');
}
посимпотнее это реализовать реально?

-~{}~ 23.02.07 10:02:

Еще вопросик сыпану. Дабы не описывать проблему своими корявыми изложениями, приведу лучше упоминание о нем с пхп.нет

Inheritance with the static elements is a nightmare in php. Consider the following code:

<?php
class BaseClass{
public static $property;
}

class DerivedClassOne extends BaseClass{
}

class DerivedClassTwo extends BaseClass{
}

DerivedClassOne::$property = "foo";
DerivedClassTwo::$property = "bar";

echo DerivedClassOne::$property; //one would naively expect "foo"...
?>

What would you expect as an output? "foo"? wrong. It is "bar"!!! Static variables are not inherited, they point to the BaseClass::$property.

At this point I think it is a big pity inheritance does not work in case of static variables/methods. Keep this in mind and save your time when debugging.

best regards - michal
Наткнулся на то же самое.
Как выход пришло в бошку только в каждом дочернем классе в описании добавлять эту статик переменную. В вышеприведенном случае: public static $property; распихать по дочерним, тогда они будут независимыми.

Но если статик переменных достаточно много с учетом всех классов и нет желания их везде прописывать, захломляя код лишними 10-20 строчками (с учетом комментов)? Лишнийдублеж получается.... фю.
Мож через eval(в моем случае это красивее будет) присваивать значения ?
 
Сверху