class t {
public function tt()
{
echo 1;
}
}
t::tt();
Видеть? Нестатическая функция может также быть вызвана на уровне класса. Таким образом, что отличается, если я добавляю a static
ключевое слово прежде public
?
За исключением того, что если вы попытаетесь использовать $ this
в своем методе, например:
class t {
protected $a = 10;
public function tt() {
echo $this->a;
echo 1;
}
}
t::tt();
Вы получите фатальную ошибку при статическом вызове нестатического метода:
Fatal error: Using $this when not in object context in ...\temp.php on line 11
т.е. ваш пример немного слишком прост и на самом деле не соответствует реальному случаю; -)
Также обратите внимание, что ваш пример должен дать вам строгое предупреждение ( цитата ):
Статический вызов нестатических методов генерирует предупреждение уровня
E_STRICT
.
И это действительно так (По крайней мере, с PHP 5.3) :
Strict Standards: Non-static method t::tt() should not be called statically in ...\temp.php on line 12
1
Итак: не очень хорошо; -)
Тем не менее, статический вызов нестатического метода не похож на любой вид хорошей практики (вероятно, поэтому он вызывает строгое предупреждение) , поскольку статические методы не имеют того же значения, что и нестатические: статические методы не ссылаются на какой-либо объект, в то время как не- статические методы работают с экземпляром вызываемого класса.
Еще раз: даже если PHP позволяет вам что-то делать (возможно, по историческим причинам - например, совместимость со старыми версиями) , это не значит, что вы должны это делать!
Поскольку статические методы вызываются без экземпляр созданного объекта, псевдопеременная $ this недоступна внутри метода, объявленного как статический.
К статическим свойствам нельзя получить доступ через объект с помощью оператора стрелки ->.
Вызов нестатических методов статически генерирует предупреждение уровня E_STRICT.
Тот факт, что вы можете вызывать нестатические методы статически, не означает, что вы должны это делать. Это дурной тон.
Как правило, статический метод также называется методом класса , тогда как нестатический метод также называется методом объекта или методом экземпляра .
Разница между методом класса и методом объекта заключается в том, что методы класса могут обращаться только к свойствам класса (статическим свойствам), в то время как методы объекта используются для доступа к свойствам объекта (свойствам одного и того же экземпляра класса).
Статические методы и свойства используются для обмена общими данными для всех экземпляров этого конкретного класса.
Вы можете, например, использовать статическое свойство для отслеживания количества экземпляров:
class A {
private static $counter = 0;
public function __construct() {
self::counter = self::counter + 1;
}
public function __destruct() {
self::counter = self::counter - 1;
}
public static function printCounter() {
echo "There are currently ".self::counter." instances of ".__CLASS__;
}
}
$a1 = new A();
$a2 = new A();
A::printCounter();
unset($a2);
A::printCounter();
Обратите внимание, что статическое свойство counter является частным, поэтому к нему может получить доступ только сам класс и экземпляры этого класса, но не извне.