PHP受保护的类和属性,受谁保护?

8
我刚开始学习面向对象编程的PHP并使用了David Powers的PHP Object-Oriented Solutions,对OOP中保护的概念有些好奇。
作者清楚地解释了保护机制的工作原理,但是关于不想让别人更改属性的那部分内容显得有些薄弱。我很难想象什么情况下能够防止其他人更改你的类,因为他们可以打开你的class.php并手动调整任何他们想要的东西,毕竟PHP总是以纯文本形式存在。
注意:以上内容均为一个初学者对编程的初步理解写成。

3
除了"保护性质"外,它也具有隐含的文档功能。读者通过代码可以知道private方法只在类内部使用,protected方法可以被子类调用,而public方法是与对象进行交互所必须使用的方法。 - Felix Kling
3个回答

17

来自你自己!

你可以使用不同级别的保护来指示你希望如何使用类。如果一个类成员是protectedprivate,那么它只能由类本身访问。没有机会从“外部”代码(类之外的代码)意外地弄乱该成员的值。

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

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强制执行此意图。

你在前三句话中总结了博客和文档网站在三段落中所做的事情。感谢你如此简洁明了。 - MeltingDog

6

Protected并不能真正保护源代码免受更改,而只是PHP OOP中的类方法可见性

声明为public的类成员可以在任何地方访问。声明为protected的成员只能在类本身以及继承和父类中访问。声明为private的成员只能被定义成员的类访问。


2

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

  • 私有变量只能在类内部看到,对外不可见。
  • 受保护的变量对于实例化的对象来说是不可见的,但对于继承自该类的类以及该类本身是可见的。

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

隐藏数据是一件好事,因为你暴露得越少,你就能控制得越多,可能引入的错误也就越少。


你能够控制自己和/或同事的越多,就越好。 - Drew
@Andrew Heath 两种都可以。如果你有一个叫做 $data 的类属性,不应该直接访问它,那么就将其设为 private。然后,你可以使用一个方法来返回它(并进行任何必要的预处理)。 - alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接