95 votes

Comment puis-je obtenir le nom de la classe à partir d'un appel statique dans une classe PHP?

J'ai deux classes: Action et MyAction. Cette dernière est déclarée comme suit:

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

J'ai besoin de méthode dans l' Action classe (que de cela, car il y aura beaucoup de héritées des classes, et je ne veux pas mettre en œuvre cette méthode dans tous les d'entre eux), qui renvoie un nom de classe à partir d'un appel statique. Voici de quoi je parle:

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

Et quand je l'appelle:

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

Mais chaque déclaration dans la classe parent a accès uniquement à la classe parente __CLASS__ variable, qui a la valeur "Action".

Est-il possible de faire cela?

179voto

Paul Dixon Points 122033

__CLASS__ renvoie toujours le nom de la classe dans laquelle il a été utilisé, il n'est pas beaucoup d'aide avec une méthode statique. Si la méthode n'était pas statique, il vous suffit d'utiliser get_class($this). par exemple

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

}

class MyAction extends Action {

}

$foo=new MyAction;

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

Résolution statique à la volée, disponible dans PHP 5.3+

Maintenant que PHP 5.3 est disponible, vous pouvez utiliser la résolution statique à la volée, ce qui permet de résoudre la classe cible pour une méthode statique d'appel au moment de l'exécution plutôt que quand elle est définie.

Alors que la fonctionnalité ne pas introduire une nouvelle magie constant pour vous dire la classe que vous ont été appelés par le biais d', elle donne une nouvelle fonction, get_called_class() qui peut vous dire le nom de la classe une méthode statique a été appelée. Voici un exemple:

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


class MyAction extends Action {

}


echo MyAction::n(); //displays MyAction

16voto

Jrgns Points 6279

Ce n'est pas la solution idéale, mais il fonctionne sur PHP < 5.3.0.

Le code a été copié à partir de septuro.com

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

13voto

Anton Points 229

Aujourd'hui (quand 5.3 est arrivé) c'est assez simple:

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

2voto

Lulu Points 11
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();

0voto

Ionuț G. Stan Points 62482

Il n'existe aucun moyen, dans les versions de PHP, pour faire ce que vous voulez. Paul Dixon solution est la seule. Je veux dire, l'exemple de code, comme les late static bindings fonction dont il parle est disponible depuis PHP 5.3, qui est en version bêta.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X