Видимость методов класса в 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 не было пакетов.

Johnco
источник
16
@Ian: Я бы сказал, потому что «явное лучше, чем неявное» (как говорит дзен Python ). Это заставляет других программистов тратить мозговые циклы на размышления о том, является ли конструктор частным или общедоступным или чем-то еще. Если бы люди всегда использовали модификаторы доступа, исходный плакат мог бы даже не задавать этот вопрос.
Пользователь
Также следует отметить, что на таких языках, как Java, где по умолчанию используется частный пакет, всегда интересно, является ли он частным пакетом по дизайну или разработчик просто забыл указать его (особенно при работе с не очень старшими разработчиками). Вот почему PMD включает такие правила, как это: pmd.github.io/pmd-5.5.2/pmd-java/rules/java/…
Johnco
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
    }
}
James.Valon
источник
0

function __construct()и public function __construct()работает с тем же именем метода.

Если вы не смогли определить префикс для имени метода, он должен быть по умолчанию общедоступным.

Гази Анис
источник