In PHP, how can a class reference its own name?
For example, what would the method look like to do this?
Dog::sayOwnClassName();
//echos "Dog";
I see that everyone is saying get_class($this)
. But that's not correct. That would work if I were creating an instance of Dog. I'm asking about calling a method of the Dog class itself. If Dog
extends Mammal
, then a call to get_class($this)
inside the Dog
class will return 'Mammal.'.
In other words:
For example:
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
}
Yacoby's suggestion of get_called_class()
was correct. Here's how it works in the example I gave.
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
}
Three options, get_called_class()
, get_class()
or the magic constant __CLASS__
Of those three get_called_class()
is the one you want when dealing using a static function, although unfortuantely it does have a requirement of a PHP version of at least 5.3.0
If you need to get the class in a static function when the class may be derived it is slightly different as self
is resolved to the class name where it was placed (See Limitations of self::). To work around this issue you need to use the function from PHP 5.3.0 get_called_class()
.
If you cannot use PHP 5.3.0 or greater you may find you cannot make the function static and still have it achieve the results you want.
get_class()
returns the name of the actual class that the object is, irrespective of where the function call is.
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
can also be used without a parameter, which would at first glance seem to indicate it would with static functions (as there is no need to pass $this
), however when used without a parameter it works in the same way as __CLASS__
class Animal{
public static function sayOwnClassName(){
echo get_class();
}
}
class Dog extends Animal{
}
Dog::sayOwnClassName(); //echos Animal
Animal::sayOwnClassName(); //echos Animal
__CLASS__
always expands to the name of the class where __CLASS__
was resolved, even when inheritance is taken into account.
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
echo get_class($this);
Well, there's get_class($Object)
Then there's __CLASS__ when used within a class
Or you could make a method that would return __CLASS__
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With