为什么人们在宣布课程时经常省略公共/私人/受保护?

时间:2011-05-03 16:55:54

标签: php oop class

我一直在最近的代码中看到这种格式,甚至在这里:

class Class {
    function this() {}
}

而不是

class Class {
    [public/private/protected] function this() {}
}
  1. 不建议永远 指定功能范围?
  2. 第一种方法不是旧方法吗?
  3. 在第一种方法中,如何 定义私有和受保护 功能?

6 个答案:

答案 0 :(得分:9)

当你声明一个没有任何默认公开的关键字的函数时。

  

不建议始终指定   功能范围?

如果要将它们用作私有或受保护,则必须定义函数范围。

  

第一种方法不是旧方法吗?

如果它们仍被PHP接受,那么旧的和新的是什么。

  

在第一种方法中,如何   定义私有和受保护   功能

你不能用第一种方法来使用关键词。

答案 1 :(得分:3)

  1. 是的,可能。
  2. 很难量化一种技术的新旧方式。在过去,当PHP中的类相对较新时,它可能不太推荐。
  3. "Class methods may be defined as public, private, or protected. Methods declared without any explicit visibility keyword are defined as public."

答案 2 :(得分:2)

PSR-2编码标准明确要求可见性修饰符同时用于propertiesmethods

不需要使用public,因为PHP 5和7向后兼容版本4,版本4只能公开查看所有内容,因此它是默认设置。

但是,省略它会引发问题 - 就像你做的那样。人类非常擅长检测模式中的模式和错误。您如何看待在任何地方使用protectedprivate的代码(因为您必须),但随机省略public。这是一个错误吗?这是故意做的吗?应该触发什么样的秘密行为?或者这仍然是PHP4代码隐藏了一些讨厌的兼容性问题?作为开发人员,您不想提出这些问题,并且您不希望必须找到答案。

public是可选的,但PSR-2决定要求它。遵循标准建议。

另请注意,属性已a proposal to deprecate and remove the var modifier,并完全将其替换为public。该提案还列出了Packagist上排名前10位的软件包的代码分析,指出此代码库中94%的所有类仅使用public,其余6%的类使用var来自四个更大的软件包,很可能仍然试图兼容PHP4," Simpletest" (针对PHP 4的单元测试框架)处于领先地位。

对于我所知道的方法,可见性修饰符没有这样的静态代码分析,但趋势清晰可见:摆脱旧的PHP4-isms。

答案 3 :(得分:1)

  1. 是的。始终建议指定功能/属性可见性。
  2. 是的。没有可见性修饰符的版本一直存在到PHP4。使用PHP5可见性修饰符已被引入。由于旧版代码的向后兼容性,不接受可见性修饰符的版本仍被接受并视为有public可见性修饰符。
  3. PHP4对可见性一无所知,因此您无法使用此visibility-modifier-less语法定义privateprotected成员。

答案 4 :(得分:0)

PHP诞生时是一种(懒惰的,duck typed)脚本语言,人们仍然以这种方式使用它。大多数PHP程序员都不知道OOP是什么,我非常清楚这个问题,因为我从PHP开始,这确实花了我很多工作。你看到的大约90%的PHP代码在面向对象,可读性,封装等方面都是凌乱和过时的......至少有50%是纯粹的垃圾。 :(

我不能告诉你,当发现“依赖注入”实际上被PHP开发人员视为一种创新设计模式时,有多少OOP程序员会感到惊讶,并且需要对其进行解释。

但是,PHP4没有范围运营商如私有或受保护。那时,您曾经声明一个方法在方法名称前加上一个或多个下划线,以表明它不是要从外部类调用。

  1. 是推荐
  2. 是的,从OOP的角度来看
  3. 希望客户必须理解的命名约定

答案 5 :(得分:0)

最重要的PHP4兼容性和亲和力。

一些开发人员(像我一样)省略了辅助功能修饰符,因为它们对脚本语言几乎没有影响。 Python或Javascript等真正的OOP语言没有privateprotected属性,也不需要它。在PHP中它有点不同,但 总是 应用那个语法糖是没有意义的。我个人会将其保留用于有用的应用程序。

许多PHP编码器都不知道“封装”的最初目的,因为它不适用于逻辑可见性之外的未编译代码。它实际上在PHP中增加了一点脆弱性,因为它在运行时而不是编译时(例如在C ++中)引发错误。
而且我再也不能拒绝这样说了:很多程序员也只是将它作为cargo cult programming idiom应用来模拟类似Java的语法(以弥补PHP感知/过去缺少OOP结构)。