php 子类名,php的继承方法获取子类名
看了一下datastore的入門,以及開始采用MVC方式來寫php,于是想拿php為redis寫個model,可以實現(xiàn)一些datastore的基本功能...于是碰到這樣一個問題-.-
php里__CLASS__這類東西是靜態(tài)綁定的,如果不再子類里重載的話,那么繼承父類方法所得到的依舊是父類的名稱而不是子類的名稱。比如:
class A{
function __construct(){
echo __CLASS__;
}
static function name(){
echo __CLASS__;
}
}
class B extends A{}
此時無論將B實例化還是直接調用靜態(tài)方法,echo出來的都會是A。翻qeephp里是用子類重載的方式解決這個問題,可是這樣的話沒新搞一個子類就得把相應調用類名的方法重載一邊.....這算是php在oop上的缺陷吧,試了試python上沒這個問題。
google之。找到兩個函數(shù)get_class()和get_called_class()。get_class()用于實例調用,加入參數(shù)($this)可解決子類繼承調用的問題,而get_called_class()則是用于靜態(tài)方法調用,可是...這玩意兒只在php 5.3以后才有....5.3還是比較遙遠的事...還好5.2之前可以手動實現(xiàn)這個函數(shù):參閱http://php.net/manual/en/function.get-called-class.php 下方有高手添加了幾種5.3之前的實現(xiàn)方式。
if(!function_exists('get_called_class')) {
class class_tools
{
private static $i = 0;
private static $fl = null;
public static function get_called_class()
{
$bt = debug_backtrace();
//使用call_user_func或call_user_func_array函數(shù)調用類方法,處理如下
if (array_key_exists(3, $bt)
&& array_key_exists('function', $bt[3])
&& in_array($bt[3]['function'], array('call_user_func', 'call_user_func_array'))
) {
//如果參數(shù)是數(shù)組
if (is_array($bt[3]['args'][0])) {
$toret = $bt[3]['args'][0][0];
return $toret;
}else if(is_string($bt[3]['args'][0])) {//如果參數(shù)是字符串
//如果是字符串且字符串中包含::符號,則認為是正確的參數(shù)類型,計算并返回類名
if(false !== strpos($bt[3]['args'][0], '::')) {
$toret = explode('::', $bt[3]['args'][0]);
return $toret[0];
}
}
}
//使用正常途徑調用類方法,如:A::make()
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();
}
}
于是現(xiàn)在可以把例子這么修改:
class A{
function __construct(){
echo get_class($this);
}
static function name(){
echo get_called_class();
}
}
class B extends A{}
這樣就能讓B直接順利繼承獲取當前類名的方法了~
總結
以上是生活随笔為你收集整理的php 子类名,php的继承方法获取子类名的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php折半查找算法,php二分法查找(也
- 下一篇: 安阳师范学院有几个校区及校区地址(哪个校