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?

Respostas:



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.


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).


Parabéns pelo raciocínio.
Guney Ozsan,


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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.