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

Posted

技术标签:

【中文标题】PHP 受保护的类和属性,受谁保护?【英文标题】:PHP protected classes and properties, protected from whom? 【发布时间】:2011-06-06 07:25:05 【问题描述】:

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

作者清楚地解释了保护的工作原理,但是关于不希望其他人能够更改属性的内容有点平淡。我很难想象有可能阻止其他人更改您的课程的情况,因为他们可以打开您的class.php 并手动调整他们喜欢看到的任何内容,因为 PHP 始终是纯文本的。

注意:以上都是初学者写的,对编程有初学者的理解。

【问题讨论】:

除了“保护”之外,它也是隐含的文档。阅读您的代码的人知道private 方法仅在类内部使用。 protected 方法可以被子类调用。 public 方法是用于与对象交互的方法。 【参考方案1】:

来自你自己!

您使用不同级别的保护来表明您希望如何使用一个类。如果类成员是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、封装、可见性修饰符、type hinting 等是 PHP 提供的工具,可以让您的代码“更难”,表达您想要某些代码片段的意图,并使 PHP 能够为您强制执行此意图。

【讨论】:

您在前 3 句话中总结了博客和文档网站在 3 段中所做的事情。谢谢你这么简洁。【参考方案2】:

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

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

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

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

【讨论】:

“你可以控制的越多”......来自你自己和/或同事? @Andrew Heath 两者。如果您有一个不应直接访问的名为$data 的类属性,请将其设为private。然后,您可以使用一种方法将其返回(并进行任何必要的预处理)。【参考方案3】:

Protected 并不是真正防止任何人更改源代码,而只是一个class method visibility in PHP OOP

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

【讨论】:

以上是关于PHP 受保护的类和属性,受谁保护?的主要内容,如果未能解决你的问题,请参考以下文章

PHP访问控制

PHP 从静态方法访问对象的受保护属性

Python - 访问类的受保护成员_

php访问控制

从 PHP 中的类外部调用受保护的方法

我可以/如何...在 PHP 中的类之外调用受保护的函数