2

クラスレイアウト全体を再構築した後でも、複数のクラスインスタンスを使用するのに問題があります。

class User {
    public $variable;
    public function getUser() {
        $this->variable = 'It works!';
        return 'bob';
    }
}

class Base {}
class One extends Base {
    public function test() {
        print_r($User->variable); // Want it to print 'It works!'
    }
}

$User = new User();
$username = $User->getUser();
if($username === 'bob') {
    $One = new One();
    $One->test(); // prints "Notice: Undefined property: One::$variable
}

上記のコードの機能:クラスUserはユーザー名を取得します。ユーザー名がbob、の場合、オブジェクトが作成oneされ、クラスから変数が出力されますUser。私の実際のコードでUserは、非常に複雑で、たくさんのものを渡すこと__constructは私が探しているものではありません。

解決策(この質問にそのようにタイトルを付けた理由User)は、クラス内に新しいクラスを作成することBaseだと思いますが、まったく新しいオブジェクトを作成し、取得するためだけにすべてを再開始する必要があることに頭を悩ませることはできません。ユーザー名。

4

2 に答える 2

3

Userインスタンスを注入します。

class One {
    private $user;
    public function __construct(User $user) {
        $this->user = $user;
    }
    public function test() {
        print_r($this->user->variable);
    }
}

$User = new User();
$One = new One($user);
$One->test();

インスタンスはコピーではなく参照によって渡されるため、これは効率に関して過度の影響はありません。

于 2012-10-21T01:35:49.043 に答える
1

クラスは変数をOne認識していない$Userため、アクセスできません。

コンストラクターで変数をクラスに渡すか、クラスのオブジェクトの作成後に設定することができます。

class One extends Base {
    protected $user;
    public function setUser(User $user) {
        $this->user = $user;
    }
    public function One(User $user) {
        $this->setUser($user);
    }
    public function test() {
        print_r($this->user->variable);
    }
}

または(ただし、しないでください、これは悪い習慣です)$User変数をグローバルに設定します。

global $User
于 2012-10-21T01:34:06.510 に答える