0

本当に似たようなタイトルの質問をいくつか見ましたが、それらは私の特定の問題とは無関係です。

基本的にコアを拡張したクラスでコアクラスの変数にアクセスしたいのですが、他の例に比べるとかなり複雑なようです。MVC フレームワークを使用しています。以下のコードを単純化して、無関係なものをすべて削除しました。

index.php

// Load the core
include_once('core.php');
$core = new Core($uri, $curpath);
$core->loadController('property');

core.php

class Core
{
    public $uri;
    public $curpath;

    function __construct($uri, $curpath)
    {       
        $this->uri = $uri;
        $this->curpath = $curpath;
    }


    // Load the controller based on the URL
    function loadController($name)
    {       
        //Instantiate the controller
        require_once('controller/'.$name.'.php');
        $controller = new $name();
    }


}

プロパティ.php

class Property extends Core
{
    function __construct()
    {
        print $this->curpath;
    }   
}

$this->curpath を印刷しても、何も返されません。変数は設定されていますが、空です。$this->curpath を core.php 内に出力すると、正常に出力されます。

この変数にアクセスするにはどうすればよいですか?

4

3 に答える 3

6

あなたはそれを間違っていますtm

  1. 各クラスにファイルを手動で含めるのではなく、オートローダーを利用する必要があります。spl_autoload_register()と と名前空間、およびそれらの両方を利用する方法について学ぶ必要があります。

  2. __construct()メソッドで出力を生成しないでください。それは非常に悪い習慣です

  3. 変数はまだそこにあります。それは問題ではありません。PHP では、クラスを拡張してもコンストラクタは継承されません

  4. 継承の仕組みを理解していません。拡張クラスのインスタンスでメソッドを呼び出すと、拡張クラスのメソッドを呼び出す前に、親クラスのメソッドは実行されません。スタックではなく、上書きされます。

  5. オブジェクト変数は公開しないでください。カプセル化を破っています。代わりに、使用する必要があるようにそれらを定義しpublicますprotected

  6. それらのクラスを拡張する必要があります。それらは異なる型であり、一般的なものです。extendsPHPのはis-aを意味します。つまり、 と書くときclass Oak extends Tree、すべての樫の木が木であることを意味します。同じルールは、あなたの理解では、すべてのPropertyインスタンスはインスタンスの特殊なケースにすぎないことを意味しCoreます。彼らは明らかにそうではありません。

    OOPには原則があります。そのうちの 1 つがリスコフの置換原理(短い説明) です。そして、これはあなたのクラスが違反していることです。

于 2012-06-20T13:50:11.190 に答える
0

問題はここにあると思います:

このような単純な継承を考えると:

class Dog{
    public $color;

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

class TrainedDog extends Dog{
    public $tricks;

    public function __construct($color, $tricks){
        $this->tricks = $tricks;

        parent::__construct($color);
    }
}

//Create Dog:
$alfred = new Dog('brown');

//Create TrainedDog
$lassie = new TrainedDog('golden',array('fetch'));

この例では、$alfred は茶色の犬で、$lassie は金色の犬です。2 つのインスタンスは互いに別個のものです。唯一の共通点は、両方に $color というプロパティがあることです。

たとえば、すべての Dog で使用できる変数が必要な場合は、クラス変数が必要です。

class Dog{
    public $color;

    public static $numberOfLegs; //Class variable available in every instance of Dog.

    public function __construct($color, $numberOfLegs){
        $this->color = $color;
        self::$numberOfLegs = $numberOfLegs;
    }
}

class TrainedDog extends Dog{
    public $tricks;

    public function __construct($color, $tricks){
        $this->tricks = $tricks;

        parent::__construct($color);

        echo parent::$numberOfLegs;
    }
}

ただし、これは多くの場合あまり意味がありません。親クラスのインスタンスが 2 つある場合 (コアの場合)、それらはクラス変数も共有するためです。

コアが 1 回だけインスタンス化されることを保証できない限り、このアプローチは機能しません。一度しか存在しない場合は、定数変数を使用して 2 つのプロパティを格納することもできます。

コアのインスタンス/オブジェクトが複数存在する場合は、コンポジションを使用することをお勧めします (Alvin Wong の提案による)。

class Core{
      //Just as you programmed it.
}

class Property{
      private $core;

      public function __construct($core){
          $this->core = $core;

          echo $core->curPath;
      }
}
于 2012-06-20T12:09:43.347 に答える
-1

これを試して

include_once('core.php');
$core = new Core('test', 'path');
$core->loadController('property');

class Property extends Core
{
 function __construct($date)
{
    print $date->curpath;
}   
}



class Core
{
public $uri;
public $curpath;

function __construct($uri, $curpath)
{       
    $this->uri = $uri;
    $this->curpath = $curpath;
}


// Load the controller based on the URL
function loadController($name)
{       
    //Instantiate the controller
    require_once($name.'.php');
    $controller = new $name($this);
}


}
于 2012-06-20T11:41:12.080 に答える