programing

확장 PHP 클래스의 정적 호출에서 클래스 이름을 얻으려면 어떻게 해야 합니까?

javaba 2022. 11. 25. 21:21
반응형

확장 PHP 클래스의 정적 호출에서 클래스 이름을 얻으려면 어떻게 해야 합니까?

2개의 클래스가 있습니다.Action그리고.MyAction후자는 다음과 같이 선언된다.

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

필요한 것은, 의 방법 뿐입니다.Actionclass(대부분의 상속된 클래스가 있기 때문에 모든 클래스에서 이 메서드를 구현하고 싶지 않기 때문에 이 클래스만)는 정적 콜에서 클래스 이름을 반환합니다.제가 말하는 것은 다음과 같습니다.

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

반응형