tags:

views:

300

answers:

5

Where's the difference between self and $this-> in a PHP class or PHP method?

Example:

I've seen this code recently.

public static function getInstance() {

    if (!self::$instance) {
        self::$instance = new PDO("mysql:host='localhost';dbname='animals'", 'username', 'password');;
        self::$instance-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    return self::$instance;
}

But I remember that $this-> refers to the current instance (object) of a class (might also be wrong). However, what's the difference?

+1  A: 

self is used at the class-level scope whereas $this is used at the instance-level scope.

jldupont
A: 

self refers to the calling object's class. $this refers to the object itself.

Matchu
+1  A: 

$this refers to the current object, self refers to the current class. The class is the blueprint of the object. So you define a class, but you construct objects.

So in other words, use self for static and this for none-static members or methods.

Yacoby
+3  A: 

$this refers to the instance of the class, that is correct. However, there is also something called static state, which is the same for all instances of that class. self:: is the accessor for those attributes and functions.

Tor Valamo
A: 

$this is used to reference methods and properties of the current instance of a class.

self us used to reference static methods and properties, shared by all instances (and even accessible outside of any instance) of a class.


You can take a look at Static Keyword (quoting a few lines) :

Declaring class properties or methods as static makes them accessible without needing an instantiation of the class. A property declared as static can not be accessed with an instantiated class object (though a static method can)

...

Static properties cannot be accessed through the object using the arrow operator ->.


And, from the page Properties (quoting) :

Within class methods the properties, constants, and methods may be accessed by using the form $this->property (where property is the name of the property) unless the access is to a static property within the context of a static class method, in which case it is accessed using the form self::$property.

Pascal MARTIN