Intereting Posts
Как создать событие Календаря Google без напоминания / Как получить учетные записи службы для олицетворения пользователей Как я могу решить кодировку языка PHP на веб-странице? Почему мое правило перезаписи отключает дополнительные данные $ _GET? WordPress wp_enqueue_script («комментарий-ответ») для пользовательской темы Изменение размера панорамного изображения на фиксированный размер AWS: политика пользователя IAM для SES не работает Код вложения при закрытии PHP php MySqli: Как я могу переписать fetch для fetch_assoc? КАК КОНКАТ Необработанный символ в начале ответа Преобразование .doc в html в php Как заменить каждый другой экземпляр определенного символа в строке MySQL? Как использовать разбиение на страницы вместе с методом laravel eloquent find in laravel 5.4 php string в формате даты, добавьте 12 часов PHP: ReflectionParameter, isOptional vs isDefaultValueAvailable Вывод элементов массива случайным образом с помощью PHP

В PHP, почему я могу получить доступ к нестационарному методу статическим способом?

Возможный дубликат:
PHP: статические и нестатические функции и объекты

В следующем коде nonStatic () не является статическим методом. Даже тогда я могу получить к нему доступ, не создавая объект (статическим образом). Может ли кто-нибудь помочь мне в понимании, поскольку это невозможно на других языках, таких как Java?

<?php class MyClass { function nonStatic() { echo "This can be printed"; } } MyClass::nonStatic(); // This can be printed 

Solutions Collecting From Web of "В PHP, почему я могу получить доступ к нестационарному методу статическим способом?"

Это разрешено, но оно генерирует предупреждение 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, означающее, что эта магическая способность может исчезнуть в будущих версиях. Так что не делай этого 🙂