tags:

views:

190

answers:

5

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     
    }
+1  A: 
echo get_class($this);
Coronatus
+1 for giving this answer first
Gordon
I'm not instantiating Dog - I'm using a class-level method.
Nathan Long
+13  A: 

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 unfortuantly 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

Yacoby
+1 for mentioning the magic constant in addition to get_class and the better examples
Gordon
Yacoby - you're instantiating Dog. I'm not.
Nathan Long
@Nathan I missed that complexity, my apologies. I have added some more information at the bottom of my answer.
Yacoby
@Nathan Long: Then use `get_called_class()`: http://php.net/get_called_class
Andrew Moore
@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 Long
@Nathan Done (Well not quite, but is shows the get_called_class part far more clearly)
Yacoby
A: 
public function sayClassName()
{
    echo get_class($this);
}

get_class() php docs

Benedict Cohen
+1  A: 

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__

Syntax Error
A: 

use the magic constant __CLASS__

knittl