2016-09-01 11 views
0

これまでにこれが尋ねられたことは間違いありませんが、どこにも見つかりません。PHP:クラスを拡張する

私は2つのクラスを持っています。 AとB 3番目のファイルで

class classA 
{ 
    public $var1; 
    public $classbVar; 
    public function init() 
    { 
     // This is here because other script is run before it is called 
     // in the live code. 
     // it basically checks that the file exists. There is a reason for this. 
     if (file_exists('classB.php')) 
     { 
      require_once('classB.php'); 
     } 
     else 
     { 
      echo "An error has occurred loading the second class."; 
     } 
     $this->var1 = "something"; 
     $this->classbVar = new classB 
     echo $this->classbVar->doSomething(); 

    } 
} 
別のファイルに

class classB extends classA 
{ 
    public function doSomething() 
    { 
      echo $this->var1; 
    } 
} 

、私はクラスAを呼び出し、init関数を実行していますよ。これは実際のコードではなく、私が書いたものと同じです。

なぜ、これは機能しません。もし私がVAR_DUMPの場合、私はnullになります....私は何を間違えたのか誤解しましたか?

MEがより明確とする:

以下のようにクラスAを呼び出し、3番目のファイルがあります。混乱のため

require_once('classA.php') 
$classA = new classA; 
$classA->init(); 

私の謝罪、私はここに簡単な何かが欠けています確信しているとして、私は、その場で少しこれをしました。確かに私がこれをやろうとしている方法は何とか働くでしょう。

+0

正確なコードは、どのようなものが失敗しているように見えますか? – jeroen

+0

基本的には.... 'require_once(classA.php); $ classA = new classA(); $ classA-> init(); ' – ukitconsultant

+0

正確なコードの長さは500行を超えています。これは、拡張が適切に動作していないか、少なくとも予想したほどではありません。これは、開始からぶら下がりまでの6つのファイルにまたがっています。その時点までのすべてがうまくいっていますが、これは私がクラスを拡張して遊んだのは初めてのことですが、私は手続き的に育ったし、それをうまくいくことができますが、将来的にはクラスははるかに改善されやすくなります。 – ukitconsultant

答えて

0

あなたの出力がNULLにさせる、ここで2つの問題があります。

  1. あなたは新しい$classAオブジェクトを生成しているし、それがあるとして、あなたはその上で設定されたすべての値は、自動的に$classbVarオブジェクトに設定されることはありませんが、 Aクラスを拡張しているクラスの全く異なるオブジェクトです。今作成したばかりの$classAオブジェクトではありません。
    もちろん静的なプロパティを除いて...
  2. オブジェクト内のプロパティの値を設定する場合は、$var1の代わりに$this->var1が必要です。
    $classAオブジェクトに値を設定した場合でも、$classbVarオブジェクトの値は設定されていません。クラス宣言上記
+0

だから、これは私がそれをどのように理解したかとは完全に逆です。継承された全体は、第2クラスが呼び出された後ではなく、第2クラスから第1クラスまでです。 – ukitconsultant

+0

@ukitconsultant特定のクラスのオブジェクトは、拡張する*クラス*の特性を継承しますが、別の*オブジェクト*から何も継承しません。クラス内で同じクラスを拡張するオブジェクトを生成すると少し混乱します:-) – jeroen

+0

それではクラス間でどのように値を渡しますか?私はここで完全に愚かな何かを逃したことがありますか? – ukitconsultant

0
  1. 入れますrequire_once(これは大きな問題ではないですが、それがより明らかだ)
  2. 彼らは道あなたがそれらの範囲は、メソッド内だけでなかったので、クラスのプロパティに変数を割り当てます。

    $var1 = "something";

は、それらがstaticとして宣言されていない限り、クラス値が共有されていない。また

$this->var1 = "something"; 

に変更する必要があります。

class classA 
{ 
    public $var1; 

    public function init() 
    { 
     $this->var1 = "something"; 
    } 
} 

// other file 
require_once("A class location"); 

class classB extends classA 
{ 
    public function doSomething() 
    { 
      echo $this->var1; 
    } 
} 

$b = new classB(); 
$b->init(); 
$b->doSomething(); 

以上のきれいな方法を:だから、あなたは次の操作を行うことができ、親クラスからプロパティにアクセスするには

class A 
{ 
    protected $var1; 

    public function __construct() 
    { 
     $this->var1 = "something"; 
    } 
} 

// other file 
require_once("A class location"); 

class B extends A 
{ 
    public function doSomething() 
    { 
      return $this->var1; 
    } 
} 

$b = new B(); 
echo $b->doSomething(); 

// or shorter syntax 

echo {new B()}->doSomething(); 

代わりのrequire_once()を使用して、それがPSR-4 autoloaderを使用することをお勧めします。