Как определить имя текущего класса php?

O
На сайте с 23.09.2014
Offline
76
701

Есть такой кода:


class A
{
private static $obj = array();
public function __get($name)
{
if(isset(self::$obj[$name]))
return(self::$obj[$name]);

$class = ucfirst($name);
self::$obj[$name] = new $class();
return self::$obj[$name];
}
}

class B extends A
{
public $name;

public function set()
{
return $this->name = __CLASS__;
}
}

class C1 extends A
{
public function test()
{
$this->b->set();
}
}

class C2 extends A
{
public function test()
{
$this->b->set();
}
}

$c1 = new C1();
$c1->test();
echo $c1->b->name;

print '<br><br>';

$c2 = new C2();
$c2->test();
echo $c2->b->name;

//Результат:
//B

//B

Мне нужно чтобы метод set, который передает значение имени класса в свойство public $name - определял имена классов в которых он выполняется ( это C1 и C2). В данном случаи он определяет только имя класса В .

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

ДП
На сайте с 23.11.2009
Offline
203
#1

http://php.net/manual/ru/function.get-class.php и get_called_class() пробовали?

O
На сайте с 23.09.2014
Offline
76
#2
Дикий пионер:
http://php.net/manual/ru/function.get-class.php и get_called_class() пробовали?

Тот же результат: имя B


public function set()
{
return $this->name = get_class($this);
}
edogs software
На сайте с 15.12.2005
Offline
775
#3

Osavul,

Это немного извращенческий варинт, но

public function set()
{ $t=end(debug_backtrace());
return $this->name = $t['class'];
}
Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
O
На сайте с 23.09.2014
Offline
76
#4
edogs:
Osavul,
Это немного извращенческий варинт, но

Сейчас определяет так как нужно, но выдаются также предупреждения:


Strict Standards: Only variables should be passed by reference in C:\OpenServer\domains\test2.loc\index.php on line 25
C1


Strict Standards: Only variables should be passed by reference in C:\OpenServer\domains\test2.loc\index.php on line 25
C2
ДП
На сайте с 23.11.2009
Offline
203
#5

Эм, а ничего, что у вас по коду свойство класса b и должно быть объектом класса B?

У вас же здесь композиция получается, а не наследование, т.е. грубо говоря экзмепляр класса B не знает, что он - просто переменная или свойство класса C1 например. т.е. вот только через такие костыли получить имя вызываемого класса.

Вы чисто теоретически интересуетесь или какую-то практическую задачу решаете?

O
На сайте с 23.09.2014
Offline
76
#6
Дикий пионер:
Вы чисто теоретически интересуетесь или какую-то практическую задачу решаете?

Практическую задачу. Мне нужно чтобы каким-то образом знать в каком конкретно классе вызывается метод set, и передавал эту информацию классу B, где на основе этого будет строится дальнейшая логика.

edogs software
На сайте с 15.12.2005
Offline
775
#7
Osavul:
Сейчас определяет так как нужно, но выдаются также предупреждения:

А раньше не выдавалось что-ли? Тогда сначала присваивайте, потом возвращайте. Хотя не критично как по нам.

Osavul:
Практическую задачу. Мне нужно чтобы каким-то образом знать в каком конкретно классе вызывается метод set, и передавал эту информацию классу B, где на основе этого будет строится дальнейшая логика.

Правильным ответом на эту ситуацию будет явная передача классу откуда его вызывают.

Не $this->b->set(); , а $this->b->set('class:b'); и дальше уже строить логику на основе переданной переменной, а не на основе вычислений источника вызова.

Если у Вас класс должен "догадываться" откуда он вызван, то рано или поздно это приведет к эпик фэилу. Вызовите Вы его напрямую (не через c1) или еще шагом дальше (через d01 extends c01) и начнется чехарда. Плюс для последующих программеров код будет не очевиден.

O
На сайте с 23.09.2014
Offline
76
#8
edogs:
Правильным ответом на эту ситуацию будет явная передача классу откуда его вызывают.
Не $this->b->set(); , а $this->b->set('class:b'); и дальше уже строить логику на основе переданной переменной

У меня есть множество подобных классов C1,C2,C3...Cn, в которых в свою очередь содержатся десятки методов set. На данный момент у меня в метод set передается параметр - но это не удобно в каждый метод set передавать одно-и тоже значение параметра. Вот я и решил это автоматизировать, чтобы не писать одно и тоже по 100 раз.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий