확장 된 PHP 클래스의 정적 호출에서 클래스 이름을 어떻게 얻을 수 있습니까?
두 가지 클래스가 있습니다 : Action
및 MyAction
. 후자는 다음과 같이 선언됩니다.
class MyAction extends Action {/* some methods here */}
내가 필요한 것은 Action
클래스의 메서드 (상속 된 클래스가 많고이 메서드를 모두 구현하고 싶지 않기 때문에 그 안에 만 있음)이며 정적 호출에서 클래스 이름을 반환합니다. 내가 말하는 내용은 다음과 같습니다.
Class Action {
function n(){/* something */}
}
그리고 내가 그것을 부를 때 :
MyAction::n(); // it should return "MyAction"
그러나 부모 클래스의 각 선언은 __CLASS__
"Action"값을 가진 부모 클래스 변수 에만 액세스 할 수 있습니다.
이 작업을 수행 할 수있는 방법이 있습니까?
__CLASS__
항상 사용 된 클래스의 이름을 반환하므로 정적 메서드에는별로 도움이되지 않습니다. 메서드가 정적이 아니라면 간단히 get_class ($ this) 를 사용할 수 있습니다 . 예 :
class Action {
public function n(){
echo get_class($this);
}
}
class MyAction extends Action {
}
$foo=new MyAction;
$foo->n(); //displays 'MyAction'
PHP 5.3 이상에서 사용 가능한 후기 정적 바인딩
이제 PHP 5.3이 출시 되었으므로 런타임에 정적 메서드 호출을 정의 할 때가 아닌 런타임에 대상 클래스를 확인할 수있는 후기 정적 바인딩을 사용할 수 있습니다 .
이 기능은 호출 된 클래스 이름을 알려주는 새로운 매직 상수를 도입하지는 않지만 , 정적 메서드가 호출 된 클래스 이름을 알려줄 수 있는 새로운 함수 get_called_class () 를 제공합니다 . 다음은 예입니다.
Class Action {
public static function n() {
return get_called_class();
}
}
class MyAction extends Action {
}
echo MyAction::n(); //displays MyAction
5.5부터는 클래스 이름 확인을 위해 class
키워드를 사용할 수 있는데, 이는 함수 호출을 만드는 것보다 훨씬 빠릅니다. 인터페이스에서도 작동합니다.
// 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
이상적인 솔루션은 아니지만 PHP 5.3.0 미만에서 작동합니다.
코드는 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();
}
}
Now (when 5.3 has arrived) it's pretty simple:
http://php.net/manual/en/function.get-called-class.php
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();
There is no way, in the available PHP versions, to do what you want. Paul Dixon's solution is the only one. I mean, the code example, as the late static bindings feature he's talking about is available as of PHP 5.3, which is in beta.
'your programing' 카테고리의 다른 글
xml을 PHP 파일에로드하는 동안 'xmlParseEntityRef : 이름 없음'경고 (0) | 2020.10.06 |
---|---|
Sublime Text 2에서 Java 코드 컴파일 및 실행 (0) | 2020.10.06 |
node.js mongodb _id node-mongodb-native로 문서 선택 (0) | 2020.10.06 |
이미지를 찾을 수없는 경우 HTML (0) | 2020.10.06 |
Xcode는 시스템 키 체인을 사용하기 위해 암호를 계속 묻습니다. (0) | 2020.10.06 |