如果我有一个具有属性$ name的类"person"及其getter(get_name())和setter(set_name())方法,那么在实例化对象并设置属性之后,
$paddy = new person();
$paddy->set_name("Padyster Dave");
echo "Paddy's full name: ".$paddy->name; //WHY THIS IS NOT RECOMMENDED...
Run Code Online (Sandbox Code Playgroud)
在上面的代码中$paddy->name;为什么不推荐
编辑
上面的代码是一个示例代码,没有分配任何访问者..它只是为了理解$ paddy-> name概念
奇怪的是,你有一个二传手,但是要离开这个房产public.(假设没有__get魔法发生.)
您通常希望使用getter/setter来更好地控制可以分配给属性的内容以及不能分配给属性的内容.或者,您可能希望在访问或更改属性时执行代码.在这两种情况下,你应该强制使用getter/setter方法的通过使财产private或者protected,否则是很没有意义的.这是为了防止自己或其他人使用这个班级自己拍脚.
如果您的示例中的setter仅设置值而不执行任何其他操作,则它是多余的.如果它确实在设置值时执行了其他操作,那么您的类设计就会有一个缺陷,因为可以在不使用setter的情况下更改值.
class Foo {
public $bar = 0; // is only allowed to contain numeric values
public function setBar($val) {
if (is_numeric($val)) {
$this->bar = $val;
}
}
}
$obj = new Foo();
$obj->bar = 'some value'; // set a string, which is not allowed
Run Code Online (Sandbox Code Playgroud)
如果你做$bar protected,那是不可能的.
因为有一天你可能会摆脱$name成员,用(例如)替换它$first_name,$last_name以及一种fullname()方法(不是那个好主意).当然,有__get和__set,它并不重要.
更一般地说,设置属性可能不像存储值那么简单.直接访问成员字段可能导致其他函数导致对象处于不一致状态.想象一下,你存储了一个需要保持排序的数组; 如果数组是公共的,那么其他东西可以为该字段分配一个未排序的数组.
| 归档时间: |
|
| 查看次数: |
778 次 |
| 最近记录: |