Private method overriding and visibility

前端 未结 1 1699
北海茫月
北海茫月 2020-12-10 08:42

I\'m having a hard time trying to understand the output of the following code:

class Bar 
{
    public function test() {
        $this->testPublic();
             


        
相关标签:
1条回答
  • 2020-12-10 09:43

    The problem with your code is that the method Bar::testPrivate is private, therefore it cannot be overridden by child classes. For starters, I recommend that you read up on visibility in PHP - http://www.php.net/manual/en/language.oop5.visibility.php. There you will learn that only public and protected class member methods/properties can be overridden, private ones cannot.

    As a good example, try changing the visibility of the Bar::testPrivate method to either public or protected, without altering anything else in your example code. Now try and run your tests. What happens? This:

    PHP Fatal error: Access level to Foo::testPrivate() must be protected (as in class Bar) or weaker

    The big question is: "why?". Well, you have now overridden Bar::testPrivate with a private Foo:testPrivate. This new private method is out of scope for Bar::test, because private class members are visible to their current class only, NOT the parent/child classes!

    Therefore, as you can see, OOP provides a certain amount of encapsulation for class members, and it can be quite confusing if you don't take the time to understand it.

    0 讨论(0)
提交回复
热议问题