2015-03-10 4 views
-1
class Person { 
    function foo() { 
     // Code. 
    } 

    function bar() { 
     $this->foo(); 
    } 
} 

class Pete extends Person { 

} 

Когда Person::foo() вызывается из Person::bar() в приведенном выше примере, вызов происходит в Person классе. Следовательно, I может сделать видимость Person::foo()private.PHP: Interhited метод вызова метода родительского класса

Как вы будете знать, когда я продлить Person класс, Person::foo() и Person::bar() наследуются дочерним классом Pete. Следовательно, унаследованный метод Pete::bar() вызывает Pete::foo().

Мой вопрос

Pete::bar() Изнутри, это призыв к Pete::foo() считается происхожу из) родительского класса или б) класс ребенка?

+1

Это тест? –

+0

Нет! Я человек :) – henrywright

ответ

1

Внутри Pete :: bar(), является ли вызов Pete :: foo(), который считается исходящим из a) родительского класса или b) дочернего класса?

Ни то, ни другое. Технически, foo() не существует в классе Pete. Он существует в Person и унаследован Pete. Несмотря на это, , который звонит, метод основан на вызове.

Например:

$person = new Person(); 
$person->foo(); // invocation by `Person` object 
$pete = new Pete(); 
$pete->foo(); // invocation by `Pete` object 

Я пытаюсь определить метод Видимость

Если вы хотите, чтобы эти методы наследуются, вы ограничены public или protected. private методы не наследуются. Я бы посоветовал вам прочитать больше о visibility.

Как указано в deceze's answer, вы можете сделать методы private и получить к нему доступ через другой метод public.

+0

Спасибо за объяснение. Поэтому, опираясь на пример вашего вызова, представьте, использовал ли я следующее: '$ pete = new Pete(); $ pete-> bar() 'для вызова метода' bar() '. Что произойдет, если a) 'foo()' был 'private' и b)' foo() 'был' protected'? Имейте в виду 'bar()' calls 'foo()' – henrywright

+0

Как отмечено в ответе deceze, он все равно будет работать для любой видимости, так как 'bar()' вызывает 'foo()' из одного класса. –

+0

Итак, хотя метод 'bar()' наследуется 'Pete' и вызывается объектом' $ pete', 'bar()' считается принадлежащим Person (следовательно, вызов 'foo()' происходит изнутри «Человека»)? – henrywright

2

Если метод имеет видимость private, тогда весь код, который его явно вызывает, должен находиться в том же определении класса. Это почти правило, не более, не меньше. Косвенные вызовы через наследование работают просто отлично.

class Foo { 
    private function bar() { } 
    public function baz() { /* here be dragons */ } 
} 

class Child extends Foo { } 

Child В классе вы не писать $this->bar(). Это провалится. Метод bar - это private классу Foo, ни один другой код не может его называть. Вы может позвонить по номеру baz, хотя в любое время и в любом месте, это public и может вызываться из другого кода. Независимо от того, что делает baz, это не ваше дело. Если baz звонит bar внутренне, это нормально. Его код находится в Foo и поэтому может позвонить по номеру bar.

+0

Спасибо за объяснение, +1 от меня – henrywright

1

Если вы сделаете это частным, Person::foo можно назвать только от лица

class Person { 
    //Can only be called inside of Person 
    private function foo() { 
     // Code. 
    } 

    public function bar() { 
     //can be called 
     $this->foo(); 
    } 
} 

Вы все еще можете назвать bar, так как он является публичным. bar все еще может получить доступ к foo, потому что это метод от Person.

Вы не можете позвонить по номеру foo из Pete, так как это видно только на Персона.

class Pete extends Person { 
    public function doSomething() { 
     //Works because bar itself calls foo 
     $this->bar(); 
    } 
} 

Если вы хотите вызвать foo непосредственно ФОМ Pete или переопределить его, вы должны объявить его protected вместо private.

+2

Вы сбиваете с толку 'foo' и' bar' каким-либо образом в этом последнем примере? – deceze

+0

'private' или' protected'? –

+0

@deceze да, спасибо за этот намек. Foo, bar, baz всегда путают :) –

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