Вызвать метод подкласса из суперкласса - PullRequest
2 голосов
/ 03 августа 2009

У меня большая проблема. Как получить вызываемый метод подкласса от суперкласса. Пожалуйста, введите ниже код.

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 ]

2 голосов
/ 03 августа 2009

Вы можете получить эту информацию, используя debug_backtrace().

Мне любопытно, почему вы этого хотите - это может указывать на недостаток вашего дизайна, если вам это нужно для чего-то кроме отладки.

1 голос
/ 03 августа 2009

Не могли бы вы подробно рассказать, зачем вам это нужно?

Я не уверен, что вы пытаетесь сделать, но особенно когда вы разрабатываете PHP-фреймворк, вы должны ограничиться основными правилами наследования.

Может быть, вы могли бы немного лучше проиллюстрировать, чего вы пытаетесь достичь с помощью этого.

1 голос
/ 03 августа 2009

Вещество __FUNCTION__ заменяется во время компиляции именем функции, в которой оно находится. Поэтому независимо от того, как структурирована ваша объектная модель, вы получите функцию, где __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__);
    }
}
0 голосов
/ 03 августа 2009

Я не очень рекомендую это вам, но вы могли бы бросить исключение и сразу его поймать.

Затем вы можете использовать трассировку стека этого исключения, чтобы узнать, какая функция вызвала ваш метод рендеринга.

Я знаю, что это работает, но как по производительности, так и по кодированию это не очень хороший вариант.

UPDATE:

<?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();

Надеюсь, вы понимаете, что я пытаюсь проиллюстрировать.

0 голосов
/ 03 августа 2009

Вы можете переместить логику, которая обрабатывает то, что вы рендеринг, в суперкласс, например ::

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();
    }
}
0 голосов
/ 03 августа 2009

Не могли бы вы просто изменить его на следующее?

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();
    }
}

Или есть какая-то причина, почему это не работает для вас?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...