关于oop:PHP保护的类和属性,受到谁的保护?

PHP protected classes and properties, protected from whom?

我刚开始使用面向对象的PHP解决方案的oop-php,作者是DavidPowers,我对oop中的保护概念有点好奇。

作者清楚地解释了保护是如何工作的,但是关于不希望别人能够改变属性的那一点却有些平淡。我很难想象在这种情况下,有可能阻止其他人改变你的类,因为他们可以打开你的class.php,然后手动调整他们喜欢的任何东西,就像php总是以纯文本的方式一样。

注意:以上所有内容都是初学者写的,初学者对编程有一定的了解。


从你自己!

使用不同级别的保护来指示如何使用类。如果类成员是protectedprivate,则只能由类本身访问。您不可能从"外部"代码(类外的代码)中意外地破坏该成员的值。

假设您有一个只应该包含数字的类成员。将其设置为protected并添加一个setter,检查其值是否只能为数字:

1
2
3
4
5
6
7
8
9
10
11
class Foo {

    protected $num = 0;

    public function setNum($num) {
        if (!is_int($num)) {
            throw new Exception('Not a number!!!');
        }
        $this->num = $num;
    }
}

现在您可以确定,当您想使用Foo::$num时,它总是包含一个数字。只要您想使用它,就可以跳过许多额外的错误检查代码。每当你试图给它分配一个数字以外的任何东西时,都会收到一个非常大的错误消息,这使得很容易找到错误。

这是你为减轻自己的工作而对自己施加的限制。因为程序员会犯错。特别是像php这样的动态类型语言,让您在不注意的情况下,悄悄地犯下许多错误,这些错误后来变得非常难以调试,非常严重。

由于其本质,软件非常软,很容易退化成一个不可维护的rube goldberg逻辑机。oop、封装、可见性修饰符、类型提示等是php为您提供的工具,它可以让您的代码"更难",表达您想要代码的某些部分的意图,并使php为您强制实现这一意图。


protected并不是真正防止任何人更改源代码,而是在php oop中的类方法可见性。

Class members declared public can be accessed everywhere. Members declared protected can be accessed only within the class itself and by inherited and parent classes. Members declared as private may only be accessed by the class that defines the member.


它们意味着它们以不同的方式受到保护…

  • 私有变量在类内之外的任何地方都不可见。
  • 受保护变量对实例化的对象不可见,但对从该类继承的类以及类本身可见。

没有什么能阻止另一个程序员打开一个类文件并更改访问修饰符。

隐藏数据是一件好事,因为暴露的越少,控制的越多,潜在的错误就越少。