【问题标题】:PHP: how can a class reference its own name?PHP:一个类如何引用它自己的名字?
【发布时间】:2011-02-05 08:24:42
【问题描述】:

在 PHP 中,一个类如何引用自己的名字?

例如,执行此操作的方法是什么样的?

Dog::sayOwnClassName();
//echos "Dog";

更新

我看到每个人都在说get_class($this)。但这是不正确的。如果我正在创建 Dog 的 instance,那将起作用。我问的是调用 Dog 类本身的方法。如果Dog 扩展Mammal,则在Dog 类中调用get_class($this) 将返回“哺乳动物”。

换句话说:

  • 我不是在问“Dog 类是什么类”,答案是“Dog 类是 Mammal 类的成员。”
  • 我也不是在问“给定一个 Dog 类的实例(称为 Rover),它的类是什么?”,答案是“Dog”。
  • 我要问的是,“Dog 类本身能否告诉我‘我的名字是 Dog?’”

例如:

class Mammal {    
  public function find_by_id($id){
    $query = "SELECT * FROM " . $myclass . " WHERE `id` = " . $id;
    //(etc)
    return $matching_object;
  }
}

class Dog extends Mammal {
//find_by_id method should know to do a SELECT from Dog table     
}

更新 2

Yacoby 对get_called_class() 的建议是正确的。这是我给出的示例中它的工作原理。

class Mammal {    
      public function find_by_id($id){
        $myclass = get_called_class();
        $query = "SELECT * FROM " . $myclass . " WHERE `id` = " . $id;
        //(etc)
        return $matching_object;
      }
    }

    class Dog extends Mammal {
    //find_by_id knows to do a SELECT from Dog table
    //and will return the correct dog object     
    }

【问题讨论】:

    标签: php


    【解决方案1】:

    三个选项,get_called_class()get_class()magic constant __CLASS__

    这三个get_called_class() 是您在使用静态函数处理时想要的那个,尽管不幸的是它确实要求 PHP 版本至少为 5.3.0


    get_call_class()

    如果您需要在可能派生类时在静态函数中获取该类,则略有不同,因为self 被解析为放置它的类名(请参阅Limitations of self::)。要解决此问题,您需要使用 PHP 5.3.0 get_called_class() 中的函数。

    如果您不能使用 PHP 5.3.0 或更高版本,您可能会发现无法将函数设为静态,但仍能获得您想要的结果。


    get_class()

    get_class() 返回对象所在的实际类的名称,与函数调用的位置无关。

    class Animal{
         public function sayOwnClassName(){
             echo get_class($this);
         }
    }
    
    class Dog extends Animal{
    }
    
    
    $d = new Dog();
    $d->sayOwnClassName(); //echos Dog
    
    $a = new Animal();
    $a->sayOwnClassName(); //echos Animal
    

    get_class 也可以不带参数使用,乍一看似乎表明它可以使用静态函数(因为不需要传递$this),但是当不带参数使用时,它可以在同__CLASS__

    class Animal{
         public static function sayOwnClassName(){
             echo get_class();
         }
    }
    
    class Dog extends Animal{
    }
    
    
    Dog::sayOwnClassName(); //echos Animal
    Animal::sayOwnClassName(); //echos Animal
    

    __CLASS__

    __CLASS__ 始终扩展为解析 __CLASS__ 的类的名称,即使考虑到继承也是如此。

    class Animal{
         public function sayOwnClassName(){
             echo __CLASS__; //will always expand to Animal
         }
    }
    
    class Dog extends Animal{
    }
    
    $d = new Dog();
    $d->sayOwnClassName(); //echos Animal
    
    $a = new Animal();
    $a->sayOwnClassName(); //echos Animal
    

    【讨论】:

    • +1 表示除了 get_class 和更好的例子之外还提到了魔法常数
    • Yacoby - 你正在实例化 Dog。我不是。
    • @Nathan 我错过了这种复杂性,我很抱歉。我在答案的底部添加了更多信息。
    • @Yacoby - 太棒了!谢谢 - 这成功了。您是否介意编辑您的答案以仅显示 get_call_class() 部分,以便以后找到此内容的人可以直接找到它?
    • @Nathan Done(不完全是,但更清楚地显示了 get_call_class 部分)
    【解决方案2】:
    echo get_class($this);
    

    【讨论】:

    • 我没有实例化 Dog - 我使用的是类级别的方法。
    【解决方案3】:

    嗯,有 get_class($Object)

    然后在类中使用 __CLASS__

    或者你可以创建一个返回 __CLASS__ 的方法

    【讨论】:

      【解决方案4】:

      使用魔法常数__CLASS__

      【讨论】:

        【解决方案5】:
        public function sayClassName()
        {
            echo get_class($this);
        }
        

        get_class() php docs

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-22
          • 2020-01-14
          • 2016-02-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多