Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从扩展PHP类中的静态调用中获取类名?_Php_Oop_Inheritance - Fatal编程技术网

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

如何从扩展PHP类中的静态调用中获取类名?,php,oop,inheritance,Php,Oop,Inheritance,我有两个类:Action和MyAction。后者被宣布为: class MyAction extends Action {/* some methods here */} 我所需要的只是Action类中的方法(仅在其中,因为将有许多继承类,我不想在所有继承类中实现此方法),它将从静态调用返回classname。以下是我要说的: Class Action { function n(){/* something */} } 当我称之为: MyAction::n(); // it should

我有两个类:
Action
MyAction
。后者被宣布为:

class MyAction extends Action {/* some methods here */}
我所需要的只是
Action
类中的方法(仅在其中,因为将有许多继承类,我不想在所有继承类中实现此方法),它将从静态调用返回classname。以下是我要说的:

Class Action {
 function n(){/* something */}
}
当我称之为:

MyAction::n(); // it should return "MyAction"
但是父类中的每个声明只能访问父类
\uuuuu class\uuuu
变量,该变量的值为“Action”


有什么方法可以做到这一点吗?

\uuuuu CLASS\uuuuuu
总是返回使用它的类的名称,因此静态方法没有多大帮助。如果方法不是静态的,您可以简单地使用($this)。e、 g

后期静态绑定,在PHP5.3中提供+ 现在PHP5.3已经发布,您可以使用它,它允许您在运行时解析静态方法调用的目标类,而不是在定义静态方法调用时解析目标类

虽然该特性没有引入新的magic常量来告诉您被调用的类名,但它确实提供了一个新函数,可以告诉您调用静态方法的类名。下面是一个例子:

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


class MyAction extends Action {

}


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

在可用的PHP版本中,没有办法做您想要做的事情。保罗·迪克森的解决方案是唯一的。我的意思是,代码示例,正如他所说的后期静态绑定功能,从PHP 5.3开始就可以使用,它是beta版的。

现在(当5.3出现时),它非常简单:


这不是理想的解决方案,但它可以在PHP<5.3.0上运行

代码是从中复制的

因为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
(PHP5>=5.3.0,PHP7)
get_called_class-“后期静态绑定”类名

<?php

class Model
{
  public static function find()
  {
    return get_called_class();
  }
}

class User extends Model
{
}


echo User::find();

OP唯一的问题是该功能还不可用。PHP5.3还处于测试阶段。@Paul,谢谢!你刚刚救了我一天。。。或者晚上和
get_called_class()
:)我希望有人能帮我一个忙。PHP脚本在执行
new static()时无声地消失来自私有静态方法内部(在windows和php>5.5上使用xampp)<代码>:s
$foo=新的MyAction;echo get_类($foo);这也会打印MyAction。现在(当5.5(很久以前)出现时),它更简单:
get_class
::class
可能会返回不同的结果(区分大小写)。详细信息在这里-使用
static::class
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();
// 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

class Model
{
  public static function find()
  {
    return get_called_class();
  }
}

class User extends Model
{
}


echo User::find();