문제

나는 다음과 같은 일을하려고 노력하고 있지만 손실 중입니다 ...

class Foo {
    public $somethingelse;

    function __construct() {
        echo 'I am Foo';
    }
    function composition() {
        $this->somethingelse =& new SomethingElse();
    }
}
class Bar extends Foo {
    function __construct() {
        echo 'I am Bar, my parent is Foo';
    }
}
class SomethingElse {
    function __construct() {
        echo 'I am some other class';
    }
    function test() {
        echo 'I am a method in the SomethingElse class';
    }
}

내가하고 싶은 것은 클래스 Foo 내에서 Something Else 클래스의 인스턴스를 만드는 것입니다. 이것은 사용합니다 =&. 그러나 클래스 FOO를 클래스 바와 함께 확장하면 아이가 부모 클래스의 모든 데이터 속성과 메소드를 물려받을 것이라고 생각했습니다. 그러나 그것은 것 같습니다 $this->somethingelse 어린이 계급 바에서 작동하지 않습니다.

$foo = new Foo(); // I am Foo
$foo->composition(); // I am some other class
$foo->somethingelse->test(); // I am a method in the SomethingElse class

$bar = new Bar(); // I am Bar, my parent is Foo
$bar->somethingelse->test(); // Fatal error: Call to a member function test() on a non-object

그렇다면 그런 식으로 물려받을 수 없습니까? 그리고 그곳에서 사용하려면 클래스 바에서 새로운 클래스 인스턴스를 만들어야합니까? 아니면 내가 뭔가를 놓치고 있습니까?

도움을 주셔서 감사합니다.

도움이 되었습니까?

해결책

나는 아이가 부모 클래스의 모든 데이터 속성과 방법을 상속한다고 생각했습니다.

이는 사실입니다. 아동 클래스는 부모 클래스에서 정적 변수와 정적 메소드를 상속합니다. 또한 모든 하위 물체는 정적 및 인스턴스 변수 및 메소드를 상속합니다.

기존 클래스 구조로 원하는 것을 얻을 수있는 한 가지 가능성은 다음과 같습니다.

$bar = new Bar();
$bar->composition();// here you are calling the parent method, sets instance var $somethineelse
$bar->somethingelse->test();// now you can call methods

하위 인스턴스에서 변수 (이 경우 객체)를 상속하는 또 다른 방법은 다음과 같습니다.

class Foo {
    protected $somethingelse;
    public function __construct() {
        $this->somethingelse = new SomethingElse();
    }
}

class Bar extends Foo {
    public function __construct() {
        parent::__construct();
        // now i've got $somethingelse
    }
 }

PHP 5의 클래스와 객체에 대한 아주 좋은 개요는 여기를 살펴보십시오.http://php.net/manual/en/language.oop5.phpOO가 당신을 위해 새로운 경우 몇 번이나 읽으십시오.

다른 팁

Bar에는 FOO에서 상속 된 멤버 변수가 있습니다.

당신은 객체와 클래스 범위를 혼합하고 있습니다.

설명 된 효과를 실제로 달성하려면 변수를 정적으로 만들어야하므로 컨텍스트는 클래스 기반입니다.

먼저 정적 변수와 인스턴스 변수를 구별해야합니다. 정적 변수는 클래스의 모든 인스턴스 중에서 공유되며 인스턴스 변수는 그렇지 않습니다.

FOO와 BAR의 모든 인스턴스를 원한다면 정확히 동일한 SomethingElse-Instance를 갖기를 원한다면 $ Something STATIC를 만들어야합니다.

공개 정적 $ SomethingElse

그리고 당신은 foo의 구성 기능을 바꿔야합니다.

function composition() {
    self::$somethingelse = new SomethingElse();
}

이 정적 필드에 액세스하려면 다음을 수행 할 수 있습니다. $ foo = new foo (); // 나는 foo $ foo-> composition (); // 나는 다른 클래스입니다. foo : $ somethingelse-> test (); // 나는 SomethingElse 클래스의 메소드입니다

$ bar = new bar (); // 나는 바이고, 부모님은 foo bar :: $ someingelse-> test (); // 나는 SomethingElse 클래스의 메소드입니다

Foo 및 Bar의 모든 인스턴스를 원한다면 고유 한 SomethingElse 인스턴스가 있으면 코드를 사용할 수 있지만 추가해야합니다.

$ bar-> composition ()

$ bar-> somethingelse-> test () 이전;

그 때문입니다

$ bar = new bar ();

완전히 새로운 막대 인스턴스를 만들었고 해당 인스턴스에는 $ somethingelse 속성이 있지만 아직 설정되지 않았습니다. 따라서 설정 ()을 호출하여 설정해야합니다.

모든 foo와 bar가 정확히 동일한 SomethingElse-Instance를 가져야하는 경우, 필요한 메모리를 줄이기 때문에 정적 버전을 대신 사용해야합니다.

이것이 당신을 도울 수 있기를 바랍니다. 그렇지 않으면 더 자세히 설명하게되어 매우 기쁩니다.

클래스가 속성을 공유한다고해서 객체가 공유한다는 의미는 아닙니다. 속성 값.

다른 사람들이 지적했듯이, 당신은 사례와 혼동하고 있습니다.

다음과 같은 경우 동일한 오류가 발생합니다.

$foo = new Foo(); // I am Foo
$foo->composition(); // I am some other class
$foo->somethingelse->test(); // I am a method in the SomethingElse class

$foo2 = new Foo(); // I another Foo
$foo2->somethingelse->test(); // Fatal error: Call to a member function test() on a non-object

수업을 덜 추상적으로 생각하십시오. 예를 들어, "로열티"의 부모 클래스 인 "Person"인 수업이있을 수 있습니다.

그렇다면 :

$ me = 새로운 사람 (); $ me-> firstName = "Thomas"

$ princharles = New Royalty ();

$ princharles가 "Thomas"와 같은 첫 이름 속성을 갖기를 원하지 않을 것입니다. 그리고 $ princharles-> firstName을 설정하려면 $ me의 FirstName 속성의 값을 변경하지 않습니다.

$ me와 $ princharles는 모두 'FirstName'속성을 가지고 있지만 우리는 공유하지 않습니다. 그 속성의.

파생 클래스 생성자가 부모 클래스 생성자를 호출하면 문제가 해결 될 것이라고 생각합니다. 이것은 PHP에서 기본적으로 발생하지 않으므로 데이터 구성원 상속에 문제가있을 때 명심하십시오.

클래스 바가 foo {public function __construct () {parent :: __ construct ();

}

}

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top