PHP通过类传递对象?

时间:2012-10-21 01:31:08

标签: php

重构我的整个类布局后,我仍然无法使用多个类实例。

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,但我不能我不得不创建一个全新的对象并重新启动所有内容以获取用户名。

2 个答案:

答案 0 :(得分: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();

这对效率没有任何不当影响,因为实例是通过引用传递而不是复制。

答案 1 :(得分: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