После реструктуризации всего моего макета класса у меня все еще возникают проблемы с использованием нескольких экземпляров класса.
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
но я просто не могу обернуть голову вокруг создания целого нового объекта и повторно инициировать все, чтобы получить имя пользователя.
Внесите свой экземпляр 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();
Это не имеет каких-либо неоправданных эффектов в отношении эффективности, поскольку экземпляр передается по ссылке, а не копируется.
Класс 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