2014-11-25 9 views
0

OOP를 이해합니다. 내가 지금까지 이해하고있는 것은 private이고 protected가 $ this-> blah 표기법을 사용하여 클래스 외부에서 참조 될 수 없다는 것입니다. 그것이 맞다면, 어떻게 다음 코드가 작동 할 수 있습니까?클래스의 보호 된 속성을 PHP의 정적 메서드에서 볼 수 있습니까?

<?php 

class test { 
    protected $a = "b"; 

    public static function oo(){ 
    $instance = new static(); 
    echo $instance->a; 
    } 
} 

test::oo(); 

나에게 b의 출력을 줘! 이제 어떻게 주님의 이름으로 그렇게 할 수 있습니까? oo

보낸 다음
+1

주요 문제는 다음과 같습니다. 클래스 외부는 인스턴스화 된 객체 외부와 동일하지 않습니다. 차이점이 있습니다. – Wrikken

+0

@Wrikken +1, 정확한 요지. – dcastro

답변

1

PHP 5.3에서는 late static bindings라는 새로운 기능이 추가되었습니다.이 기능은이 상황에서 바람직한 다형성 동작을 얻는 데 도움이 될 수 있습니다. 간단히 말하면, 늦은 정적 바인딩은 상속 된 정적 함수를 호출 할 때 런타임에 호출 클래스에 "바인딩"한다는 것을 의미합니다. 그래서 우리가 늦은 정적 바인딩을 사용한다면 "test :: oo();"를 호출 할 때 테스트 클래스의 oo() 함수가 호출된다는 것을 의미합니다. $ instance-> 에이; static 키워드는

link, another

을 읽어 보시기 바랍니다 ... 당신이 (보호 민간, 공공,) 다음 정적 어떤 액세스 한정자를 사용하는 경우 기능을 사용하면 그냥 덜 의미있어 사용 runtime.so에서 호출 클래스에 바인드 할 수 있습니다
+0

** 정적을 사용하면 어떤 접근 수정 자 (개인, 공개, 보호)를 사용하든 의미가 덜합니다 ... ** Magic! https://eval.in/226466 테스트 해 보았고 귀하의 설명이 정확합니다! 고마워! –

+0

가장 환영합니다. –

+0

이것은 전혀 이해가되지 않습니다. "PHP 5.3.0부터 PHP는 정적 상속이라는 컨텍스트에서 호출 된 클래스를 참조하는 데 사용할 수있는 후기 정적 바인딩이라는 기능을 구현합니다."- 여기에는 상속이 없습니다. 이러한 링크의 예제는 OP의 예와 아무런 관련이 없습니다. "이것은 다형성 행동을 얻는 데 도움이 될 수 있습니다"- 어떤 다형성 행동? 이것은 "늦은 ​​정적 바인딩"과 아무 관련이 없습니다. 이것은 간단한 OOP 질문입니다. – dcastro

1

What I understand so far is that private and protected cannot be referenced from outside the class

ooa에 대한 액세스를 가지며, a 같은 형태로 정의된다.

+0

확실히 아닙니다. OO는 a에 명시 적으로 액세스 할 수 없습니다. 어떻게 그렇게 될수 있니? oo는 정적 함수이므로 클래스의 인스턴스를 제공하지 않고 비 정적 속성을 읽을 수 없습니다. –

+1

@ ChristianM.Raymonds "클래스의 인스턴스"와 "클래스"를 혼동하고 있습니다. 위의 예제에서 두 클래스는 동일한 클래스에 정의되어 있지만, 클래스의 인스턴스 '$ instance'에 대해 'a'가 호출되고 인스턴스가 없으므로 (정적이기 때문에) 호출됩니다. 그럼에도 불구하고 그들은 동일한 클래스에 ** 정의 **되어 있습니다. – dcastro

+0

이제는 PHP에 익숙하지 않지만 대부분의 프로그래밍 언어에 공통적으로 적용됩니다. 이 간단한 C# 예제를 살펴보십시오. https://dotnetfiddle.net/wxUAZA – dcastro

2

당신이 echo에 의해 "발표"중이기 때문에 이런 일이 일어납니다. 당신은 예를 들어 이런 식으로 참조 할 수 없습니다 :

class test { 
    private $a = 'b'; 

    function __construct() { 
     echo 'instantiated'; 
    } 
} 

$test = new test(); 
echo $test->a; // This line won't work, since it's a private var. 

그것은 당신에게 다음과 같다 오류 메시지가 줄 것이다 : 내가 전에 말했듯이

Fatal error: Cannot access private property test::$a

Example (https://eval.in/226435)


을, 에서 이내에 액세스하고 있으므로 클래스를 볼 수 있습니다. (즉, $instance 당신이해야합니다.)이처럼 사용하도록 코드를 수정하는 경우 :

class test { 
    protected $a = "b"; 

    public static function oo(){ 
    $instance = new static(); 
    return $instance; 
    } 
} 

echo test::oo()->a; 

Example of the above (https://eval.in/226439)

당신은 그 "개인 ACESS ㅋ ㅋ ㅋ ㅋ"오류가 발생합니다.

잘못된 설명을 이해하고 있습니다. "private and protected cannot be referenced from outside the class"은 위의 예에서와 같이 수업 외부의 변수에 액세스 할 수는 없지만 클래스의 내부에서 액세스한다는 것을 의미합니다. 즉, 필요에 따라 수행 할 것입니다 (echo ' 않았다)

+0

나는 당신의 대답을 이해하지 못했습니다. 첫째로 정적 함수는 $ this 스코프를 사용할 수 없기 때문에 비 정적 클래스 변수를 인식하지 못합니다. 맞습니까? 그래서, 저는 $ instance = new class()의 형태로 인스턴스를 부여했습니다; 자, 어떻게이 $ 인스턴스의 private var를 $ instance-> var로 액세스 할 수 있습니까 ?? –

+0

클래스 자체에서 액세스하고 있으며, 그 자체의 인스턴스이기 때문에 쉽게 '$ a' 변수에 액세스 할 수 있습니다. 최신 예를 봅니다. (내 편집에서) – Darren

+0

https://eval.in/226451 코드에서 내 업데이트를 확인합니다. 그 자체의 객체를 먹일 때 여전히 속성을 읽을 수 없습니다. –

관련 문제