Visibilità predefinita dei metodi di classe in PHP


118

Ho guardato il manuale , ma non riesco a trovare la risposta.

Qual è la visibilità predefinita in PHP per i metodi senza una dichiarazione di visibilità? PHP ha una visibilità del pacchetto come in Java?

Ad esempio, nel codice seguente, è go()pubblico o privato?

class test {
  function go() {
  }
}

Il motivo per cui l'ho chiesto è che ho visto molti codici di costruttori scritti come function __construct()e alcuni come public function __construct(). Sono equivalenti?

Risposte:



22

L'impostazione predefinita è pubblica. È una buona pratica includerlo sempre, tuttavia le classi supportate da PHP4 senza modificatori di accesso, quindi è comune non vederne l'utilizzo nel codice legacy.

E no, PHP non ha visibilità sui pacchetti, principalmente perché fino a poco tempo fa PHP non aveva pacchetti.


16
@Ian: direi perché "esplicito è meglio dell'implicito" (come dice lo Zen di python ). Fa sì che altri programmatori sprechino cicli cerebrali chiedendosi se il costruttore è privato o pubblico o cosa. Se le persone usassero sempre i modificatori di accesso, il poster originale potrebbe non aver nemmeno fatto questa domanda.
Utente

Da notare anche, su linguaggi come Java, dove l'impostazione predefinita è privata del pacchetto, ci si chiede sempre se è privato del pacchetto in base alla progettazione, o lo sviluppatore si è semplicemente dimenticato di specificarlo (specialmente quando si tratta di sviluppatori non così senior). Ecco perché PMD include regole come questa: pmd.github.io/pmd-5.5.2/pmd-java/rules/java/…
Johnco

9

L'impostazione predefinita è pubblica. Il motivo probabilmente è la retrocompatibilità poiché il vecchio codice si aspetta che sia pubblico (smetterebbe di funzionare se non fosse pubblico).


Complimenti per il ragionamento.
Guney Ozsan


1

Quando nessuna visibilità parola chiave ( public, privateo protectedusati), i metodi saranno pubbliche . Tuttavia, non è possibile definire le proprietà in questo modo. Per le proprietà , sarà necessario aggiungere una parola chiave di visibilità alla dichiarazione.

Per le proprietà che non sono dichiarate nella classe e le si assegna un valore all'interno di un metodo avrà una visibilità pubblica.

<?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()funziona con lo stesso nome del metodo.

Se non è possibile definire il prefisso per un nome di metodo, dovrebbe essere pubblico per impostazione predefinita.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.