而实际上我想要得到的是
子类B
的名称!那如何实现呢?
PHP自带两个函数
get_class()
和
get_called_class()
可以解决这个问题。
get_class()
用于实例调用,加入参数($this)可解决子类继承调用的问题,而
get_called_class()
则是用于静态方法调用。
注意,注意, 注意:虽说get_called_class()是用于静态方法调用,但它也可用于类的非静态方法中,但必须强调一点,get_called_class()所处的函数必须在类里面;
需要注意的是
:
get_called_class()
需要
PHP>=5.3.0
才支持,官方手册:
http://php.net/manual/en/function.get-called-class.php
,对于 PHP5.3.0以下的版本,有人给出了如下实现方式:
02
|
if
(!function_exists(
'get_called_class'
))
|
06
|
private
static
$i
= 0;
|
07
|
private
static
$file
= null;
|
09
|
public
static
function
get_called_class()
|
11
|
$bt
= debug_backtrace();
|
14
|
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'
))
|
18
|
if
(
is_array
(
$bt
[3][
'args'
][0]))
|
20
|
$toret
=
$bt
[3][
'args'
][0][0];
|
24
|
else
if
(
is_string
(
$bt
[3][
'args'
][0]))
|
28
|
if
(false !==
strpos
(
$bt
[3][
'args'
][0],
'::'
))
|
30
|
$toret
=
explode
(
'::'
,
$bt
[3][
'args'
][0]);
|
38
|
if
(self::
$file
==
$bt
[2][
'file'
] .
$bt
[2][
'line'
])
|
45
|
self::
$file
=
$bt
[2][
'file'
] .
$bt
[2][
'line'
];
|
47
|
$lines
= file(
$bt
[2][
'file'
]);
|
48
|
preg_match_all(
'/([a-zA-Z0-9\_]+)::'
.
$bt
[2][
'function'
] .
'/'
,
$lines
[
$bt
[2][
'line'
] - 1],
$matches
);
|
50
|
return
$matches
[1][self::
$i
];
|
54
|
function
get_called_class()
|
56
|
return
classTools::get_called_class();
|
现在,把例子修改下:
04
|
function
__construct()
|
06
|
echo
get_class(
$this
);
|
09
|
static
function
name()
|
11
|
echo
get_called_class();
|
呵呵,这是我想要的结果!
转载出处:http://blog.snsgou.com/post-874.html?utm_source=tuicool
欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入
获取
分类下面的所有
子类
方法
: static function getMenuTree($arr
Ca
t, $parent_id = 0, $level = 0,$all=True) { static $arrTree; //使用static代替global if(!$all) $arrTree =''; if( empty...
我想要做的是找到扩展某个基类的所有
子类
.基本上,我希望做的是:>将所有
PHP
文件包含在目录中.>测试每个include是否引入了基类的新
子类
.但我想在一个孤立的
PHP
环境中进行包含,这样我就可以避免因包含
PHP
文件而引入的任何错误和警告.这是一个小例子:Base
Class
.
php
abstract
class
Base
Class
{}?>FirstSub
class
.
php
class
...
获取
分类以下的全部
子类
方法
:static function getMenuTree($arr
Ca
t, $parent_id = 0, $level = 0,$all=True){static $arrTree; //使用static取代globalif(!$all) $arrTree ='';if( empty($arr
Ca
t)) return FALSE;$level++;if($level ...
function GetSon($PID=''){$this->dataconnect();if($PID=='') return;$returnSiteID = null;if($PID == 0){$returnSiteID = $this->db->GetCol("SELECT SiteID FROM cms_r_site WHERE PublishMode=1 ORDER...
看了一下datastore的入门,以及开始采用MVC方式来写
php
,于是想拿
php
为redis写个model,可以实现一些datastore的基本功能...于是碰到这样一个问题-.-
php
里__
CLASS
__这类东西是静态绑定的,如果不再
子类
里重载的话,那么
继承
父类
方法
所得到的依旧是父类的
名
称而不是
子类
的
名
称。比如:
class
A{function __construct(){echo __CLA...
我在构建ORM库时要考虑到重用和简单性。一切都进行得很好,除了我被愚蠢的
继承
限制所困。请考虑以下代码:
class
BaseModel {/** Return an instance of a Model from the database.*/static public function get (/* varargs */) {// 1. Notice we want an instance o...
获取
分类下面的所有
子类
方法
:static function getMenuTree($arr
Ca
t, $parent_id = 0, $level = 0,$all=True) { static $arrTree; //使用static代替global if(!$all) $arrTree =''; if( empty($arr
Ca
t)) retu...
PHP
中通过 __
CLASS
__ 可以
获取
当前的类
名
,但它是静态绑定的,如果不在
子类
里重载的话,那么
继承
父类
方法
所得到的依旧是父类的
名
称,而不是
子类
的
名
称,比如:
<?
php
class
Base {
function __construct() {
echo __
CLASS
__;
static function get
Class
() {
echo __
CLASS
__;
class
Child extends Base
php
的
继承
方法
获取
子类
名
看了一下datastore的入门,以及开始采用MVC方式来写
php
,于是想拿
php
为redis写个model,可以实现一些datastore的基本功能...于是碰到这样一个问题-.-
php
里__
CLASS
__这类东西是静态绑定的,如果不再
子类
里重载的话,那么
继承
父类
方法
所得到的依旧是父类的
名
称而不是
子类
的
名
称。比如:
class
A{function __construct...