So erhalten Sie den Namen der aufrufenden Klasse (in PHP)

Lesezeit: 3 Minuten
define('anActionType', 1);
$actionTypes = array(anActionType => 'anActionType');
class core {
    public $callbacks = array();
    public $plugins = array();
    public function __construct() {
        $this->plugins[] = new admin();
        $this->plugins[] = new client();
    }
}
abstract class plugin {
    public function registerCallback($callbackMethod, $onAction) {
        if (!isset($this->callbacks[$onAction]))
            $this->callbacks[$onAction] = array();

        global $actionTypes;
        echo "Calling $callbackMethod in $callbacksClass because we got {$actionTypes[$onAction]}" . PHP_EOL;

        // How do I get $callbacksClass?

        $this->callbacks[$onAction][] = $callbackMethod;
    }
}
class admin extends plugin {
    public function __construct() {
        $this->registerCallback('onTiny', anActionType);
    }
    public function onTiny() { echo 'tinyAdmin'; }
}
class client extends plugin {
    public function __construct() {
        $this->registerCallback('onTiny', anActionType);
    }
    public function onTiny() { echo 'tinyClient'; }
}
$o = new core();

$callbacksClass sollte admin oder client sein. Oder verfehle ich hier den Punkt komplett und sollte das anders angehen? Es sollte beachtet werden, dass ich nur eine Antwort akzeptiere, bei der ich den Klassennamen nicht als Argument an die Methode registerCallback senden muss.

  • Ähm, beide Methoden sind Instanzmethoden (keine Statik). Wenn Sie also den Klassennamen wirklich für einen anderen Zweck benötigen, dann müssen Sie ihn nur wiedergeben (dh den Callback aufrufen), müssen Sie wahrscheinlich eher eine Instanz als einen Klassennamen angeben …

    – Wrikken

    1. September 2010 um 21:14 Uhr

Benutzer-Avatar
Hamster

Wenn jemand hierher gekommen ist, um herauszufinden, wie man den Namen einer anrufenden Klasse aus einer anderen Klasse erhält, wie ich es getan habe, sehen Sie sich das an https://gist.github.com/1122679

EDIT: Code eingefügt

function get_calling_class() {

    //get the trace
    $trace = debug_backtrace();

    // Get the class that is asking for who awoke it
    $class = $trace[1]['class'];

    // +1 to i cos we have to account for calling this function
    for ( $i=1; $i<count( $trace ); $i++ ) {
        if ( isset( $trace[$i] ) ) // is it set?
             if ( $class != $trace[$i]['class'] ) // is it a different class
                 return $trace[$i]['class'];
    }
}

Z.B

class A {
    function t() {
        echo get_calling_class();
    }
}

class B {
    function x() {
        $a = new A;
        $a->t();
    }
}

$b = new B;
$b->x(); // prints B

  • Ich denke, wenn Sie den Code hier einfügen, erhalten Sie mehr positive Stimmen als nur meine. (Obwohl ich GitHub liebe, wäre es nur besser, wenn der Quellcode dafür hier gehostet würde.)

    – Mark Tomlin

    4. August 2011 um 13:48 Uhr

  • Prost dafür. Hat mir weitergeholfen.

    – Neil Masters

    23. Juli 2015 um 10:36 Uhr

  • Können Sie erklären, warum Sie den Stacktrace durchlaufen müssen? In meiner Version schaue ich nur, ob der Stack-Count gleich oder über 3 ist, dann kehre ich zurück $stack[2]['class']. Ich gebe den zweiten Index zurück, weil sich meine Methode in einer Klasse befindet, die von einer anderen Klasse aufgerufen wird, die wissen möchte, welche Klasse sie aufruft. Also, ich will es wissen EIN das ruft B::method das nutzt die Reflector::getCallerClass Methode.

    – Meister DJon

    8. Juni um 14:08 Uhr


Benutzer-Avatar
Theodore R. Smith

Verwenden get_class():

$this->callbacks[$onAction][] = $callbackMethod;
$className = get_class($this);

// Call callback method
$className->$callbackMethod();

  • Es ist genau das, wonach ich gesucht habe. 🙂

    – Mark Tomlin

    2. September 2010 um 8:41 Uhr

  • Dies gibt nicht die aufrufende Klasse zurück, sondern nur die Klasse von $this. Wenn Sie registerCallback mit einer anderen Klasse aufrufen, würde dies fehlschlagen. Machen Sie entweder registerCallback protected oder verwenden Sie den Matthews-Ansatz.

    – Benutzer23127

    20. April 2014 um 16:44 Uhr


  • Sie können auch verwenden static::class Anstatt von get_class($this). Funktioniert nur in PHP 8+, wenn ich mich nicht irre

    – Arxeiss

    3. Dezember 2021 um 14:21 Uhr

Sie sollten wirklich so etwas tun:

$this->registerCallback(array($this, 'onTiny'), anActionType);

So arbeitet PHP mit Handles auf Objektmethoden.

  • So funktionieren die PHP-internen Callback-Funktionen (wie preg_replace_callback), aber nicht seine Klasse. Seine Klasse würde brechen, wenn er diese Syntax verwenden würde.

    – Theodore R. Smith

    1. September 2010 um 18:38 Uhr

  • Er sollte seine Klasse so ändern, dass sie mit normalen PHP-Callbacks funktioniert, es sei denn, es gibt einen sehr guten Grund, dies nicht zu tun.

    – Matthew

    1. September 2010 um 18:43 Uhr

Ab PHP 8+ können Sie verwenden static::class statt get_class($this).

Dieser wird auch automatisch mit PHP Code Sniffer und Regel behoben SlevomatCodingStandard.Classes.ModernClassNameReference

1098780cookie-checkSo erhalten Sie den Namen der aufrufenden Klasse (in PHP)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy