2016-01-21 2 views
0

Итак, у меня есть эта проблема, когда я могу вызвать метод объекта статически и наоборот. Это должно произойти или что я делаю неправильно на случай?PHP статические и объектные вызовы

PHP Версия: 5.6.12 XAMPP Версия: 3.2.1

function endl() 
{ 
    echo "<br>"; 
} 

class Base 
{ 
    public function objectFunc($msg) 
    { 
     echo "You called a non-static function from " . $msg; 
     endl(); 
    } 

    public static function staticFunc($msg) 
    { 
     echo "You called a static function from " . $msg; 
     endl(); 
     } 
    } 

Base::objectFunc("a static call"); 
Base::staticFunc("a static call"); 
$base = new Base; 
$base->objectFunc("a non-static call"); 
$base->staticFunc("a non-static call"); 


Here are the results from running this: 

You called a non-static function from a static call 
You called a static function from a static call 
You called a non-static function from a non-static call 
You called a static function from a non-static call 
+0

Из [docs] (http://php.net/manual/en/language.oop5.static.php): 'Вызов нестатических методов статически генерирует предупреждение уровня E_STRICT.' Я бы поднял вашу отчетность об ошибках и посмотрите, не заметили ли какие-либо предупреждения. Кроме того, вы _will_ запускаете ошибку, если пытаетесь ссылаться на '$ this' при вызове статически. –

ответ

1

Это может помочь вам:

«Декларирование свойства или методы класса как статические делает их доступными без необходимости инстанциацией класса. Объект, объявленный как статический, не может быть доступен с помощью объекта класса экземпляра (, хотя статический метод может) "по php.net

« Поскольку статический метр ods вызываются без экземпляра созданного объекта, псевдопеременная $ this недоступна внутри метода, объявленного как static.

Внимание! На PHP 5 вызов нестатических методов статически генерирует предупреждение уровня E_STRICT.

Предупреждение. В PHP 7 вызов статических методов статически устарел и будет генерировать предупреждение E_DEPRECATED. Поддержка вызова нестатических методов статически может быть удалена в будущем. "По php.net

Ваш код будет работать, но с предупреждениями, это зависит от версии PHP

подробнее см:. http://php.net/manual/en/language.oop5.static.php

0

Если вы поставите:

error_reporting(E_ALL); 
ini_set('display_errors', '1'); 

в PHP 7.0 вы получите сообщение: Устаревший: нестатический метод Base :: objectFunc() не следует называть статическим в ...

Но n что это не ошибка, а предупреждение «устарело». Также отсутствуют ошибки или предупреждения:

$base->staticFunc("a non-static call"); 

Это старая известная проблема на PHP. (Он должен делать то, как PHP был в PHP 4, и переход на PHP 5 решил иметь обратную совместимость)

Возможно, потому, что это поведение много лет вокруг, оно не было изменено даже в PHP 7, хотя это иррационально и допускают очень плохие привычки программирования. Вы правы, что в этом есть что-то ужасное. То, что позволяет PHP, не означает, что любой, кто не любит поддерживать плохие привычки программирования, должен программировать именно так.

Смежные вопросы