4

私が推測している本当に単純なものですが、なぜ以下が機能しないのですか?class1の中からclass2が見えないスコープだと思います。はい、「非オブジェクトでのメンバー関数の呼び出し」エラーが発生します。

class class1 {
    function func1() {
        $class2->func3();
    }
    function func2() {
        $this->func1();
    }
}

class class2 {
    function func3() {
        echo "hello!";
    }
}

$class1 = new class1();
$class2 = new class2();

$class1->func1;

誰かが私にこれの修正を与えることができれば、私は非常に感謝するでしょう。私はしばらく探し回っていましたが、他のクラス内で新しいクラスをインスタンス化しようとしている他の例がたくさんありますが、私が抱えているこの特定の問題ではありません。

あなたは私がクラスで多くをしないと考えるのは正しいでしょう!

4

4 に答える 4

7

PHPはJavaScriptのようにバブルスコープを使用しないため、$class2未定義です。

変数のスコープは、変数が定義されているコンテキストです。ほとんどの場合、すべてのPHP変数には単一のスコープしかありません。この単一のスコープは、含まれているファイルと必要なファイルにも及びます[…]ユーザー定義関数内に、ローカル関数スコープが導入されています。関数内で使用される変数は、デフォルトでローカル関数スコープに制限されています。

ソース: http: //php.net/manual/en/language.variables.scope.php

つまり、PHPにはグローバルスコープと関数/メソッドスコープしかありません。したがって、$class2インスタンスをコラボレーターとしてメソッドに渡します。

class class1 
{
    function func1($class2) {
        $class2->func3();
    }
}

$class1 = new class1();
$class2 = new class2();
$class1->func1($class2);

または、コンストラクターを介して注入します。

class class1 
{
    private $class2;        

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

    function func1() 
    {
        $this->class2->func3();
    }
}

$class2 = new class2();
$class1 = new class1($class2);
$class1->func1();
于 2012-09-30T16:42:35.710 に答える
2

静的関数/属性を確認することをお勧めします。基本的に、class2をインスタンス化する必要はなく、その中の関数を静的として定義するだけです。次の実装を見てください。

<?php
class class1 {
    function func1() {
        class2::func3();
    }
    function func2() {
        $this->func1();
    }
}

class class2 {
    public static function func3() {
        echo "hello!";
    }
}

$class1 = new class1();

$class1->func1();

?>

オブジェクトのインスタンス化をできるだけ避けるのは常に良いことです。

于 2012-09-30T16:43:22.087 に答える
0
class class1 {
    function func1() {
        //Initialize before using it.
        $class2 = new class2();
        $class2->func3();
    }
    function func2() {
        $this->func1();
    }
}

class class2 {
    function func3() {
        echo "hello!";
    }
}
于 2012-09-30T16:39:23.523 に答える
0

2つのこと:

関数呼び出しに角かっこを追加し、グローバルを使用して変数をスコープに入れます

class class1 {
    function func1() {
        global $class2; // Get variable into scope
        $class2->func3();
    }
    function func2() {
        $this->func1();
    }
}

class class2 {
    function func3() {
        echo "hello!";
    }
}


$class1 = new class1();
$class2 = new class2();

$class1->func1(); // Add brackets for function call
于 2012-09-30T16:41:02.140 に答える