2011-07-27 3 views
6

저는 매우 간단 할 것이라고 생각하는 것을하려고합니다. 그러나 PHP에서 OOP에 비교적 익숙하지 않기 때문에 약간의 문제가 있습니다.자식 클래스에 대한 보호 된 변수의 값을 변경하십시오.

<?php 
class MyClass 
{ 
    protected $variable = 'DEFAULT'; 

    function __construct($newVariable) 
    { 
     $this->variable = $newVariable; 
     echo $this->variable; 
    } 
} 
class OtherClass extends MyClass 
{ 
    function __construct() 
    { 
     echo $this->variable; 
    } 
} 

$foo = new MyClass('MODIFIED'); // Output : MODIFIED 
$bar = new OtherClass(); // Output : DEFAULT 
?> 

내가 다른 스레드와 많은 웹 사이트를 검색하지만 아마도 자식 클래스에 $ 변수의 재정의 값을 전달할 수있는 방법을 발견하지 않았습니다 :

여기 내 코드입니다. 누군가 나를 통해 가이드 할 수 있습니까? 방법이 있다면.

미리 감사드립니다.

편집 실제로 나는이 문제에 봉착 스크립트에서 무슨 일이 일어나고 있는지 명확히 : 을 나는이 양식을 작성하고, 그 클래스에 우리가 무엇을 ENVIRONNEMENT의 기능을 말하는 몇 가지 변수가 클래스 : 경우 다차원 형식이든 아니든, 일반 형식이나 구조화 된 형식의 매개 변수를 원한다면 말입니다. 그리고 이러한 환경 변수 중 일부는 클래스의 기능을 통해 클래스의 실행을 통해 수정됩니다.

이제 내 페이지의 필요성 때문에 "선택"필드를 만드는 데 전념 한 하위 클래스가 있습니다. 필드를 생성하기 위해 메인 클래스의 핵심 기능을 상속하지만 하위 클래스는 몇 가지 매개 변수를 더 많이 사용합니다. 그게, 나는 여전히 주 클래스에서 environnement 매개 변수를 상속하는 select 클래스를 원할 것입니다.

필자는이 코드를 입력 할 때 올바른 방법이 아닐 수도 있다고 생각합니다. 코드를 볼 때 다른 방법이있을 수 있기 때문입니다. 제 코드에는 두 가지 객체가 필요합니다. 단 하나만 필요하지만 실제 배치하는 방법을 모르겠습니다.

+1

변수를 재정의하지 않고 부모 생성자로 설정하기 만하면됩니다. 당신이 필요로하는 것을 당신에게 부르십시오. – hakre

+0

OOP는 함수와 기본 변수의 상속입니다. 그것은 마술처럼 두 개체를 연결하지 않습니다. 슬프게도. –

답변

2

변수를 재정의하지 않고 부모 생성자에서 변수를 설정하기 만하면됩니다. 를 호출하고 당신은 당신이 필요있어 (코드의 주석을 참조, 그것은 단지 한 줄의) : 당신이 두 개의 클래스 정의를하더라도

<?php 
class MyClass 
{ 
    protected $variable = 'DEFAULT'; 

    function __construct($newVariable) 
    { 
     $this->variable = $newVariable; 
     echo $this->variable; 
    } 
} 
class OtherClass extends MyClass 
{ 
    function __construct() 
    { 
     parent::__construct(); # <<--- do this 
     echo $this->variable; 
    } 
} 

$foo = new MyClass('MODIFIED'); // Output : MODIFIED 
$bar = new OtherClass(); // Output : MODIFIED 
?> 

, 콘크리트 인스턴스는 항상 하나 개의 클래스 될 것입니다. 그 한 클래스는 부모 클래스로부터 상속받을 수 있지만, 당신이 생성자를 사용했을 때처럼 메소드를 오버라이드한다면, 부모 클래스 메쏘드 은 오버라이드 되었기 때문에이 호출되지 않을 것이다. 그러나 parent 키워드를 사용하면 하위에서 부모의 방법에 액세스 할 수 있습니다.

+0

글쎄, 문제는 내가 여기에 관심이있는 것은 'MODIFIED'값입니다. 부모 :: _ 구문을 다시 호출하면 $ newVariable을 지정해야합니다. 따라서 내가 입력 한 내용은 처음에 MyClass에 전달 된 값이 아닙니다. 전반적으로 나는 전체 클래스를 자식 클래스에 전달해야하는데, 변수는 때때로 MyClass의 내부 함수에 의해 수정되었지만 실제로 가능한지 궁금해하기 시작했습니다. –

+0

@ Maxim : 그건 단지 상속입니다. 보호 된 멤버는 부모 및 자식이 액세스 할 수 있지만 항상 동일한 변수이므로 자식 또는 부모 코드가 변경하더라도 관계없이 항상 동일한 변수에 액세스합니다. 귀하의 질문에서 볼 수없는 내용이 있기 때문에 실제로 원하는 것을 더 말해야합니다. 상속을 다루는 방법에는 여러 가지가 있으므로 성취하고자하는 것을 더 잘 말해주십시오. 당신이 만들었던 것처럼 재정의하는 것은 일어나지 않습니다. – hakre

+0

여기에서 메인 포스트에 컨텍스트를 추가했지만 모든 답변에서 내가하고 싶은 일에 잘못 접근했다고 지적했습니다. –

1

MyClass의 생성자는 OtherClass에서 재정의됩니다. 부모 생성자는 이 아니며이 자동으로 실행되지 않습니다. 상위 생성자도 실행하려는 경우 을 OtherClass::__construct으로 호출하십시오.

MyClass::__construct에는 매개 변수가 필요하므로 여기에 문제가있는 것은 물론 OtherClass::__construct에는 매개 변수가 없습니다. 그것을 이렇게하면 어떻게 가치가 변하기를 기대 했습니까?

0

당신은 자식 클래스에 parent에 대한 호출을 추가해야합니다

function doSomethingAWESOME() 
{ 
    parent::doSomethingAWESOME(); 
    echo "I think that was awesome"; 
} 

그리고 기본적으로 문 양이, "당신은 알고

function __construct() 
{ 
    parent::__construct(); 
    echo $this->variable; 
} 

당신은 어떤 기능을 그렇게 할 수 있습니다 내가 부모님을 무효화하기 전에 부모 클래스에서해야 할 모든 일은 할 수 있겠습니까? 네.

또한 멋진 :

function doSomethingAWESOME() 
{ 
    echo "NEVER!!!"; 
} 

function parentSomethingAwesome() 
{ 
    // calls the parent class's definition of some doSomethingAWESOME 
    parent::doSomethingAWESOME(); 
} 
1

아이 클래스는 방법과 기본 변수를 상속합니다. $foo$bar은 두 다른 개체이므로 새 인스턴스를 시작하면 루트 클래스의 속성을 상속하지 않습니다.

$bar = new OtherClass("MODIFIED");을 수행 한 다음 parent::__construct($newVariable)을 두 번째 __construct에도 추가해야합니다. (그리고 각 매개 변수)

기본적으로 새로운 인스턴스 ($ foo와 평행 함)가 원본 $ foo에서 수정 된 인스턴스를 "마법처럼"상속받을 것이라고 기대할 수 없습니다. 그것을 전달하는 방법을 찾아야합니다 (따라서 부모 생성자를 호출).

0

원하는대로 할 수 없습니다. $ foo 및 $ bar는 클래스의 인스턴스이므로 둘 사이에 링크가 없습니다.

구조 비유를 사용하려면 두 클래스가 건물 계획과 같습니다 : 주택 계획, 차고가있는 주택 계획. 당신이하려고하는 것은 당신이 집을 짓거나 (예를 들어 클래스), 어떤 종류의 침대를 놓고 (변수를 설정하는), 차고가있는 다른 집을 지을 때 같은 침대를 원하는 것처럼하는 것입니다. 그런 일 없을거야.

관련 문제