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