0

解決策とパターンを何時間も探した後、私はプロに尋ねる時が来ました。

オブジェクトを論理階層で並べ替えたいのですが、それでも親オブジェクトのプロパティにアクセスできるようにしたいのです。それをどのように機能させたいかという簡単な例...

    class car {

       public $strType;  // holds a string
       public $engine;   // holds the instance of another class

       public function __construct(){
           $this->type = "Saab";
           // Trying to pass on $this to make it accessible in $this->engine
           $this->engine = new engine($this);
       }

    }

    class engine {

        public $car;

        public function __construct($parent){
            $this->car = $parent;
        } 

        public function start(){
            // Here is where I'd love to have access to car properties and methods...
            echo $this->car->$strType;
        }
    }

    $myCar = new car();
    $myCar->engine->start();

私が達成できないのは、エンジンのメソッドが「親」の車のプロパティにアクセスできることです。私はなんとかこのようにそうすることができました、しかしそれは非常に醜いです...

    $myCar = new car();
    $myCar->addParent($myCar);

addParentメソッド内から、インスタンスをエンジンオブジェクトに渡すことができます。しかし、それが手がかりになることはありませんね。私のアイデア全体は奇妙ですか?

車には多くの方法と特性があり、エンジンにはないので、エンジンを車から継承したくありません。あなたが私の言いたいことを理解してくれることを願っています。

ヒントを期待して、乾杯ボリス

4

1 に答える 1

1

@Wrikkenが述べたように、正しい構文は次のようになります。echo $this->car->strType;

typeのメンバーではないようですが、car変更した場合は次のようになります。

$this->strType = "Saab";

次に、問題のステートメントは「Saab」をエコーするはずです。

ここでの良い習慣は、エンジンクラスに車のオブジェクトを含めないことですが、車のクラスだけにエンジンオブジェクトを含める必要があります。そして、プロパティはとしてより良いでしょうprivate。だからあなたは次のような車の方法を持つことができます

public startEngine() {
    $success = $this->engine->start();
    if(success) {
        echo "Engine started successfully!";
    } else {
        echo "Engine is busted!";
    }
}

ここengine::start()でブール値を返します。

于 2012-12-12T18:39:27.293 に答える