Я считаю, что ваш вопрос в основном в отношении Fluent Interfaces или метода цепочки в сочетании с магическим методом __get
Попытка запустить это:
<?php
class Auth {
public function check($user = false){
$project = false; //make it somehow public
if($user == 'user1'){
$this->project = 1;
}
}
}
$auth = new Auth();
$auth->check('user1')->project;
Результаты в:
Примечание: Попытка получить имущество не-объект в/в/Hi5Rc на линии 13
потому что $auth->check('user1')
возвращается NULL (или void) и NULL не имеют свойства project
.
Первое, что нам нужно, это сделать для $auth->check('user1')
, чтобы вернуть что-то полезное. Учитывая, что $project
является булевым, а $this->project
является целым числом, имеет смысл только вернуть $project
и получить значение.
<?php
class Auth {
public function check($user = false){
$project = false; //make it somehow public
if($user == 'user1'){
$this->project = 1;
}
return $project;
}
}
$auth = new Auth();
print_r($auth->check('user1'));
что приводит:
BOOL (ложь)
Но это не Ваш вопрос о том, как свободно получить доступ к непубличной поле или параметр.
Похоже, что вы работаете в заблуждении, что эти проекты принимают метод контекстной переменных как $project
в вашем check()
классе и сделать их доступными. Они не.
Даже в вашем примере Zend-Authentication.
Поле $storage
само является защищенным, но имеет общественное мнение (свободно) getters/setters.
Таким образом, $this->getStorage()
возвращает экземпляр new Storage\Session()
, в котором есть write()
.
Таким образом, $this->getStorage()->write()
работ.
Так что давайте рассмотрим ваш пример и немного изменим его, чтобы продемонстрировать.
<?php
class Project{
/**
* @var string
*/
private $name;
/**
* @var bool
*/
private $active;
/**
* @var string
*/
private $description;
public function __construct($name = 'Default', $active = false, $description = '')
{
$this->name = $name;
$this->active = $active;
$this->description = $description;
}
/**
* @param string $name
*
* @return Project
*/
public function setName(string $name): Project
{
$this->name = $name;
return $this;
}
/**
* @param bool $active
*
* @return Project
*/
public function setActive(bool $active): Project
{
$this->active = $active;
return $this;
}
/**
* @param string $description
*
* @return Project
*/
public function setDescription(string $description): Project
{
$this->description = $description;
return $this;
}
/**
* @return string
*/
public function getName(): string
{
return $this->name;
}
/**
* @return bool
*/
public function isActive(): bool
{
return $this->active;
}
/**
* @return string
*/
public function getDescription(): string
{
return $this->description;
}
public function toArray(){
return [
'name' => $this->name,
'active' => $this->active,
'description' => $this->description
];
}
public function toJson(){
return json_encode($this->toArray());
}
public function __toString()
{
return $this->toJson();
}
}
class Auth {
/**
* @var Project
*/
private $project;
public function __construct($project = Null)
{
$this->project = is_null($project)? new Project() : $project;
}
public function check($user = false){
if($user == 'user1'){
$this->project->setName("Project: $user")->setActive(true)->setDescription("This project belongs to $user");
}
return $this;
}
/**
* @param Project $project
*
* @return Auth
*/
public function setProject(Project $project): Auth
{
$this->project = $project;
return $this;
}
/**
* @return Project
*/
public function getProject(): Project
{
return $this->project;
}
}
$auth = new Auth();
echo $auth->check('user1')->getProject();
сейчас это приводит к:
{ "имя": "Проект: user1", "активный": правда, "Описание": "Этот проект принадлежит user1"}
Однако вы хотели получить доступ к частному, как если бы это было общедоступное поле, не используя определенный геттер/сеттер. Поэтому давайте сделаем еще несколько изменений в классе Auth
.
class Auth {
/**
* @var Project[]
*/
private $private_project;
public function __construct($project = Null)
{
$this->private_project = is_null($project)? new Project() : $project;
}
public function check($user = false){
if($user == 'user1'){
$this->private_project->setName("Project: $user")->setActive(true)->setDescription("This project belongs to $user");
}
return $this;
}
public function __get($name)
{
if ($name === 'project'){
return $this->private_project;
}
}
}
Теперь вы можете свободно доступа к полю, как вы просили:
$auth = new Auth();
echo $auth->check('baduser')->project;
echo "\n";
echo $auth->check('user1')->project;
приводит:
{ "имя": "По умолчанию", "активный" ложь» описание ":" "}
{" name ":" Project: user1 "," active ": true," description ":" Этот проект принадлежит пользователю1 "}
Larvel's Eloquent модели отлично используют функцию __get()
для динамического доступа к полям модели. Laravel также отлично использует магический метод __call()
для беглости.
Я надеюсь, что это поможет придать определенную ясность.
опечатка '$ это-проект = 1;' должен быть '$ this-> проект = 1;' – Moak