12

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";

Update

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:

  • I'm not asking "what's the class of the Dog class," to which the answer is, "the Dog class is a member of the Mammal class."
  • I'm also not asking "given an instance of Dog the dog class (called Rover), what is its class?", to which the answer is "Dog."
  • What I'm asking is, "can the Dog class itself tell me 'my name is Dog?'"

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     
}

Update 2

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     
    }
0

5 Answers 5

30

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


get_called_class()

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()

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__

__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

Sign up to request clarification or add additional context in comments.

5 Comments

+1 for mentioning the magic constant in addition to get_class and the better examples
Yacoby - you're instantiating Dog. I'm not.
@Nathan I missed that complexity, my apologies. I have added some more information at the bottom of my answer.
@Yacoby - great! Thanks - that did the trick. Would you mind editing your answer to just show the get_called_class() part so that people who find this later get straight to that?
@Nathan Done (Well not quite, but is shows the get_called_class part far more clearly)
2
echo get_class($this);

1 Comment

I'm not instantiating Dog - I'm using a class-level method.
1

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__

Comments

1

use the magic constant __CLASS__

Comments

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

get_class() php docs

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.