2016-08-09 3 views
1

어리석은 것처럼 들릴지 모르지만 저는 PHP에서 새로 왔습니다. 나는이 절을 보았을 때 접근 지시자에 대한 문서에서부터 배우고 있었다. ?Foo 클래스 (Bar 클래스를 확장)의 test() 함수를 호출하면 두 클래스 모두에서 혼합 된 결과가 반환되는 이유는 무엇입니까?

class Bar { 
    public function __construct() { 
     echo "Bar::constructor<br />"; 
    } 
    public function test() { 
     $this->PublicTest(); 
     $this->PrivateTest(); 
     $this->protectedTest(); 
    } 
    public function PublicTest(){ 
     echo "Bar::testPublic<br />"; 
    } 
    private function PrivateTest() { 
     echo "Bar::testPrivate<br />"; 
    } 
    protected function ProtectedTest() { 
     echo "Bar::testProtected<br />"; 
    } 
} 

class Foo extends Bar { 
    public function __construct() { 
     echo "Foo::constructor<br />"; 
    } 
    public function PublicTest() { 
     echo "Foo::testPublic<br />"; 
    } 
    private function PrivateTest() { 
     echo "Foo::testPrivate<br />"; 
    } 
    protected function ProtectedTest() { 
     echo "Foo::testProtected<br />"; 
    } 
} 

$myFoo = new Foo(); 
$myFoo->test(); 

>

이 같은 출력을 생성합니다

Foo::constructor 
Foo::testPublic 
Bar::testPrivate 
Foo::testProtected 

public에 대한 Foo 클래스와 protected 함수에서 인쇄하는 동안은 private 기능에 Bar 클래스에서 인쇄합니까? 이 클래스에 없기 때문에 함수에 Bar 클래스에서 액세스합니다.

$this 어디로 포인터가 있습니까? 그것은 Foo 클래스의 함수 또는 Bar 클래스의 함수를 가리 킵니까? 나는 정말로 여기에서 혼란스러워한다. 누군가 제게 이것을 설명해 주시겠습니까? 어떤 도움이라도 대단히 감사 할 것입니다.

+0

여기 비슷한 스레드가 도움이 될 수도 있습니다 http://stackoverflow.com/questions/4361553/php-public-private-protected – brad

+0

@brad 감사합니다 ...하지만 그건 내 의심을 명확히하지 않았다. : – Beevk

+0

비공개 클래스 만 볼 수 있습니다 public = 누구나 볼 수 있고 액세스 할 수있는 사람은 볼 수 있으며 어떤 클래스도 볼 수 있습니다. 나는 100 % 확신 할 수는 없지만 Foo 클래스는 PublicTest 및 ProtectedTest ..... – brad

답변

0

에서 가져온 것입니다. 바를 확장 푸 이후,

$myFoo = new Foo(); 
$myFoo->test(); 

우리는 클래스 내부 테스트()를 호출하며 의 테스트() 바를 사용하여 우리가 처음에 테스트()를 호출 할 때 이를 사용하여 공개되어 클래스 Foo에 표시되어 있기 때문입니다. 이제 내부 foo는() 클래스는,이 3 개 기능을 호출됩니다 여기

$this->PublicTest(); 
$this->PrivateTest(); 
$this->protectedTest(); 

, 우리는 지금 클래스 내부에 따라서는의 PrivateTest()와 ProtectedTest() 볼 수 있습니다 그것은 자신 만의 수업입니다. 이러한 함수의 표시 여부는 개인으로 설정되어 있으므로으로 보호됩니다. 그러나 PublicTest()의 경우 2 개의 함수를 볼 수 있습니다. PublicTest()가 FooBar 클래스 모두에 대해 Public 가시성으로 설정 되었기 때문에.우리는 항상에 참조하는 $이 핸들러를 사용하고 있기 때문에

: 클래스 때문에 다음과 같은 이유로 자체 PublicTest()를 가지고 있지만 클래스의 여기 , 공공 기능 선택 현재 사용중인 객체 (이 경우 Foo 클래스 임)의 경우 Foo 클래스의 PublicTest()를 선택합니다.

0

$ 이것은 현재 객체입니다 .... 아마도 self :: PublicTest(); 당신이 새로운 Foo()를 만들 때 당신이 생각하고있는 것을 내놓을 것입니다; $ this->이 아니라, 현재의 클래스 만들어 현재 객체를 참조한다 -

class Animal { 

    public function whichClass() { 
     echo "I am an Animal!"; 
    } 

    /* This method has been changed to use the 
     self keyword instead of $this 
    */ 

    public function sayClassName() { 
     self::whichClass(); 
    } 

} 

class Tiger extends Animal { 

    public function whichClass() { 
     echo "I am a Tiger!"; 
    } 

} 

$tigerObj = new Tiger(); 
$tigerObj->sayClassName(); 

이 내가 동물입니다 생산합니다!

때문에 각 클래스/함수의 가시성의의 http://www.programmerinterview.com