Возможный дубликат:
PHP: статические и нестатические функции и объекты
В следующем коде nonStatic () не является статическим методом. Даже тогда я могу получить к нему доступ, не создавая объект (статическим образом). Может ли кто-нибудь помочь мне в понимании, поскольку это невозможно на других языках, таких как Java?
<?php class MyClass { function nonStatic() { echo "This can be printed"; } } MyClass::nonStatic(); // This can be printed
Это разрешено, но оно генерирует предупреждение E_STRICT
:
Error #: 2048, Error: Non-static method MyClass::nonStatic() should not be called statically, assuming $this from incompatible context
В более ранних версиях OO PHP это было тихо разрешено, но с тех пор были приняты более эффективные методы.
Противоположность работает без заминки:
class Test { function foo() { echo $this->bar(); } static function bar() { return "Hello world\n"; } } $x = new Test; $x->foo();
Это печатает Hello world
.
Кажется, что разработчики PHP не увидели никакого значения, запрещающего статический доступ нестатических методов. Это всего лишь одна из тех особенностей PHP, которая на самом деле не служит цели. Это, конечно, плохая практика программирования, чтобы вызвать статический статический метод, но в PHP это возможно. Возможно, в будущей версии PHP они откажутся от этого, но пока это просто часть языка.
Редактировать:
К счастью, противоположное недопустимо – вы не можете вызвать статический метод из контекста объекта. Как отметил Джек ниже, вы можете вызвать статический метод из контекста объекта – вряд ли это лучшая практика в парадигме ООП, но это разрешено.
Не уверен, возможно, какая-то магия PHP (иногда это бывает так), но вы не должны этого делать.
Подробнее здесь http://php.net/manual/en/language.oop5.static.php
Они также показывают аналогичный пример, но обратите внимание:
Вызов нестатических методов статически генерирует предупреждение уровня E_STRICT, означающее, что эта магическая способность может исчезнуть в будущих версиях. Так что не делай этого 🙂