如何从扩展PHP类中的静态调用获取类名?


91

我有两节课:ActionMyAction。后者声明为:

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

我需要的只是Action类中的方法(仅在其中使用,因为会有很多继承的类,而且我不想在所有类中都实现此方法),它将从静态调用返回类名。这是我在说的:

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

当我称它为:

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

但是父类中的每个声明只能访问父类__CLASS__变量,该变量的值为“ Action”。

有什么可行的方法吗?

Answers:


175

__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_drawn_class(),它可以告诉您调用了静态方法的类的名称。以下是一个示例:

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


class MyAction extends Action {

}


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

OP的唯一问题是该功能尚不可用。PHP 5.3尚处于测试阶段。
Ionuț G. Stan,

3
@保罗,谢谢!您刚刚用get_called_class():) 拯救了我的白天或黑夜
Marecky 2013年

1
我希望有人可以帮助我解决类似的问题。当new static();从私有静态方法(在Windows上使用xampp和php> 5.5)执行时,PHP脚本无声地死掉。:s
斯特凡

$ foo = new MyAction; 回声get_class($ foo); 这还将打印MyAction。
sammry


16

这不是理想的解决方案,但可以在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();
    }
}


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

0

在可用的PHP版本中,没有任何方法可以做您想要的。Paul Dixon的解决方案是唯一的解决方案。我的意思是代码示例,因为他正在谈论的最新静态绑定功能自PHP 5.3(测试版)开始可用。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.