Hogyan lehetne kideríteni a következőt?
class A {
public static function Foo() {
//...
echo $class;
}
}
class B {}
A::Foo(); // A
B::Foo(); // B
Ahogy nézem, a get_called_class() erre lenne jó. Egyetlen probléma ezzel a metódussal, hogy PHP 5.3 óta van, nekem meg mindenképp 5.2 alatt kellene működő megoldás. Fontos: statikus metódusról van szó.
Szerk:
/me RTFM. http://us.php.net/manual/en/function.get-called-class.php#92572
Ronda, de majd ha nem kell 5.2-t támogatni, lehet kukázni.
- 1001 megtekintés
Hozzászólások
Olvasd el Felho blogjat, miert nem megy ez:
http://blog.felho.hu/what-is-new-in-php-53-part-2-late-static-binding.h…
- A hozzászóláshoz be kell jelentkezni
Ebbe én is belefutottam, csak a get_called_class() az egyetlen elegáns megoldás, php 5.3 alatt.
- A hozzászóláshoz be kell jelentkezni
Problema, hogy 5.2-re kell.
----------------
Lvl86 Troll
- A hozzászóláshoz be kell jelentkezni
A PHP manuálban a kommentek között vannak backportok 5.2-re, próbáld ki. A másik lehetőség a ReflectionClass::getName() használata, ez viszont némely esetekben lassítja a futtatást.
- A hozzászóláshoz be kell jelentkezni
Hát azok a backportok egytől-egyik elég nagy gányok...
- A hozzászóláshoz be kell jelentkezni
5.2 alatt gányolás nélkül nehezen fogja tudni megoldani.
- A hozzászóláshoz be kell jelentkezni
Attól tartok a ReflectionClass sem megoldás, nem tudom működésre bírni statikus metódusban... Marad a gányolás.
- A hozzászóláshoz be kell jelentkezni
Igen, értem, én is ugyan ebe futottam. :)
Csak gányolni tudsz 5.2 alatt, pl így:
class Foo {
private static $_classname;
public function __construct($classname = __CLASS__) {
$this->_classname = $classname;
}
public static function who() {
return $this->_classname;
}
- A hozzászóláshoz be kell jelentkezni
Statikus metódushívásnál nem hívódik meg a konstruktor, ha előtte valahol nem példányosították az osztályt.
- A hozzászóláshoz be kell jelentkezni
Igazad van, bele kell gányolni egy private static $_instance változót is, aztán gyakorlatilag mint egy singleton, létrehozza magát.
- A hozzászóláshoz be kell jelentkezni
Nem kell ganyolni, a srac tulkonkretizalta a problemat.
Egyszeruen az o - domain szintu - problemajat az adott nyelven mashogy kell megoldani :)
- A hozzászóláshoz be kell jelentkezni