Подходящий вариант использования __get в программировании повседневной жизни

Я нахожусь в стадии изучения ООП и 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();

0

Решение

Нет никакой уважительной причины, по которой я бы подумал, что вы будете использовать __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 массив, который позже используется во вставке.

1

Другие решения

Например, вы можете использовать метод __get для получения значения массива. В этом случае вы можете иметь динамический номер переменной класса.

public function __get($key){
return $this->property[$key];
}
1

По вопросам рекламы [email protected]