Во-первых, вы не могли делать такие вещи в своем посте на строго типизированном языке, таком как Java. Код Java не компилируется, если вы вызываете нестатические вещи в статическом контексте. PHP не настолько строг в отношении этих вещей (пока), но все же вы не должны делать вещи только потому, что можете, хотя это плохая практика, а в некоторых языках даже «неправильная» практика.
Конечно, есть преимущества использования статических методов. И это не совсем правильно, что вы ничего не получаете или даже теряете гибкость. Давайте рассмотрим пример:
class A {
private static $prop_a = 'property_a';
public static function b() {
echo 'called b()';
echo self::$prop_a;
$A = new A();
$A->c();
}
public function c() {
echo 'called c()';
}
}
Теперь мы можем назвать класс так:
A::b();
который выводит
- called_b
- property_a
- called_c
Но вы можете сделать то же самое с:
$a = new A();
$a->b();
$a->c();
c()
теперь выполняется дважды, но вы поняли идею. Внутри вашего класса вы можете создать экземпляр самого класса и работать с ним, как с обычным объектом. Но со стороны это просто одна строка кода, в то время как это 3 строки, используя нестатический способ. Довольно круто, а?
И как вы видите, вы можете использовать статическую функцию в нестатическом контексте, что означает, что вы можете объявить ваш метод статическим, но если вы создаете экземпляр своего класса, вы можете просто вызвать его как обычный метод. Звучит довольно гибко для меня;)
И нет, вы не можете использовать $this
в статическом контексте, но для этого self
;)