2013-03-28 3 views
3

При кодировании и использовании поздней статической привязки в PHP я обнаружил странное поведение. Детский объект, созданный с помощью static() в своем родительском классе, может обращаться к закрытым методам своего родителя.PHP статическое связывание не работает правильно

Вот пример:

class Attachment 
{ 
    public static function createFromFile($file) 
    { 
    $attachment = new static(); 
    echo get_class($attachment) . PHP_EOL; 
    $attachment->loadFromFile($file); 
    } 

    private function loadFromFile($file) 
    { 
    echo 'attachment'; 
    } 
} 

class PictureAttachment extends Attachment 
{ 
    //... 
} 

PictureAttachment::createFromFile('example.txt'); 

Выход:

PictureAttachment 
attachment 

Является ли это правильное поведение?

ответ

5

Да, это правильно. Класс, вызывающий закрытый метод, является тем же самым, что и объявляет его. Не имеет значения, что он может или не может создать экземпляр дочернего класса. У вас просто не может быть кода в дочернем классе, вызывающего частный метод родителя.

Другими словами:

class Foo { 

    protected function bar() { 
     $this->baz(); 
    } 

    private function baz() { } 

} 

class Bar extends Foo { 

    protected function bar() { 
     parent::bar(); // <-- works 
     parent::baz(); // <-- doesn't work 
    } 

} 
+1

Для дальнейшего уточнения: видимость работы на уровне класса не на уровне объектов. –

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