Я нахожусь в стадии изучения ООП и PHP. Ниже описано, как я реализовал метод __get. Он работает нормально, но я не понимаю, зачем его использовать. Так как в моем примере я намеренно установил свойство защищенного, чтобы я не мог получить доступ через внешний класс. Тогда какова цель __get тогда?
class Magic {
protected $name = 'John';
public $age = 26;
public $new_name;
public function __get($key){
$this->new_name = $key;
}
public function get_new_name(){
return $this->new_name. " is my friend";
}
}
$person = new Magic();
$person->Alan;
echo $person->get_new_name();
Нет никакой уважительной причины, по которой я бы подумал, что вы будете использовать __get()
с защищенной строкой полезны защищенные массивы, но не строки. Приведенный вами пример работает, но он не будет лучшим кодом для понимания другими людьми или для использования с IDE (редакторами кода).
Поскольку вы, похоже, не понимаете, о чем я говорил, вот пример быстрого сценария базы данных.
Допустим, вы хотите вставить строку в базу данных, используя ORM-подобный класс. Вы бы сделали что-то вроде:
Class Person {
protected $fields = array();
public function setField($name, $value) {
$this->fields[$name] = $value;
}
public function getField($name) {
return $this->fields[$name];
}
public function save() {
Database::insert($table, $fields); // Generic function to insert the row, don't worry about this.
}
}
Теперь в этом случае вы можете сделать:
$person = new Person();
$person->setField('name', 'Bob');
$person->setField('age', '30');
$person->save();
echo $person->getField('name'); // Echoes Bob
Теперь, чтобы изменить это, мы могли бы использовать перегрузку с __set()
вместо setField()
а также __get()
вместо getField()
:
Class Person {
protected $fields = array();
public function __set($name, $value) {
$this->fields[$name] = $value;
}
public function __get($name) {
return $this->fields[$name];
}
public function save() {
Database::insert($table, $fields);
}
}
Теперь в этом случае вы можете сделать:
$person = new Person();
$person->name = 'Bob';
$person->age = '30';
$person->save();
echo $person->name; // Echoes Bob
Надеюсь, это даст вам простой пример того, как может работать перегрузка. Мы не хотим объявлять свойства $name
а также $age
потому что мы хотим использовать эти свойства для создания $fields
массив, который позже используется во вставке.
Например, вы можете использовать метод __get для получения значения массива. В этом случае вы можете иметь динамический номер переменной класса.
public function __get($key){
return $this->property[$key];
}