확장 PHP 클래스의 정적 호출에서 클래스 이름을 얻으려면 어떻게 해야 합니까?
2개의 클래스가 있습니다.Action
그리고.MyAction
후자는 다음과 같이 선언된다.
class MyAction extends Action {/* some methods here */}
필요한 것은, 의 방법 뿐입니다.Action
class(대부분의 상속된 클래스가 있기 때문에 모든 클래스에서 이 메서드를 구현하고 싶지 않기 때문에 이 클래스만)는 정적 콜에서 클래스 이름을 반환합니다.제가 말하는 것은 다음과 같습니다.
Class Action {
function n(){/* something */}
}
그리고 내가 부르면:
MyAction::n(); // it should return "MyAction"
그러나 부모 클래스의 각 선언은 부모 클래스에만 액세스할 수 있습니다.__CLASS__
variable - 값 "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 이후 클래스 이름 해결에 키워드를 사용할 수 있기 때문에 함수 호출보다 훨씬 빠릅니다.인터페이스에서도 동작합니다.
// 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();
}
}
(5.3이 도입되면) 매우 간단합니다.
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();
(PHP 5 >= 5.3.0, PHP 7)
get_called_class : "Late Static Binding" 클래스 이름
<?php
class Model
{
public static function find()
{
return get_called_class();
}
}
class User extends Model
{
}
echo User::find();
사용 가능한 PHP 버전에서는 원하는 것을 할 수 있는 방법이 없습니다.폴 딕슨의 해결책이 유일한 방법이야코드 예시는 그가 말한 최신 스태틱바인딩 기능으로 베타판인 PHP 5.3부터 사용할 수 있습니다.
언급URL : https://stackoverflow.com/questions/506705/how-can-i-get-the-classname-from-a-static-call-in-an-extended-php-class
'programing' 카테고리의 다른 글
인덱스를 사용하지만 테이블 스캔처럼 보이는 MariaDB SELECT (0) | 2022.11.26 |
---|---|
spring-data-jpa를 사용하여 엔티티를 갱신하려면 어떻게 해야 합니까? (0) | 2022.11.26 |
extern 키워드가 C 함수에 미치는 영향 (0) | 2022.11.25 |
캐시 디렉토리를 생성할 수 없습니다.또는 디렉토리에 쓸 수 없습니다.Laravel에서 캐시 없이 진행 중 (0) | 2022.11.25 |
어레이의 줄임말: {} 또는 []와 같은 리터럴 구문이 있습니까? (0) | 2022.11.25 |