Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在OOPs PHP中不建议直接访问属性?_Php_Oop - Fatal编程技术网

为什么在OOPs PHP中不建议直接访问属性?

为什么在OOPs PHP中不建议直接访问属性?,php,oop,Php,Oop,如果我有一个属性为$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... 在上述代码中$paddy->name为什么不建议这

如果我有一个属性为$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...
在上述代码中
$paddy->name为什么不建议这样做

编辑


上面的代码是一个示例代码,没有分配任何访问器。。只是要理解$paddy->name的概念

奇怪的是,您有一个setter,但却将属性
保留为public
。(假设没有
\u获得
魔法。)

您通常希望使用getter/setter来更好地控制哪些可以分配给属性,哪些不能。或者,您可能希望在访问或更改属性时执行代码。在这两种情况下,您都应该通过使属性
私有
受保护
来强制使用getter/setter,否则就毫无意义了。这是为了防止你自己或其他人在课堂上射杀自己的脚


如果示例中的setter只设置值,而不执行任何其他操作,那么它是多余的。如果在设置值时它确实执行了其他必需的操作,则类设计中存在缺陷,因为不使用setter就可以更改值



如果你想让
$bar
受保护
,那是不可能的。

因为有一天你可能会摆脱
$name
成员,将其替换为(例如,
$first\u name
$last\u name
全名()
方法(不是那种方法)。当然,有了它,就没那么重要了


一般来说,设置属性可能不像存储值那么简单。授予对成员字段的直接访问权限可能会导致其他函数导致对象处于不一致的状态。假设您存储了一个需要保持排序的数组;如果数组是公共的,那么其他东西可能会将未排序的数组分配给该字段。

公开公共字段将是一个坏习惯


如果对象发生任何更改,则使用该对象的任何代码也需要更改。例如,如果某人的姓名、家庭和其他姓名要封装在PersonName对象中,则需要修改所有代码以适应更改。

显然我也在做“坏事”,因为我一直在使用这种代码

但是如果$this->name(或者像我所做的那样$this->nameFormatted)的构造如下:

protected var $name;
$this->name = $this->getSalutation() . ' ' . $this->nameFirst . ' ' . $this->nameLast;
或者类似的东西

您在公共上下文中使用$this->name out,但它仍然在类中构造,如果它受到保护,则不会被覆盖


或者我没有抓住要点,而“坏”的事情实际上是在公共作用域中设置名称?

“如果它在设置值时做了其他需要做的事情,那么您的类设计中有一个缺陷,因为不使用setter就可以更改值。”您能详细说明一下吗?plss@Parth如果您执行
protected$bar=0
$obj->bar
是不允许的,并将抛出警告。阅读以下内容:这里有一个流行语:信息隐藏和你所要求的通常适用于OOP,而不仅仅是PHP。我使用了PHP的语法,并将问题标记到PHP部分,这就是为什么添加关键字PHP,我知道这一事实对许多人来说都是通用的..谢谢
protected var $name;
$this->name = $this->getSalutation() . ' ' . $this->nameFirst . ' ' . $this->nameLast;