Visibilidade padrão de métodos de classe em PHP

118

Olhei para o manual , mas não consigo encontrar a resposta.

Qual é a visibilidade padrão em PHP para métodos sem uma declaração de visibilidade? O PHP tem uma visibilidade de pacote como em Java?

Por exemplo, no código a seguir, é go()público ou privado?

class test {
  function go() {
  }
}

A razão pela qual perguntei é que vi muitos códigos de construtores escritos como function __construct()e alguns como public function __construct(). Eles são equivalentes?

Yada
fonte

Respostas:

179

O padrão é público.

Os métodos de classe podem ser definidos como públicos, privados ou protegidos. Os métodos declarados sem nenhuma palavra-chave de visibilidade explícita são definidos como públicos.

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

Preço Jansen
fonte
11
O mesmo vale para propriedades
Marc.2377
7
O mesmo vale para constantes.
Kolyunya
22

O padrão é público. É uma boa prática sempre incluí-lo, no entanto, o PHP4 oferece suporte a classes sem modificadores de acesso, então é comum não ver nenhum uso deles em código legado.

E não, o PHP não tem visibilidade de pacote, principalmente porque até recentemente o PHP não tinha pacotes.

Johnco
fonte
16
@Ian: Eu diria porque "explícito é melhor do que implícito" (como diz o Zen do python ). Isso faz com que outros programadores desperdicem ciclos cerebrais se perguntando se o construtor é privado ou público ou o quê. Se as pessoas sempre usaram modificadores de acesso, o autor da postagem original pode nem ter feito essa pergunta.
Usuário de
Também digno de nota, em linguagens como Java, onde o padrão é pacote privado, sempre se pergunta se é pacote privado por design, ou o desenvolvedor simplesmente se esqueceu de especificá-lo (especialmente ao lidar com desenvolvedores não tão experientes). É por isso que o PMD inclui regras como esta: pmd.github.io/pmd-5.5.2/pmd-java/rules/java/…
Johnco
9

O padrão é público. O motivo provavelmente é a compatibilidade com versões anteriores, já que o código antigo espera que seja público (ele pararia de funcionar se não fosse público).

Tomas Markauskas
fonte
Parabéns pelo raciocínio.
Guney Ozsan,
7

A visibilidade padrão é PÚBLICA

Fonte

Sasa
fonte
1

Quando nenhuma visibilidade palavra-chave ( public, privateou protected) usados, métodos será pública . Mas você não pode definir propriedades dessa maneira. Para propriedades , você precisará anexar uma palavra-chave de visibilidade na declaração.

Para propriedades que não são declaradas na classe e você atribui um valor a elas dentro de um método, elas terão visibilidade pública.

<?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
fonte
0

function __construct()e public function __construct()funciona com o mesmo nome de método.

Se você não puder definir o prefixo para um nome de método, ele deve ser público por padrão.

Gazi Anis
fonte