从超类中调用子类方法

时间:2009-08-03 12:15:47

标签: php

我有一个大问题。如何从超类中获取被调用的子类方法。请执行以下代码。

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?

感谢。

6 个答案:

答案 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();

希望你得到我想要说明的内容。