Видимість за замовчуванням методів класів у PHP


118

Я переглянув посібник , але не можу знайти відповідь.

Яка видимість за умовчанням у PHP для методів без оголошення про видимість? Чи PHP має видимість пакету, як у Java?

Наприклад, у наведеному нижче коді є go()державним чи приватним?

class test {
  function go() {
  }
}

Причина, яку я запитав, полягає в тому, що я бачив багато кодів конструкторів, написаних як function __construct()і деякі як public function __construct(). Вони еквівалентні?

Відповіді:


179

За замовчуванням є загальнодоступним.

Методи класу можуть бути визначені як державні, приватні чи захищені. Методи, оголошені без явного ключового слова видимості, визначаються як загальнодоступні.

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


11
Те саме стосується властивостей
Marc.2377

7
Те саме стосується і констант.
Колюня

22

За замовчуванням є загальнодоступним. Це завжди добре включати його, однак PHP4 підтримує класи без модифікаторів доступу, тому зазвичай не бачити їх використання у застарілому коді.

І ні, PHP не має видимості пакетів, головним чином тому, що донедавна PHP не мав пакетів.


16
@Ian: Я б сказав, тому що "явне краще, ніж неявне" (як каже дзен python ). Це змушує інших програмістів витрачати мозкові цикли, цікавлячись, чи конструктор приватний чи загальнодоступний чи що. Якщо люди завжди використовували модифікатори доступу, оригінальний плакат може навіть не задавати це питання.
Користувач

Також зауважте, що на таких мовах, як Java, типовим є пакет-приватний, завжди задається питанням, чи це пакет-приватний за дизайном, або розробник просто забув його вказати (особливо, коли це стосується не надто старших розробників). Ось чому PMD включає такі правила, як це: pmd.github.io/pmd-5.5.2/pmd-java/rules/java/…
Джонко

9

За замовчуванням є загальнодоступним. Причина, ймовірно, полягає в зворотній сумісності, оскільки старий код очікує, що він буде загальнодоступним (він би припинив свою роботу, якщо не був би загальнодоступним).


Кудос для міркувань.
Guney Ozsan


1

При відсутності видимості ключового слова ( public, privateабо protected) не використовуються, методи будуть громадськості . Але ви не можете визначити властивості таким чином. За властивостями вам потрібно буде додати до декларації ключове слово видимості.

Для властивостей, які не задекларовані в класі, і ви призначите йому значення всередині методу, буде публічна видимість.

<?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
    }
}

0

function __construct()і public function __construct()працює як однакова назва методу.

Якщо ви не змогли визначити префікс для імені методу, він повинен бути загальнодоступним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.