日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

php 子类名,php的继承方法获取子类名

發(fā)布時(shí)間:2025/4/5 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php 子类名,php的继承方法获取子类名 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

看了一下datastore的入門(mén),以及開(kāi)始采用MVC方式來(lái)寫(xiě)php,于是想拿php為redis寫(xiě)個(gè)model,可以實(shí)現(xiàn)一些datastore的基本功能...于是碰到這樣一個(gè)問(wèn)題-.-

php里__CLASS__這類(lèi)東西是靜態(tài)綁定的,如果不再子類(lèi)里重載的話,那么繼承父類(lèi)方法所得到的依舊是父類(lèi)的名稱(chēng)而不是子類(lèi)的名稱(chēng)。比如:

class A{

function __construct(){

echo __CLASS__;

}

static function name(){

echo __CLASS__;

}

}

class B extends A{}

此時(shí)無(wú)論將B實(shí)例化還是直接調(diào)用靜態(tài)方法,echo出來(lái)的都會(huì)是A。翻qeephp里是用子類(lèi)重載的方式解決這個(gè)問(wèn)題,可是這樣的話沒(méi)新搞一個(gè)子類(lèi)就得把相應(yīng)調(diào)用類(lèi)名的方法重載一邊.....這算是php在oop上的缺陷吧,試了試python上沒(méi)這個(gè)問(wèn)題。

google之。找到兩個(gè)函數(shù)get_class()和get_called_class()。get_class()用于實(shí)例調(diào)用,加入?yún)?shù)($this)可解決子類(lèi)繼承調(diào)用的問(wèn)題,而get_called_class()則是用于靜態(tài)方法調(diào)用,可是...這玩意兒只在php 5.3以后才有....5.3還是比較遙遠(yuǎn)的事...還好5.2之前可以手動(dòng)實(shí)現(xiàn)這個(gè)函數(shù):參閱http://php.net/manual/en/function.get-called-class.php 下方有高手添加了幾種5.3之前的實(shí)現(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ù)調(diào)用類(lèi)方法,處理如下

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ù)是字符串

//如果是字符串且字符串中包含::符號(hào),則認(rèn)為是正確的參數(shù)類(lèi)型,計(jì)算并返回類(lèi)名

if(false !== strpos($bt[3]['args'][0], '::')) {

$toret = explode('::', $bt[3]['args'][0]);

return $toret[0];

}

}

}

//使用正常途徑調(diào)用類(lèi)方法,如: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直接順利繼承獲取當(dāng)前類(lèi)名的方法了~

總結(jié)

以上是生活随笔為你收集整理的php 子类名,php的继承方法获取子类名的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。