PHP保护类和属性,保护对象是谁?

PHP保护类和属性,保护对象是谁?,php,oop,protected,Php,Oop,Protected,我刚刚开始使用David Powers的OOP PHP和PHP面向对象解决方案,我对OOP中的保护概念有点好奇 作者清楚地解释了保护是如何起作用的,但是关于不希望其他人能够改变财产的说法有点平淡。我很难想象这样一种情况,即有可能阻止其他人更改您的类,因为他们可以打开您的class.php,手动调整任何他们喜欢的内容,因为php始终是纯文本的 注意:以上所有内容都是由对编程有初学者理解的初学者编写的。受保护并不是真正防止任何人更改源代码,只是一种保护 声明为公共的类成员可以在任何地方访问。声明为受

我刚刚开始使用David Powers的OOP PHP和PHP面向对象解决方案,我对OOP中的保护概念有点好奇

作者清楚地解释了保护是如何起作用的,但是关于不希望其他人能够改变财产的说法有点平淡。我很难想象这样一种情况,即有可能阻止其他人更改您的类,因为他们可以打开您的
class.php
,手动调整任何他们喜欢的内容,因为php始终是纯文本的


注意:以上所有内容都是由对编程有初学者理解的初学者编写的。

受保护并不是真正防止任何人更改源代码,只是一种保护

声明为公共的类成员可以在任何地方访问。声明为受保护的成员只能在类本身内以及由继承类和父类访问。声明为私有的成员只能由定义该成员的类访问


他们的意思是他们受到不同的保护

  • 私有变量对除类内之外的任何地方都不可见
  • 受保护变量对实例化对象不可见,但对从该类继承的类以及类本身可见
没有什么能阻止其他程序员打开类文件并更改访问修饰符

隐藏数据是一件好事,因为你暴露的越少,你就可以控制的越多,潜在引入的bug也就越少。

您可以使用不同级别的保护来指示如何使用类。如果类成员受
保护
私有
,则它只能由类本身访问。您不可能从“外部”代码(类外的代码)中意外地修改该成员的值

假设你有一个只应该包含数字的类成员。将其设置为受保护的,并添加一个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能够为您强制执行此意图。

“您可以控制的越多”。。。来自你自己和/或同事?@安德鲁·希思。如果您有一个名为
$data
的类属性,不应直接访问该属性,请将其设置为
private
。然后,您可以使用方法返回它(并执行任何必要的预处理)。除了“保护”之外,它也是隐式文档。阅读代码的人知道,
private
方法只在类内部使用<代码>受保护的方法可以由子类调用。和
public
方法是用来与对象交互的方法。你在前3句话中总结了博客和文档站点在3段中所做的事情。谢谢你这么简洁。