>

부모 객체 데이터를 얻기 위해 객체를 순회하는 방법이 있습니까? "부모 개체"를 사용하면 부모 클래스를 의미하는 것이 아니라 말 그대로 개체를 의미합니다. 다음은 자바 세계의 예입니다 :-) :

$parent->test = "hello world!";
$parent->child = new B();

자식 개체에서 부모의 모든 데이터에 액세스 할 수 있다면 좋을 것입니다 :

class B{
//I know this doesn't exists, but it's what I wanted do do
    function B(){
        $this->parent = $this->parent();
        echo $this->parent->test; //it would ouput "hello world"
    }
}

현재 나의 해결책은 부모 객체를 자식에게 참조로 전달하거나 부모를 전역으로 만드는 것입니다. 더 나은 해결책이 있습니까?

감사합니다!

  • 답변 # 1

    호출 할 방법이 없습니다

    $parent->test = "hello world!";
    $parent->child = new B();
    
    

    B에서 $parent에 대한 참조를 자동으로 갖습니다.

    <시간>

    일반적으로 클래스를 구성하는 네 가지 방법이 있습니다 :

    1. 주입을 통해 부모 개체를 집계합니다 (예 :

    class B
    {
         private $parent;
         public function __construct($parent) 
         {
             $this->parent = $parent;
         }
         public function setParent($parent) 
         {
             $this->parent = $parent;
         }
         public function accessParent() 
         {
            $this->parent->someMethodInParent();
         }
    }
    
    

    객체가 생성 될 때 부모가 있어야하는 경우 생성자 주입을 사용하십시오. 이것은has-a관계이며 매우 느슨한 결합을 만듭니다. B에는 하드 코딩 된 종속성이 없으므로 UnitTesting시 Mock과 같은 Parent 인스턴스를 쉽게 교체 할 수 있습니다. Dependency Injection을 사용하면 코드를 유지 관리하기가 더 쉬워집니다.

    UseCase에서 $parent 를 전달합니다  B를 만들 때 B로 :

    $parent->child = new B($parent);
    
    

    2. 컴포지션 사용

    class B
    {
         private $parent;
         public function __construct() 
         {
             $this->parent = new Parent;
         }
         public function accessParent() 
         {
            $this->parent->someMethodInParent();
         }
    }
    
    

    이것은has-a관계이지만 Parent 클래스를 B에 연결합니다. 또한 기존 Parent 인스턴스가 아니라 새 인스턴스입니다. 표현에서 나는 아이가 부모를 만든 것이 다소 이상하다는 것을 알았습니다. 의존성이 루트 클래스 외부에 존재하지 않는 것으로 간주되는 클래스이지만 그것이 나타내는 모든 것의 일부인 경우에 이것을 사용하십시오.

    UseCase에는 $parent->child = new B(); 를 수행 할 방법이 없습니다  $parent가 Singleton이 아니라면이 방법을 사용할 때 부모가 무엇인지 알고 있어야합니다. 그렇다면 Singleton 인스턴스를 얻을 수 있습니다 (예 : 와이즈 비즈  원하는 것을 달성하기 위해 싱글 톤은 모든 사람이 좋아하는 패턴이 아닙니다. 테스트하기 어렵다.

    3. 상속 사용

    Parent::getInstance()
    
    

    이 방법으로is-a관계를 만듭니다. Parent 클래스의 모든 공개 및 보호 메소드 및 속성 (특정 인스턴스는 아님)은 B에서 사용할 수 있으며 class B extends Parent { public function accessParent() { $this->someMethodInParent(); } } 를 통해 액세스 할 수 있습니다.  B 인스턴스의 키워드.

    UseCase의 경우,이 방법은 작동하지 않습니다. Parent 인스턴스를 전혀 가질 필요는 없지만 B는 생성 될 때 Parent의 모든 것을 캡슐화합니다

    $this
    
    

    4. 글로벌 키워드 사용

    $b = new B;
    
    

    와이즈 비즈  키워드는 전역 변수를 현재 범위로 가져옵니다. 일반적으로 OO 컨텍스트에서 global 키워드를 사용하지 말고 위의 다른 세 가지 방법 중 하나, 바람직하게는 첫 번째 방법을 사용하십시오. 언어 기능이지만 눈살을 찌푸리게합니다. 첫 번째 언어와 가장 근접한 것입니다 (예 :

    class B extends Parent 
    {
        private $parent;
        public function __construct() 
        {
            global $parent;
            $this->parent = $parent;
        }
        public function accessParent() 
        {
            $this->parent->someMethodInParent();
        }
    }
    
    

    어쨌든 도움이 되길 바랍니다.

  • 답변 # 2

    부모를 자녀에게 전달하는 것이 더 나은 해결책입니다. 다소 바람직하지 않은 공생 관계이지만.

    B ()가 속성 인 객체에 대해 알고 있어야 하는가? 아마도 그렇지 않을 것입니다. 컴포지션을 통해 느슨하게 관련됩니다.

    B ()가 왜 부모의 속성이어야합니까? B () 에서이 구현이 필요합니까, 아니면 부모의 일부 여야합니까?

  • 답변 # 3

    어떤 경우에는 유용 ​​할 수 있습니다 : 생성자에서 부모 객체를 ChildClass에 매우 일찍 가져 오지 않습니다 한 단계 후에. 존재하지 않는 방법을 가로 챌 수 있습니다.

    global
    
    

    $parent->child = new B(); 를 출력합니다

  • 답변 # 4

    PHP에는 그런 것이 없습니다.

    부모 객체를 자식에게 전달하는 솔루션이 최선의 해결책이라고 생각합니다. 여러 부모가 같은 자녀를 갖지 못하게하려면 자녀의 생성자에서만 부모 속성을 설정해야합니다.

  • 답변 # 5

    아니요

    $this를 사용하여 수퍼 클래스에서 변수에 액세스 할 수 있습니다 :

    class ParentClass
    {
        const CHILD_PROPERTY_NAME = 'child';
        public $data = 'Some data';
        public function
        __set($property_name, $property_value)
        {
            if ($property_name == self::CHILD_PROPERTY_NAME)
            {
                $property_value->set_parent_object($this);
            }
        }
    }
    
    class ChildClass
    {
        private $parent_object = null;
        public function
        set_parent_object($object)
        {
            $this->parent_object = $object;
            echo $this->parent_object->data;
        }
    }
    
    $p = new ParentClass();
    $p->child = new ChildClass();
    
    

    Some data

  • 이전 c# - 인스턴스화 된 객체의 색상을 변경하는 방법은 무엇입니까?
  • 다음 c# - reddits 게시물 정렬과 유사한 기능을 구현하는 동안 전환 사례를 피하는 방법