it-swarm.com.de

Wie kann ich den Klassennamen aus einem statischen Aufruf in einer erweiterten PHP Klasse erhalten?

Ich habe zwei Klassen: Action und MyAction. Letzteres wird deklariert als:

class MyAction extends Action {/* some methods here */}

Alles, was ich brauche, ist eine Methode in der Klasse Action (nur darin, weil es viele geerbte Klassen gibt, und ich möchte diese Methode nicht in allen implementieren), die den Klassennamen von zurückgibt ein statischer Anruf. Hier ist, wovon ich rede:

Class Action {
 function n(){/* something */}
}

Und wenn ich es nenne:

MyAction::n(); // it should return "MyAction"

Jede Deklaration in der übergeordneten Klasse hat jedoch nur Zugriff auf die übergeordnete Klasse __CLASS__ Variable, die den Wert "Aktion" hat.

Gibt es eine Möglichkeit, dies zu tun?

80
Anton

__CLASS__ gibt immer den Namen der Klasse zurück, in der es verwendet wurde, daher ist es bei einer statischen Methode nicht sehr hilfreich. Wenn die Methode nicht statisch wäre, könnten Sie einfach get_class ($ this) verwenden. z.B.

class Action {
    public function n(){
        echo get_class($this);
    }

}

class MyAction extends Action {

}

$foo=new MyAction;

$foo->n(); //displays 'MyAction'

Späte statische Bindungen, verfügbar in PHP 5.3+

Nachdem PHP 5.3 freigegeben wurde, können Sie späte statische Bindungen verwenden, um die Zielklasse für einen statischen Methodenaufruf zur Laufzeit aufzulösen, anstatt wenn sie definiert ist .

Während die Funktion keine neue magische Konstante einführt, um Ihnen den Klassennamen mitzuteilen, über den Sie aufgerufen wurden, bietet sie eine neue Funktion, get_called_class () , die Ihnen den Namen der Klasse mitteilt, die eine statische Methode war angerufen. Hier ist ein Beispiel:

Class Action {
    public static function n() {
        return get_called_class();
    }
}


class MyAction extends Action {

}


echo MyAction::n(); //displays MyAction
166
Paul Dixon

Seit 5.5 können Sie verwenden Sie class als Schlüsselwort für die Klassennamenauflösung , was viel schneller ist als Funktionsaufrufe. Funktioniert auch mit Schnittstellen.

// C extends B extends A

static::class  // MyNamespace\ClassC when run in A
self::class    // MyNamespace\ClassA when run in A
parent::class  // MyNamespace\ClassB when run in C
MyClass::class // MyNamespace\MyClass
37
Ian Bytchek

Es ist nicht die ideale Lösung, aber es funktioniert mit PHP <5.3.0.

Der Code wurde von septuro.com kopiert

if(!function_exists('get_called_class')) {
    class class_tools {
        static $i = 0;
        static $fl = null;

        static function get_called_class() {
            $bt = debug_backtrace();

            if (self::$fl == $bt[2]['file'].$bt[2]['line']) {
                self::$i++;
            } else {
                self::$i = 0;
                self::$fl = $bt[2]['file'].$bt[2]['line'];
            }

            $lines = file($bt[2]['file']);

            preg_match_all('/([a-zA-Z0-9\_]+)::'.$bt[2]['function'].'/',
                $lines[$bt[2]['line']-1],
                $matches);

            return $matches[1][self::$i];
        }
    }

    function get_called_class() {
        return class_tools::get_called_class();
    }
}
16
Jrgns

Jetzt (wenn 5.3 eingetroffen ist) ist es ziemlich einfach:

http://php.net/manual/en/function.get-called-class.php

12
src091
class MainSingleton { 
  private static $instances = array(); 
  private static function get_called_class() {
    $t = debug_backtrace();
    return $t[count($t)-1]["class"];
  }  

  public static function getInstance() { 
    $class = self::get_called_class();
    if(!isset(self::$instances[$class]) ) { 
      self::$instances[$class] = new $class; 
    } 
    return self::$instances[$class]; 
  } 

}

class Singleton extends MainSingleton { 
  public static function getInstance()
  {
    return parent::getInstance();
  }     
  protected function __construct() { 
    echo "A". PHP_EOL; 
  } 

  protected function __clone() {} 

  public function test() { 
    echo " * test called * "; 
  } 
} 

Singleton::getInstance()->test(); 
Singleton::getInstance()->test();
2
Lulu

In den verfügbaren PHP) -Versionen gibt es keine Möglichkeit, das zu tun, was Sie wollen. Paul Dixons Lösung ist die einzige ist verfügbar ab PHP 5.3, welches sich in der Beta befindet.

0
Ionuț G. Stan