【问题标题】:Default visibility of class methods in PHPPHP 中类方法的默认可见性
【发布时间】:2011-01-14 12:39:06
【问题描述】:

我查看了manual,但似乎找不到答案。

没有可见性声明的方法在 PHP 中的默认可见性是什么? PHP 是否像 Java 一样具有包可见性?

比如下面的代码中,go()是public还是private?

class test {
  function go() {
  }
}

我问的原因是我看到很多构造函数代码写成function __construct(),有些写成public function __construct()。它们是等价的吗?

【问题讨论】:

  • 2021 年 DOCS:Class properties must be defined as public, private, or protected. If declared using var, the property will be defined as public.

标签: php oop visibility


【解决方案1】:

默认是公开的。

类方法可以定义为公共的、私有的或受保护的。没有任何显式可见性关键字声明的方法被定义为 public。

http://www.php.net/manual/en/language.oop5.visibility.php

【讨论】:

  • 属性也是如此
  • 常量也是如此。
  • 这随着时间的推移而改变,现在是“必须”而不是“可能”。此外,通常你不需要公共属性,而且很多时候这是一种代码味道。
【解决方案2】:

默认为公开。始终包含它是一个好习惯,但是 PHP4 支持没有访问修饰符的类,因此在遗留代码中通常不会使用它们。

不,PHP 没有包可见性,主要是因为直到最近 PHP 还没有包。

【讨论】:

  • @Ian:我会说因为“显式优于隐式”(正如Zen of python 所说)。它会导致其他程序员浪费脑力,想知道构造函数是私有的还是公有的,或者是什么。如果人们总是使用访问修饰符,那么原始发帖人甚至可能都没有问过这个问题。
  • 另外值得注意的是,在 Java 等语言上,默认是包私有的,人们总是想知道它是否是包私有的设计,或者开发人员只是忘记指定它(特别是在处理不那么高级的开发人员)。这就是 PMD 包含以下规则的原因:pmd.github.io/pmd-5.5.2/pmd-java/rules/java/…
  • @User 因此 Python 将所有内容都公开并用它做任何你想做的事情 x)
【解决方案3】:

默认为公开。原因可能是向后兼容性,因为旧代码希望它是公开的(如果不公开,它将停止工作)。

【讨论】:

  • 感谢推理。
【解决方案4】:

默认可见性为公开

Source

【讨论】:

    【解决方案5】:

    当没有使用visibility 关键字(publicprivateprotected)时,方法将是public。但是,您不能以这种方式定义属性。对于properties,您需要在声明中附加一个可见性关键字。

    对于未在类中声明的属性,并且您在方法中为其分配值将具有公共可见性。

    <?php
    class Example {
        public $name; 
        public function __construct() {
            $this -> age = 9; // age is now public
            $this -> privateFunction();
        }
        private function privateFunction() {
            $this -> country = "USA"; // this is also public
        }
    }
    

    【讨论】:

      【解决方案6】:

      function __construct()public function __construct() 使用相同的方法名。

      如果您无法为方法名称定义前缀,则默认情况下应为 public。

      【讨论】:

        猜你喜欢
        • 2016-11-22
        • 2018-05-19
        • 2011-04-15
        • 2012-09-25
        • 1970-01-01
        • 1970-01-01
        • 2010-11-17
        • 2011-06-29
        • 2011-02-28
        相关资源
        最近更新 更多