Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

parent::method() - calling non static method

Tags:

oop

php

parent

I don't understand the concept of calling a parent method in PHP. The parent method is not static, yet it is called statically - normally PHP would throw an error/warning.

Question is, is this a quirk from PHP, or is this how it should be in OOP?

Taking the example from php.net:

<?php
class A {
    function example() {
        echo "I am A::example() and provide basic functionality.<br />\n";
    }
}

class B extends A {
    function example() {
        echo "I am B::example() and provide additional functionality.<br />\n";
        parent::example();
    }
}

$b = new B;

// This will call B::example(), which will in turn call A::example().
$b->example();
?>

http://php.net/manual/en/keyword.parent.php

In PHP 5, calling non-static methods statically generates an E_STRICT level warning.

http://php.net/manual/en/language.oop5.static.php

like image 733
user5542121 Avatar asked Oct 07 '16 08:10

user5542121


Video Answer


2 Answers

If you will look at the definition of static method you will see:

  1. Static methods are meant to be relevant to all the instances of a class rather than to any specific instance. - indeed this method is relevant to all children of the parent class.
  2. A static method can be invoked even if no instances of the class exist yet. - again, you never create an instance of the parent class to invoke the method.

So we can take this argument as an excuse for PHP. By the way, in C++ it is done the same way.

But there are other languages, where it is done like you said. For example, in JAVA, the parent method called like super.printMethod();, in C#, it is done like base.printMethod().

So in PHP it might be done for the parser simplicity, as they will need a specific edge case for such invocation parent->printMethod().

like image 166
sevavietl Avatar answered Oct 21 '22 09:10

sevavietl


That notification means that you can't call a non-statically defined method as static, but the call you did inside the method is not a static call, but a call to the parent class.

So this call will throw the E_STRICT warning:

$b = new B;
$b::example();

but your example will not

like image 2
Mihai Matei Avatar answered Oct 21 '22 09:10

Mihai Matei