Saya memiliki dua kelas: Action
dan MyAction
. Yang terakhir dinyatakan sebagai:
class MyAction extends Action {/* some methods here */}
Yang saya butuhkan hanyalah metode di Action
kelas (hanya di dalamnya, karena akan ada banyak kelas yang diwariskan, dan saya tidak ingin menerapkan metode ini di semua kelas), yang akan mengembalikan nama kelas dari panggilan statis. Inilah yang saya bicarakan:
Class Action {
function n(){/* something */}
}
Dan saat saya menyebutnya:
MyAction::n(); // it should return "MyAction"
Tetapi setiap deklarasi di kelas induk memiliki akses hanya ke __CLASS__
variabel kelas induk , yang memiliki nilai "Tindakan".
Apakah ada cara yang mungkin untuk melakukan ini?
sumber
get_called_class()
:)new static();
dari dalam metode statis pribadi (menggunakan xampp di windows dan php> 5.5).:s
Sejak 5.5 Anda dapat menggunakan
class
kata kunci untuk resolusi nama kelas , yang akan jauh lebih cepat daripada membuat panggilan fungsi. Juga berfungsi dengan antarmuka.// 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
sumber
Ini bukan solusi ideal, tetapi berfungsi pada PHP <5.3.0.
Kode tersebut disalin dari 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(); } }
sumber
Sekarang (ketika 5.3 telah tiba) itu cukup sederhana:
http://php.net/manual/en/function.get-called-class.php
sumber
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();
sumber
Tidak ada cara, dalam versi PHP yang tersedia, untuk melakukan apa yang Anda inginkan. Solusi Paul Dixon adalah satu-satunya. Maksud saya, contoh kode, karena fitur binding statis terakhir yang dia bicarakan tersedia mulai PHP 5.3, yang dalam versi beta.
sumber
(PHP 5> = 5.3.0, PHP 7)
get_called_class - Nama kelas "Late Static Binding"
<?php class Model { public static function find() { return get_called_class(); } } class User extends Model { } echo User::find();
link ini mungkin bisa membantu
sumber