"self" is a keyword that references the current class. It is only available inside the class' code.
You can use it to call methods on your own class, but due to binding you can also use it to call methods on a superclass.
Consider the following example:
class TestA {
public static function makeNewInstance() {
return new TestA();
}
}
class TestB extends TestA {
}
Now, calling TestB::makeNewInstance(); will return an instance of TestA. (TestB inherits the method, but it's linked directly to TestA so will still return that)
Compare with this one:
class TestA {
public static function makeNewInstance() {
return new self();
}
}
class TestB extends TestA {
}
Now, calling TestB::makeNewInstance() will return an instance of TestB. (Since self references the active class, and you're calling it on TestB, the contents of "self" is now TestB instead of TestA.
Hope that explains for you. Otherwise, maybe some more detail in your question would help attract more specific answers.