Domyślna widoczność metod klas w PHP


118

Zajrzałem do instrukcji , ale nie mogę znaleźć odpowiedzi.

Jaka jest domyślna widoczność w PHP dla metod bez deklaracji widoczności? Czy PHP ma widoczność pakietu jak w Javie?

Na przykład w poniższym kodzie, czy jest go()publiczny czy prywatny?

class test {
  function go() {
  }
}

Powodem, dla którego zapytałem, jest to, że widziałem kod wielu konstruktorów napisany jako, function __construct()a niektóre jako public function __construct(). Czy są równoważne?

Odpowiedzi:



22

Domyślnie jest publiczny. Dobrą praktyką jest zawsze dołączanie go, jednak PHP4 obsługuje klasy bez modyfikatorów dostępu, więc często nie widać ich użycia w starszym kodzie.

I nie, PHP nie ma widoczności pakietów, głównie dlatego, że do niedawna PHP nie miało żadnych pakietów.


16
@Ian: Powiedziałbym, ponieważ „wyraźne jest lepsze niż ukryte” (jak mówi Zen Pythona ). Powoduje, że inni programiści marnują cykle mózgowe, zastanawiając się, czy konstruktor jest prywatny, czy publiczny, czy co. Jeśli ludzie zawsze używali modyfikatorów dostępu, oryginalny plakat mógł nawet nie zadać tego pytania.
Użytkownik

Warto również zauważyć, że w językach takich jak Java, gdzie domyślnym ustawieniem jest pakiet prywatny, zawsze można się zastanawiać, czy jest to pakiet prywatny z założenia, czy też programista po prostu zapomniał go określić (szczególnie w przypadku mniej starszych programistów). Dlatego PMD zawiera takie zasady, jak to: pmd.github.io/pmd-5.5.2/pmd-java/rules/java/…
Johnco,

9

Wartość domyślna to public. Przyczyną jest prawdopodobnie kompatybilność wsteczna, ponieważ stary kod oczekuje, że będzie publiczny (przestał działać, gdyby nie był publiczny).


Uznanie za uzasadnienie.
Guney Ozsan


1

W przypadku braku widoczności kluczowe ( public, privatelub protected) stosowane metody będą publiczne . Jednak w ten sposób nie można definiować właściwości. W przypadku nieruchomości konieczne będzie dołączenie słowa kluczowego widoczności w deklaracji.

Właściwości, które nie są zadeklarowane w klasie i przypisujesz im wartość wewnątrz metody, będą miały publiczną widoczność.

<?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()i public function __construct()działa z tą samą nazwą metody.

Jeśli nie możesz zdefiniować przedrostka dla nazwy metody, domyślnie powinien on być public.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.