2011-07-08 11 views
1

Class_Aの関数の1つでClass_B関数を使用しようとしています。しかし、多くのClass_Bの関数には、問題の原因となる$thisが含まれています。クラスのインスタンス化と異なるクラスのメソッドへのアクセス

class Class_A 
{ 
    function hello() 
    { 
     require('class_b.php'); 
     echo 'Hello ' . Class_B::person(); 
    } 

    function bye() 
    { 
     require('class_b.php'); 
     echo 'Bye ' . Class_B::person(); 
    } 
} 

class Class_B 
{ 
    function person() 
    { 
     // various operations and variables 
     echo $this->get_user($id); 
    } 
} 

私はCLASS_Aファイルを実行すると私はCLASS_Aクラスをインスタンス化するとき$この値が変更されると思うので、私はCall to undefined method Class_A::person() in (...)を取得する:これらは、両方のクラス(各クラスは、独自のファイルにはもちろんである)です。 Class_Bの値を上書きします。どうすればこれをやめることができますか?

また、別の質問:Class_Aのすべての機能からClass_Bにアクセスするにはどうすればよいですか?私はクラスを再宣言したくありません。これを行う必要がありますか:

class Class_A 
{ 
    function function1() 
    { 
     require('class_b.php'); 
     $class_b = new Class_B(); 
     // code 
    } 

    function function2() 
    { 
     require('class_b.php'); 
     $class_b = new Class_B(); 
     // code 
    } 
} 

またはコンストラクタなどを使用する必要がありますか?

答えて

2

Class_B::person()メソッドを静的に呼び出しています。だからperson()メソッドを静的として宣言し、Class_Bというインスタンスがないので$thisは使用できません。

Class_Bのインスタンスが必要な場合は、インスタンスを作成して、建設中のclass_Bに保存してください。

class Class_A { 
    private $b; 
    function __construct() 
    { 
    $this->b = new Class_B(); 
    }  
    function stuff() 
    { 
    $this->b->person(); 
    } 
+0

これはうまくいった。あなたの投稿を編集して最終的な '}'を追加しようとしましたが、それは私にはできませんでした! – hohner

1

requireをメソッドに入れないでください。 include dファイルのコードは、そのファイルを含む場所のスコープを継承しています。この例では、悪いことが起こります。また、クラス定義スクリプトの場合、複数の定義を避けるため、requireの代わりにrequire_onceを考慮してください。

大まかには、includerequireをスクリプトの先頭に入れます。さらに、クラスオートローダーをセットアップし、auto_prependスクリプトに登録してください。そうすれば、手動で何かを(少なくともクラス定義のために)含めなくても済むでしょう。

+0

[こちら](http://www.php.net/manual/en/language.oop5.autoload.php)は、自動読み込みクラスに関するドキュメントです。 –

0

あなたが望むのは、依存性注入です。Class_BのオブジェクトをClass_Aのコンストラクタに渡し、プロパティとしてClass_Aに保持します。それはClass_Aとして$this->classBまたはそれに類似して利用可能になります。

// Include Class_B code outside the class. 
require_once('class_b.php'); 
class Class_A { 
    // Property to hold Class_B 
    public $b; 

    // Constructor 
    public function __construct($b) { 
    $this->b = $b; 
    } 

    public function function1(){ 
    // code 
    $this->b; 
    } 
    public function function2(){ 
    // code 
    $this->b; 
    } 
} 

// Now call your objects: 
// The Class_B which will be injected into A 
$b = new Class_B(); 
// Your Class_A, which holds an instance of Class_B as a property 
$a = new A($b); 
関連する問題