Mam dwie klasy: Action
i MyAction
. Ten ostatni jest deklarowany jako:
class MyAction extends Action {/* some methods here */}
Potrzebuję tylko metody w Action
klasie (tylko w niej, ponieważ klas dziedziczonych będzie dużo, a nie chcę implementować tej metody we wszystkich), która zwróci classname z wywołania statycznego. Oto o czym mówię:
Class Action {
function n(){/* something */}
}
A kiedy to nazywam:
MyAction::n(); // it should return "MyAction"
Ale każda deklaracja w klasie nadrzędnej ma dostęp tylko do __CLASS__
zmiennej klasy nadrzędnej , która ma wartość „Akcja”.
Czy można to zrobić?
źródło
get_called_class()
:)new static();
z wnętrza prywatnej metody statycznej (przy użyciu xampp w systemie Windows i php> 5.5).:s
Od wersji 5.5 możesz używać
class
słowa kluczowego do rozpoznawania nazw klas , co byłoby o wiele szybsze niż wywoływanie funkcji. Działa również z interfejsami.// C extends B extends A static::class // MyNamespace\ClassC when run in A self::class // MyNamespace\ClassA when run in A parent::class // MyNamespace\ClassB when run in C MyClass::class // MyNamespace\MyClass
źródło
Nie jest to idealne rozwiązanie, ale działa na PHP <5.3.0.
Kod został skopiowany z septuro.com
if(!function_exists('get_called_class')) { class class_tools { static $i = 0; static $fl = null; static function get_called_class() { $bt = debug_backtrace(); if (self::$fl == $bt[2]['file'].$bt[2]['line']) { self::$i++; } else { self::$i = 0; self::$fl = $bt[2]['file'].$bt[2]['line']; } $lines = file($bt[2]['file']); preg_match_all('/([a-zA-Z0-9\_]+)::'.$bt[2]['function'].'/', $lines[$bt[2]['line']-1], $matches); return $matches[1][self::$i]; } } function get_called_class() { return class_tools::get_called_class(); } }
źródło
Teraz (kiedy nadszedł 5.3) jest to całkiem proste:
http://php.net/manual/en/function.get-called-class.php
źródło
class MainSingleton { private static $instances = array(); private static function get_called_class() { $t = debug_backtrace(); return $t[count($t)-1]["class"]; } public static function getInstance() { $class = self::get_called_class(); if(!isset(self::$instances[$class]) ) { self::$instances[$class] = new $class; } return self::$instances[$class]; } } class Singleton extends MainSingleton { public static function getInstance() { return parent::getInstance(); } protected function __construct() { echo "A". PHP_EOL; } protected function __clone() {} public function test() { echo " * test called * "; } } Singleton::getInstance()->test(); Singleton::getInstance()->test();
źródło
W dostępnych wersjach PHP nie ma możliwości robienia tego, co chcesz. Rozwiązanie Paula Dixona jest jedyne. Mam na myśli przykład kodu, ponieważ funkcja późnych wiązań statycznych, o której mówi, jest dostępna od PHP 5.3, które jest w wersji beta.
źródło
(PHP 5> = 5.3.0, PHP 7)
get_called_class - Nazwa klasy „Późne wiązanie statyczne”
<?php class Model { public static function find() { return get_called_class(); } } class User extends Model { } echo User::find();
ten link może być pomocny
źródło