2017-02-13 3 views
1

Если я хочу получить доступ к общедоступному методу, я могу сделать это легко. Но если я хочу получить доступ к свойству внутри метода, что мне делать, и он рекомендуется?Метод класса php в методе

Могу ли я сделать что-то подобное в 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; 

Только так вы знаете, люди, его можно вот Zend framework код из

Zend-Authentication

if ($result->isValid()) { 
      $this->getStorage()->write($result->getIdentity()); 
     } 
+3

опечатка '$ это-проект = 1;' должен быть '$ this-> проект = 1;' – Moak

ответ

0

Вам нужно будет добавить его в качестве переменной класса:

class Auth { 
    public $project = false; 

    public function check($user = false) { 
    if($user == 'user1'){ 
     $this->project = 1; 
    } 
    } 
} 

Свойство затем доступен в следующем:

$auth = new Auth(); 
$auth->check ('user1'); 
echo $auth->project; // 1 
+0

Проверьте код, выполнив его .Это броски ошибка –

+0

ERM, нет, это не ... – Philip

+0

Попытка получить свойство не-объекта –

0
<?php 
class Auth 
{ 
    public $project; 
    public function check($user = false) 
    { 
     $this->project = false;//make it somehow public 
     if ($user == 'user1') { 
      $this->project = 1; 
     } 
     return $this; 
    } 
} 

$auth = new Auth(); 
var_dump($auth->check('user1')->project); 

Это вернет вас 1. локальные переменные, определенные в функции являются только accessbile внутри функции не снаружи, поэтому вам необходимо определить их глобально

+0

$ auth-> проект; работает, но $ auth-> check() -> project; не дает ошибку –

+0

Зачем это делать? –

+0

потому что $ project является свойством класса not function –

0

$project - локальная переменная в вашем случае, видимая в пределах области o f check метод. Вы можете определить его в качестве члена:

class Auth { 
    public $project = false; 
    public function check($user = false){ 
    if($user == 'user1'){ 
     $this-project = 1; 
    } 
    } 
} 

Тем не менее, рекомендуется, чтобы член public и достичь его через геттер, который будет проверять, был ли он инициализирован, и если нет, то инициализировать его:

class Auth { 
    private $project = false; 
    public getProject($user = false) { 
     if ($this->project === false) { 
      check($user); 
     } 
     return $this->project; 
    } 
    public function check($user = false){ 
    if($user == 'user1'){ 
     $this-project = 1; 
    } 
    } 
} 
1

Если вы не хотите создавать дополнительные свойства класса и «сохранять цепочку методов», а как насчет yield?

class Auth 
{ 
    public function check($user = false) 
    { 
     $project = false; // make it somehow public 

     if($user === 'user1'){ 
      (yield 'project' => $project); // making it public 
     } 

     return $this; 
    } 
} 

Позже вы можете открыть его следующим образом:

$array = iterator_to_array($auth->check($user)); 
// array(1) { ["project"] => bool(false) } 

Но для этого использовать вы не сможете использовать метод формирования цепочки, клюв. вам все равно нужно получить генератор, поэтому лучше пересмотреть подход для обнаружения $project.

3
class Auth 
{ 
    protected $project; 

    public function __constructor($project = false) 
    { 
     $this->project = $project; 
    } 

    public function check($user = false) 
    { 
    if($user == 'user1') 
    { 
     $this->project = 1; 
    } 

     return $this; 
    } 

    public function project() 
    { 
     return $this->project; 
    } 
} 

, то вы можете сделать следующее:

$auth = new Auth(); 
$auth->check('user1')->project(); // returns 1 

или если вы хотите, вы можете также установить значение другого по умолчанию для $project в конструкторе

$auth = new Auth($other_default_value); 
$auth->check('user2')->project(); // returns $other_default_value 
3

Я считаю, что ваш вопрос в основном в отношении 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() для беглости.

Я надеюсь, что это поможет придать определенную ясность.

+0

Ответ был очень ясным и полезным, спасибо –

+0

Wow ... хорошая работа @bubba! –

Смежные вопросы