__get在日常生活编程中的适当用例


Appropriate use case of __get in daily life programming

我正处于OOP和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];
}