2013-09-25 2 views
2

Существует тысячи примеров php __get и __set, к сожалению, никто на самом деле не говорит вам, как их использовать.Использование родовых геттеров и сеттеров с php

Итак, мой вопрос: как я на самом деле вызываю метод __get и __set из класса и при использовании объекта.

Пример кода:

class User{ 
public $id, $usename, $password; 

public function __construct($id, $username) { 
     //SET AND GET USERNAME 
} 

public function __get($property) { 
    if (property_exists($this, $property)) { 
     return $this->$property; 
    } 
} 

public function __set($property, $value) { 
    if (property_exists($this, $property)) { 
     $this->$property = $value; 
    } 

    return $this; 
} 
} 

$user = new User(1, 'Bastest'); 
// echo GET THE VALUE; 

Как бы я установить значения в конструкторе, и как бы я получить значение в // echo GET THE VALUE;

+1

Я не уверен, что вы читали, но предлагаю вам прочитать [официальная страница руководства] (HTTP: // www.php.net/manual/en/language.oop5.overloading.php#object.get) - поскольку, очевидно, вы не понимаете, для каких целей нужны '__set()' и '__get()'. –

+0

в вашем сеттере, $ this -> $ property = $ value; должно быть $ this -> $ property = $ value [0]; –

ответ

6

Эта функция называется в PHP overloading. Поскольку documentation указывает, будут вызваны методы __get или __set, если вы пытаетесь получить доступ к несуществующим или не доступным свойствам. Проблема в вашем коде заключается в том, что свойства, к которым вы обращаетесь, являются доступными и доступными. Вот почему __get/__set не будет вызван.

Проверить этот пример:

class Test { 

    protected $foo; 

    public $data; 

    public function __get($property) { 
     var_dump(__METHOD__); 
     if (property_exists($this, $property)) { 
      return $this->$property; 
     } 
    } 

    public function __set($property, $value) { 
     var_dump(__METHOD__); 
     if (property_exists($this, $property)) { 
      $this->$property = $value; 
     } 
    } 
} 

Код испытания:

$a = new Test(); 

// property 'name' does not exists 
$a->name = 'test'; // will trigger __set 
$n = $a->name; // will trigger __get 

// property 'foo' is protected - meaning not accessible 
$a->foo = 'bar'; // will trigger __set 
$a = $a->foo; // will trigger __get 

// property 'data' is public 
$a->data = '123'; // will not trigger __set 
$d = $a->data; // will not trigger __get 
+0

Спасибо, я подумал, что это было так и пробовал. Конечно, проблема заключалась в том, что публичные переменные в моем примере должны быть закрытыми, включая это в вашем ответе, и я соглашусь с ним. – inControl

+1

Обновили: – hek2mgl

+1

@ inControl Вы также можете явно вызвать '$ this -> __ set()' или этот '$ this -> __ get()'. Это интересно, если вы получаете доступ к защищенным свойствам внутри класса – hek2mgl

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