2016-02-19 2 views
1

Я просто проверяю статическую/нестационарную концепцию ООП и нашел что-то странное.Как вызвать нестатический метод с использованием статического ключевого слова?

Я слышал, что вывод статического метода можно получить с помощью статического ключевого слова с оператором разрешения (: :). Но в моей программе я получаю значение нестатического метода, используя статическое ключевое слово. Может ли кто-нибудь объяснить программу? Я смущаюсь.

<?php 
error_reporting(E_ALL); 

class parentclass 
{ 
    protected function sum() 
    { 
     return 145; 
    } 
} 

class childclass extends parentclass 
{ 
    protected function sum() 
    { 
     return 125; 
    } 
} 

class grandchild extends childclass 
{ 
    function sum() 
    { 
     return 100; 
    } 

    function __construct() 
    { 
     echo static::sum(); // 100 as output but how 
    } 
} 

$obj = new grandchild(); 
?> 

Кроме этого, если я делаю функции суммы() из ChildClass как статический, как

class childclass extends parentclass 
{ 
    protected static function sum() 
    { 
    return 125; 
    } 
} 

то и он дает роковую ошибку следующим образом:

Фатальная ошибка: Не удается сделать не static method parentclass :: sum() static в классе childclass

Но почему я не называю эту функцию.

+0

Запуск его здесь: https://3v4l.org/ rfQSe показано 100 ... –

+0

Да, на самом деле я сейчас редактировал имя функции. теперь sum() – Deep

+0

Если вы не совсем уверены, когда статика полезна, постарайтесь избежать их. В вашем примере нет смысла использовать static. – DanFromGermany

ответ

2

Вы можете вызвать функцию статически, даже если она не объявлена ​​как static, до тех пор, пока вы не ссылаться на $this внутри него.

Именно поэтому исходный код работает.

Вы не можете, однако, изменить подпись унаследованного метода.

Fatal error: Cannot make non static method parentclass::sum() static in class childclass

При объявлении protected static function sum() в childclass, вы меняете подпись унаследованного метода от parentclass, который специально не объявлен static.

Нижняя линия, вы пытаетесь использовать некоторые причуды PHP, которые я бы рекомендовал против. Да, они работают, но это не значит, что вы должны их использовать.

Придерживайтесь строгого стиля кодирования. Напишите отдельные методы для использования в статическом и экземпляре и назовите их по назначению.

+0

Я просто проверял концепцию oops. Это не связано с моим проектом. – Deep

1

Вы используете static как Late Static Binding. Но то, что вы слышали о был довольно

class Foo 
{ 
    static function bar() {} 
} 

$baz = Foo::bar(); 
+0

Если я использую ключевое слово self, то также получаю ответ как 100. – Deep

+0

да, просто перейдите по ссылке и прочитайте статью об этом. Тогда вы могли бы понять, как работают «self» и «static», а может быть, даже почему они разные. –

+0

Да, дорогая, я знаю разницу между я и статическими ключевыми словами, я знаю концепцию позднего статического привязки. static ключевое слово используется для поздней статической привязки, но здесь есть другое понятие. – Deep

0

Я думаю, чтобы понять поздние статические привязки немного лучше вы могли бы написать изменение кода:

<?php 
error_reporting(E_ALL); 

class parentclass 
{ 
    protected function sum() 
    { 
     return 145; 
    } 

    public function do_the_math() 
    { 
     printf('Static sum: %d, Self sum: %d', 
      static::sum(), 
      self::sum()); 
    } 
} 

class childclass extends parentclass 
{ 
    protected function sum() 
    { 
     return 125; 
    } 
} 

class grandchild extends childclass 
{ 
    function sum() 
    { 
     return 100; 
    } 
} 

$obj = new grandchild(); 
$obj->do_the_math(); 

Выход:

Static sum: 100, Self sum: 145 
Смежные вопросы