【问题标题】:get class name without having an instance of the class in php在php中没有类的实例的情况下获取类名
【发布时间】:2011-12-16 08:30:25
【问题描述】:

我正在寻找以下 php 函数:

class foo
{
}

echo get_class_special(foo);  // returns the string 'foo'

php 有一个函数可以在不创建类的实例的情况下获取类的名称吗?

【问题讨论】:

  • 你从哪里得到类名?我的意思是,你传递 foo 并期待 foo 回来,如果类名是 bar 你会输入 bar 并得到 bar 回来......
  • 如果您没有对象的实例,则无法将对象传递给任何东西。这意味着您必须知道类名才能实例化它,这反过来又使您的函数变得多余...
  • 难道你不需要知道类的名字来运行这个函数吗?对不起,也许我遗漏了一些东西,但我看不出这种东西有什么实际用途。
  • @Repos: foo 和 'foo' 的区别在于解释器知道我对 foo 的意思,它不知道我对 'foo' 的意思。如果我在 foo 中有错字,它会通知我,它不会用于 'foo'。因此,如果可能的话,我更喜欢写 foo 而不是 'foo'。现在我正在使用'get_class(new foo())'。但我希望有没有新的方法。

标签: php reflection


【解决方案1】:
<?php

class Foo {
    const NAME = __CLASS__;
    // or
    public static $NAME = __CLASS__;
    // or
    public static function getName() {
        return __CLASS__;
    }
}

Foo::NAME; // Foo
// or
Foo::$NAME; // Foo
// or
Foo::getName(); // Foo

?>

【讨论】:

  • 如果类 Bar 扩展了 Foo,这将不起作用。 Bar::NAME 将返回“Foo”。为此,PHP 5.5 具有 ::class 常量。示例:Bar::class
【解决方案2】:

我感觉 PHP 中的动态类型存在一些混淆:在 PHP 中没有 class 类型的对象这样的东西,类是由它们的名称来表示的。因此,如果您在应用程序中编写 foo,您将收到一个警告,并且 foo 将被解释为字符串 'foo' - 即使有一个使用该名称的类。

因此,如果您需要在变量中存在的类上调用静态函数,您可以这样做:

$class = 'Foo';
$class::staticFuntion(); // will call Foo::staticFunction()

这更进一步,你可以reference variables with variables

$className = 'Foo';
$ref = 'className';
$$ref::staticFunction(); // will call Foo::staticFunction()

【讨论】:

    【解决方案3】:

    As of PHP 5.5 你可以使用foo::class。见this answer

    【讨论】:

      【解决方案4】:

      为什么不创建像这样的静态函数

      class foo {
      
          public static function myClass() {
               return get_class($this);
          }
      }
      

      在你的代码中你可以使用

      foo::myClass();  //return string 'foo'
      

      但是在这里你需要知道类的名称才能调用它,所以它有点多余。例如,如果您想获取类的属性而不实例化它,这将是有意义的,因为它们在开发代码时会发生变化。

      【讨论】:

      • 这是 Merlyn Morgan-Graham 上面给出的链接中描述的方式。不同的是'return get_called_class();'而不是'return get_class($this);'。我认为在静态函数中使用 '$this' 是不可能的。
      【解决方案5】:

      我想没有它的对象就不可能得到类名。但是如果你的实例只声明了一个类,那么你可以使用它。

      get_declared_classes();
      

      【讨论】:

        猜你喜欢
        • 2015-07-19
        • 1970-01-01
        • 2013-03-26
        • 2013-09-20
        • 2012-07-24
        • 1970-01-01
        • 2021-01-07
        • 2011-02-11
        • 2022-12-03
        相关资源
        最近更新 更多