我有一个大问题。如何从超类中获取被调用的子类方法。请执行以下代码。
class Model {
public function render(){
echo '<br />class: '.get_class($this).' -- function: '.__FUNCTION__;
}
}
class Product extends Model {
public function show(){
$this->render();
}
}
class User extends Model {
public function index(){
$this->render();
}
}
$p = new Product();
$u = new User();
echo $p->show();
echo $u->index();
result : class: Product -- function: render class: User -- function: render
如何获取子类方法名而不是render?
感谢。
答案 0 :(得分:2)
您可以使用debug_backtrace()
获取该信息。
我很好奇你为什么要这样 - 如果除了调试之外的其他任何东西需要它,它可能表明你的设计存在缺陷。
答案 1 :(得分:1)
__FUNCTION__
thingie在编译时被其所在函数的名称替换。所以无论你的对象模型是如何构造的,你都会得到满足__FUNCTION__
的函数。通过PHP的预处理器。
如果你想知道被调用方法的名称,你可以在这里做的最好的事情是将它作为参数添加到方法render()中:
class Model {
public function render($methodName){
echo '<br />class: '.get_class($this).' -- function: '. $methodName;
}
}
在方法调用中添加名称:
class Product extends Model {
public function show(){
$this->render(__FUNCTION__);
}
}
class User extends Model {
public function index(){
$this->render(__FUNCTION__);
}
}
答案 2 :(得分:1)
你能详细说明为什么需要这个吗?
我不确定你要做什么,但特别是在开发PHP框架时,你应该限制自己的基本继承规则。
也许你可以更好地说明你想要实现的目标。
答案 3 :(得分:0)
难道你不能简单地将其更改为以下内容吗?
class Model {
protected $_type='unspecified';
public function render(){
echo '<br />class: '.$this->_type.' -- function: '.__FUNCTION__;
}
}
class Product extends Model {
public function __construct(){
$this->_type = 'product';
}
public function show(){
$this->render();
}
}
class User extends Model {
public function __construct(){
$this->_type = 'user';
}
public function index(){
$this->render();
}
}
或者有什么理由不适合你吗?
答案 4 :(得分:0)
您可以将运行您正在渲染的内容的逻辑移动到超类中,例如:
class Model {
public function render($type){
echo '<br />class: '.get_class($this).' -- function: '.$type;
}
public function show() {
$this->render('show');
}
public function index() {
$this->render('index');
}
}
class Product extends Model {
public function show(){
//some stuff
parent::show();
}
}
class User extends Model {
public function index(){
parent::index();
}
}
答案 5 :(得分:0)
我不是真的向你推荐这个,但是你能做的就是抛出一个异常并立即抓住它。
然后,您可以使用此异常的堆栈跟踪来找出称为渲染方法的函数。
我知道它有效,但在性能和编码方面都不是一个好的选择。
更新:
<?php
class bla {
function test1() {
$this->test2();
}
function test2() {
$method = "";
try {
throw new Exception("bla");
} catch(Exception $e) {
$trace = $e->getTrace();
$method = $trace[1]['function']);
}
echo $method; //will echo test1
}
}
$blub = new bla();
$blub->test1();
希望你得到我想要说明的内容。