为什么成员变量通常是私有的?

时间:2011-07-28 21:02:20

标签: php oop

我刚开始学习面向对象编程,只是通过观察发现,在所有示例中,成员变量都是私有的。通常情况如何?

// Class
class Building {
    // Object variables/properties
    private $number_of_floors = 5; // These buildings have 5 floors
    private $color;

    // Class constructor
    public function __construct($paint) {
        $this->color = $paint;
    }

    public function describe() {
        printf('This building has %d floors. It is %s in color.', 
            $this->number_of_floors, 
            $this->color
        );
    }
}

另外,如果你声明成员变量是公共的,那么在声明它的类之外访问它的语法是什么?

最后,你是否必须在类中的每个变量和函数前加上“public”或“private”?

编辑:感谢所有人的回答,有人可以确认你是否必须在班级内的每个变量和功能中加上“公共”或“私人”吗?

谢谢!

7 个答案:

答案 0 :(得分:3)

经验法则是尽可能地隐藏信息,只在绝对必要时才分享。

  • 俄罗斯程序员有时会在不必要的广泛访问修饰语中说出 Public Morozov ,暗指有关不当信息披露的故事以及由此引起的进一步惩罚 - Pavlik Morozov

      一名13岁的男孩向当局谴责他的父亲,并被他的家人杀害......

  •   

答案 1 :(得分:2)

无法从外部访问私有变量,这使您可以控制。

但如果你把它们公开,那么你就可以访问它了

$your_object_instance->Your_variable

例如

$building = new Building();
echo $building->number_of_floors;

但您必须将number_of_floors变量设置为public,如果要访问私有成员,则需要在Building类中实现新方法

public function getNumberOfFloors()
{
  return $this->number_of_floors;
}

所以你的代码应该是这样的

$building = new Building();
echo $building->getNumberofFloors();

答案 2 :(得分:1)

这样可以让您更轻松地编码,并减少犯错的可能性。这个想法是只有类可以访问它的私有变量,所以代码中其他地方的其他类都不会通过以意想不到的方式更改私有变量来干扰和混乱。编写这样的代码,通过少量严格控制的公共方法交互一堆自治类,似乎是一种更简单的编码方式。大项目更容易理解,因为它们被分解成一口大小的块。

答案 3 :(得分:0)

使变量保持私有状态会根据类的实现细节调用代码,这样您就可以在不中断调用代码的情况下更改实现。

您可以在同一行声明多个变量,只使用privatepublic一次:

private $number_of_floors = 5, $color;

另请参阅PHP文档“Classes and Objects”。

答案 4 :(得分:0)

Senad的回答是正确的,因为编写变量是一种很好的编程习惯,你不希望外部方法访问私有。

但是,内存管理/垃圾收集语言的原因在于,当您维护对象的引用时,它无法进行垃圾回收,并且可能导致内存泄漏。

希望这有帮助!

答案 5 :(得分:0)

我真的不知道如何回答这个问题,但我根据php手册描述你最好的

  

可以通过为前缀添加前缀来定义属性或方法的可见性   声明与关键字public,protected或private。类   公开的成员可以随处访问。成员宣布   protected只能在类本身内部访问   继承和父类。被宣布为私人的成员可能只是   由定义成员的类访问。

财产可见性

  

必须将类属性定义为public,private或protected。如果   使用var声明,该属性将被定义为public。

Methods declared without any explicit visibility keyword are defined as public.

有关详细信息,请参阅Visibility

答案 6 :(得分:0)

防止属性从外部直接操作,并可能使对象处于不一致状态。

OOP的基本原理之一是对象应该负责维护自己的状态并使其内部保持一致,例如,不允许将仅用于保持正整数的属性设置为-343.239或确保内部数组结构正确。这样做的确定方法是不能直接从外部设置属性值。通过将属性设为私有,您可以防止外部代码直接操作它,强制它通过您为该作业编写的setter方法。此setter可以检查建议的更改是否会将对象置于不一致状态并防止任何更改。

针对初学者的大多数书籍和示例倾向于使用非常简单的对象,因此可能无法理解为什么需要通过所有私有属性以及getter和setter,而且随着对象的复杂性增加,好处变得越来越明显。不幸的是,复杂的物体作为初学者的教具也不是很好,所以这一点很容易丢失。