PHP:一个类如何引用自己的名字?

时间:2010-04-07 16:21:48

标签: php

在PHP中,类如何引用自己的名称?

例如,该方法会是什么样的呢?

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

更新

我看到每个人都在说get_class($this)。但这不正确。如果我正在创建一个狗的实例,那将会有效。我问的是调用Dog类本身的方法。如果Dog延长Mammal,则get_class($this)课程内对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     
    }

5 个答案:

答案 0 :(得分:24)

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

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


get_called_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 :(得分:2)

echo get_class($this);

答案 2 :(得分:1)

嗯,有get_class($ Object)

然后在类

中使用__CLASS__

或者您可以创建一个返回__CLASS __

的方法

答案 3 :(得分:1)

使用魔法常量__CLASS__

答案 4 :(得分:0)

public function sayClassName()
{
    echo get_class($this);
}

get_class() php docs