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
Php 为什么我不能只使用公共财产而不被看不起_Php_Oop_Design Patterns - Fatal编程技术网

Php 为什么我不能只使用公共财产而不被看不起

Php 为什么我不能只使用公共财产而不被看不起,php,oop,design-patterns,Php,Oop,Design Patterns,我看到(并编写)很多这样的代码: class MyClass { private $_myProperty; public function setMyPropert($myProperty) { $this->_myProperty = $myProperty; } public function getMyProperty() { return $this->_myProperty;

我看到(并编写)很多这样的代码:

class MyClass
{
    private $_myProperty;

    public function setMyPropert($myProperty)
    {
         $this->_myProperty = $myProperty;
    }

    public function getMyProperty()
    {
         return $this->_myProperty;
    }
}
因为我们被教导,类属性应该始终是私有的

但是,我真的只想在上述场景中这样做:

class MyClass
{
    public $myProperty;
}
这样代码更少,更容易阅读。但其他开发人员会看不起这段代码,而且很可能会导致代码审查失败等。即使没有,我也不会这样做,因为我害怕其他人看到它并做出判断

为什么呢?这是oop代码开发人员根深蒂固的东西吗?或者我还缺少其他原因,可能与测试、未来维护或其他不明显的技术原因有关。我特别是在一个场景中讨论,getter/setter除了get/set之外没有做更多的事情。

如果您在getter和setter中什么都不做,那么是的,您也可以将属性公开。但setter通常用于检查值以确保其有效:

public function setFoo($foo) {
    if (!is_string($foo)) {
        throw new InvalidArgumentException('No you foo-l!');
    }
    $this->foo = $foo;
}
这样做是一个好主意,以确保类的完整性,这就是封装的目的。即使你现在不做这个检查,在你修复了第三个由于设置无效值而导致的错误后,你可能会在将来添加它。如果您突然开始切换到方法调用而不是属性分配,那么您将很难更新所有设置属性的代码


最好尽早从实际封装开始。

这实际上归结为:

软件实体(类、模块、函数等)应开放以进行扩展,但应关闭以进行修改

在这种情况下,原则意味着默认情况下类的成员应该是私有的

在某些情况下,您可以只声明一个公共成员。你可以,但你不应该照例这样做。这在一定程度上只是为了避免坏习惯——将一个类的所有成员都暴露给每个人都是草率的


这也是一个表明你意图的问题:如果有人看到一个公众成员,他们会怎么想?无法立即知道作者是否打算让该成员公开,或者他们是否真的不知道自己在做什么。

好问题。简单但复杂的回答,特别是对PHP的关注。请继续问。对于这个问题,我没有时间回答,但我强烈感觉这取决于对象的类型(值、助手、运算符、对象/不可变或不可变)。拥有getter和setter通常可以防止您做出错误的决策,因此将属于某个对象(例如“属性”)的内容保持为私有并没有太大的偏差,并使您的代码在PHP中以某种方式成为未来的证明。