References in a class to static class members (fields or methods) can be made using either self::$var or static::$var (introduced in 5.3). The difference between the two is one of scope. Confusingly, in subclasses, the use of self:: references the original definition of the member, i.e. the superclass version, rather than any override at the subclass level. static::, on the other hand, references the class that was called at runtime.
<?php
class Toy {
public static function status() {
self::getStatus(); // Noncompliant; will always print "Sticks are fun!" even when called from a subclass which overrides this method;
}
protected static function getStatus() {
echo "Sticks are fun!";
}
}
class Ball extends Toy {
protected static function getStatus() { // Doesn't actually get called
echo "Balls are fun!";
}
}
$myBall = new Ball();
$myBall::status(); // Will print "Sticks are fun!"
<?php
class Toy {
public static function status() {
static::getStatus(); // Compliant
}
protected static function getStatus() {
echo "Sticks are fun!";
}
}
class Ball extends Toy {
protected static function getStatus() {
echo "Balls are fun!";
}
}
$myBall = new Ball();
$myBall::status(); // Will print "Balls are fun!"
No issue is raised when self is used in a class field declaration
class A {
const CONSTANT;
public $arr = array(
self::CONSTANT // Compliant
);
}