2014-12-07 2 views
-2

부모 클래스에서 자식 클래스 속성을 사용하려고하는데 결과를 얻을 수 없습니다. 자식 클래스에서 생성자를 사용하고 있습니다. 어쩌면 누군가가 설명 할 수 있습니다. 어떻게해야합니까? 아래에 주석 처리 된 코드를 남겨 둘 것입니다. 감사! PHP OOP 강제로 자식 클래스를 부모 클래스 속성을 봅니다.

Class DataBase extends Main { 

    public $email, $password1, $password2; 

    function __construct($email,$password1,$password2) { //this is my child class with properties 

     $this->email = mysql_real_escape_string($email); 
     $this->password1 = mysql_real_escape_string($password1); 
     $this->password2 = mysql_real_escape_string($password2); 

    } 
} 

Class Main{} //this is my parent class. I want to use DataBase class properties here. 

마지막 질문은 지옥 잘못 편집했다.

+1

예, 그리고 ...? 자녀에게'$ this-> email'을 사용하십시오 ...!? – deceze

+0

보호 또는 공용으로 정의 된 모든 구성원은 하위 클래스에서 액세스 할 수 있습니다. 비공개 멤버 만 직접 액세스 할 수 없습니다 – DarkBee

+0

오, 이런, 내가 잘못 했어. 내가 원하는 건 자식 클래스 매개 변수를 확장하는 부모 클래스를 만드는 것입니다. –

답변

0

속성을 public으로 설정하면 항상 PHP에서 실제 개체를 사용하므로 부모 클래스의 하위 속성에 액세스 할 수 있어야합니다. 그러나 이것은 OOP에서 그렇게하는 것이 끔찍한 일입니다. 다른 하위 클래스가있는 경우 이러한 속성이 없을 수 있습니다. 그것은 순수한 OOP 반 패턴이다.

편집 :

당신이 $obj_suc = new Main($input_email, $input_password1, $input_password2);을 수행 할 때이 클래스 Main를 인스턴스화합니다. 결과 객체 $obj_suc은 클래스 DataBase에 대해 아무것도 모릅니다. 절대적으로 아무것도. 클래스 DataBase을 인스턴스화하려면 $obj_suc = new DataBase($input_email, $input_password1, $input_password2);을 수행해야합니다.

우리가 리팩토링을 돕길 원한다면 MainDataBase (예 : 하위 속성을 사용하는 1 가지 방법)의 코드가 조금 더 필요합니다. $obj_suc = new Main($input_email, $input_password1, $input_password2); 코드를 작성해야합니다.

+0

내 주요 문제는 부모 클래스 인스턴스를 통해 개체를 설정하면 하위 클래스 메서드에 액세스 할 수 없다는 것입니다. 그래서 나는 자식 클래스를 통해 객체를 설정하기로 결정했으나 이제는 부모 클래스가 자식 클래스 속성을 볼 수 없습니다. 어쩌면 당신은 제안이 있을까요? –

+0

부모님이 자녀 속성에 액세스해서는 안됩니다. 나에게 원래 코드를 보여주고 두 클래스의 생성자를 제공한다. '$ main = new Main(); '을 사용하여'DataBase' 클래스를 인스턴스화 할 수 없으므로이 경우에는'DataBase'의 속성을 갖지 않게됩니다. – Gnucki

+0

내 질문과 마찬가지로 하나의 생성자 만 자식 클래스에 있고 부모 클래스에는 없습니다.다음과 같이 인스턴스를 설정합니다. $ obj_suc = new Main ($ input_email, $ input_password1, $ input_password2); 그리고 부모 클래스 메서드를 도달 할 수 있지만 때마다 내 부모 클래스 메서드 (나는 생성자를 통해 만든 자식 클래스에서 값을 필요로 할 때마다 오류가 발생합니다. 나는 내 코드를 리팩터링해야 할 필요가있다. 그러나 아직도 방법을 모른다. –

0

전역 변수에 액세스 할 수있는 액세스 수정 자 "public"이있어 변수에 쉽게 액세스 할 수 있어야합니다. 예 :

<?php 

$dbc = new Main('val1', 'val2', 'val3'); 

echo $dbc->email, ' ', $dbc->password1, ' ', $dbc->password2, PHP_EOL; 

이 조각은 잘

편집을 일 것이다 : 나는 또한 활성 MySQL의 연결 또는 사용할 수 MySQL의 자원이는 mysql_real_escape_string 기능을 사용하는 데 필요한 것이라고 추가하고 싶습니다.

+0

'DataBase' 인스턴스가 아니라'Main'의 객체. 'DataBase'의 객체는'Main'의 인스턴스입니다. '$ dbc = new Main ('val1', 'val2', 'val3'); '대신'$ dbc = new DataBase ('val1 ','val2 ','val3 '); 더욱이 저는이 질문이 부모 클래스의 자식 속성에 액세스하는 것뿐 아니라 공용 속성에 액세스하는 것입니다. – Gnucki

0

좀 더 이런 일에 코드를 리팩토링해야

<?php 
    class Foo { 
     public $var1, $var2; 

     public function __construct($v1, $v2) { 
     $this->var1 = $v1; 
     $this->var2 = $v2; 
     } 
    } 

    class Main { 
     private $foo = null; 
     public function __construct(Foo f$) { 
     $this->foo = $f; 
     } 
     public function getChildMembers() { 
     if ($this->foo == null) return; 
     return array($this->foo->var1, $this->foo->var2); 
     } 
    } 

    $foo = new Foo('Bar', 'FooBar'); 
    $main = new Main($foo); 
    var_dump($main->getChildMembers()); 
관련 문제