Kiedy i dlaczego należy używać public
, private
oraz protected
funkcje i zmienne wewnątrz klasy? Jaka jest różnica między nimi?
Przykłady:
// Public
public $variable;
public function doSomething() {
// ...
}
// Private
private $variable;
private function doSomething() {
// ...
}
// Protected
protected $variable;
protected function doSomething() {
// ...
}
Odpowiedzi:
Używasz:
public
zakres, aby udostępnić tę właściwość / metodę z dowolnego miejsca, innych klas i instancji obiektu.private
zasięg, gdy chcesz, aby twoja właściwość / metoda była widoczna tylko we własnej klasie.protected
zasięg, gdy chcesz, aby Twoja właściwość / metoda była widoczna we wszystkich klasach, które rozszerzają bieżącą klasę, w tym klasę nadrzędną.Więcej informacji (wyczerpujące informacje)
źródło
protected
zasięg, gdy chcesz, aby twoja zmienna / funkcja była widoczna we wszystkich klasach, które rozszerzają bieżącą klasę ORAZ jej klasy nadrzędne .http://www.php.net/manual/en/language.oop5.visibility.php#109324
Publiczny:
Gdy deklarujesz metodę (funkcję) lub właściwość (zmienną) jako
public
, do tych metod i właściwości można uzyskać dostęp poprzez:Przykład:
Chroniony:
Gdy deklarujesz metodę (funkcję) lub właściwość (zmienną) jako
protected
, dostęp do tych metod i właściwości można uzyskać za pomocąCzłonkowie z zewnątrz nie mogą uzyskać dostępu do tych zmiennych. „Osoby postronne” w tym sensie, że nie są obiektowymi instancjami samej deklarowanej klasy.
Przykład:
Dokładny błąd będzie następujący:
Prywatny:
Gdy deklarujesz metodę (funkcję) lub właściwość (zmienną) jako
private
, do tych metod i właściwości można uzyskać dostęp poprzez:Członkowie z zewnątrz nie mogą uzyskać dostępu do tych zmiennych. Osoby postronne w tym sensie, że nie są obiektowymi instancjami samej deklarowanej klasy, a nawet klas dziedziczących zadeklarowaną klasę.
Przykład:
Dokładne komunikaty o błędach to:
Analiza sekcji dziadka za pomocą Refleksji
Ten temat nie jest tak naprawdę poza zakresem i dodam go tutaj, aby udowodnić, że refleksja jest naprawdę potężna. Tak jak to podano w powyżej trzech przykładów
protected
iprivate
członków (właściwości i metody) nie są dostępne na zewnątrz klasy.Jednak dzięki refleksji możesz zrobić coś niezwykłego , nawet uzyskując dostęp
protected
iprivate
członków spoza klasy!Czym jest odbicie?
Preambuła
Mamy klasę o nazwie
Grandpas
i mówimy, że mamy trzy właściwości. Aby ułatwić zrozumienie, weź pod uwagę trzy dziadki o nazwach:Uczyńmy je (przydział modyfikatorów)
public
,protected
iprivate
odpowiednio. Wiesz bardzo dobrze, żeprotected
doprivate
członków nie można uzyskać dostępu poza klasą. Sprzeczmy teraz z tym stwierdzeniem za pomocą refleksji.Kod
Wynik:
Wspólne nieporozumienia:
Proszę nie mylić z poniższym przykładem. Jak widać, do członków
private
iprotected
nie można uzyskać dostępu poza klasą bez użycia refleksjiWynik:
Funkcje debugowania
print_r
,var_export
Ivar_dump
to działa debugger . Prezentują informacje o zmiennej w formie czytelnej dla człowieka. Te trzy funkcje ujawniąprotected
iprivate
właściwości obiektów w PHP 5. Członkowie klasy statycznej nie zostaną pokazani.Więcej zasobów:
źródło
Zazwyczaj uważa się za dobrą praktykę domyślną ustawienie najniższej wymaganej widoczności, ponieważ sprzyja to enkapsulacji danych i dobrej konstrukcji interfejsu. Rozważając zmienną elementu i widoczność metody, zastanów się nad rolą elementu w interakcji z innymi obiektami.
Jeśli „kodujesz interfejs, a nie implementację”, zazwyczaj podejmowanie decyzji dotyczących widoczności jest zazwyczaj bardzo proste. Zasadniczo zmienne powinny być prywatne lub chronione, chyba że masz dobry powód, aby je ujawnić. Zamiast tego używaj publicznych akcesoriów (getters / setters), aby ograniczyć i regulować dostęp do wewnętrznych elementów klasy.
Aby użyć samochodu jako analogii, rzeczy takie jak prędkość, bieg i kierunek byłyby zmiennymi instancji prywatnej. Nie chcesz, aby kierowca bezpośrednio manipulował takimi czynnikami, jak stosunek powietrze / paliwo. Zamiast tego udostępniasz ograniczoną liczbę działań jako metody publiczne. Interfejs do samochodu może obejmują metody, takie jak
accelerate()
,deccelerate()
/brake()
,setGear()
,turnLeft()
,turnRight()
, etc.Kierowca nie wie i nie powinno go obchodzić, w jaki sposób te działania są realizowane przez elementy wewnętrzne samochodu, a ujawnienie tej funkcjonalności może być niebezpieczne dla kierowcy i innych osób na drodze. Stąd dobra praktyka projektowania publicznego interfejsu i hermetyzacji danych za tym interfejsem.
Takie podejście pozwala również zmieniać i ulepszać implementację metod publicznych w klasie bez zerwania umowy interfejsu z kodem klienta. Na przykład możesz ulepszyć
accelerate()
metodę, aby była bardziej wydajna pod względem zużycia paliwa, ale użycie tej metody pozostanie takie samo; kod klienta nie wymagałby żadnych zmian, ale nadal czerpałby korzyści z poprawy wydajności.Edycja: Ponieważ wydaje się, że wciąż jesteś w trakcie uczenia się zorientowanych obiektowo pojęć (które są znacznie trudniejsze do opanowania niż składnia jakiegokolwiek języka), bardzo polecam wybranie kopii obiektów, wzorców i ćwiczeń PHP Matta Zandstry. To jest książka, która nauczyła mnie, jak efektywnie korzystać z OOP, a nie tylko na temat składni. Nauczyłem się składni wiele lat wcześniej, ale było to bezużyteczne bez zrozumienia „dlaczego” OOP.
źródło
private
- można uzyskać dostęp TYLKO w klasieprotected
- można uzyskać dostęp Z WEJŚCIA do klasy i DZIEDZICTWApublic
- można uzyskać dostęp również z kodu POZA klasąDotyczy to zarówno funkcji, jak i zmiennych.
źródło
Różnica jest następująca:
Public
:: Dostęp do publicznej zmiennej lub metody może uzyskać dowolny użytkownik klasy.Protected
:: Chroniona zmienna lub metoda nie mogą być dostępne dla użytkowników klasy, ale mogą być dostępne wewnątrz podklasy, która dziedziczy z klasy.Private
:: Dostęp do zmiennej prywatnej lub metody można uzyskać tylko wewnętrznie z klasy, w której jest zdefiniowany. Oznacza to, że prywatnej zmiennej lub metody nie można wywołać z elementu potomnego, który rozszerza klasę.źródło
Zakresy widoczności z abstrakcyjnymi przykładami :: Ułatwia zrozumienie
Ta widoczność właściwości lub metody jest zdefiniowana przez wcześniej ustaloną deklarację jednego z trzech słów kluczowych (publicznego, chronionego i prywatnego)
Publiczny : Jeśli właściwość lub metoda jest zdefiniowana jako publiczna, oznacza to, że można do niej uzyskać dostęp i manipulować nią za pomocą wszystkiego, co może odnosić się do obiektu.
Chronione: gdy widoczność właściwości lub metody jest chroniona, członkowie mogą uzyskać dostęp tylko w obrębie samej klasy oraz klas dziedziczonych i dziedziczących. (Dziedziczone: - klasa może mieć wszystkie właściwości i metody innej klasy).
Prywatne: gdy widoczność właściwości lub metody jest ustawiona na prywatną, tylko klasa, która ma członków prywatnych, może uzyskać dostęp do tych metod i właściwości (wewnętrznie w klasie), niezależnie od tego, jaka może być tam relacja klasy.
źródło
Wypakowany z :
http://php.net/manual/en/language.oop5.visibility.php
źródło
PUBLIC
:public
zakres: publiczna zmienna / funkcja jest dostępna zarówno dla obiektów, jak i innych klas.PROTECTED
:protected
zakres: chroniona zmienna / funkcja jest dostępna dla wszystkich klas, które rozszerzają bieżącą klasę.PRIVATE
:private
zakres: Prywatna zmienna / funkcja jest widoczna tylko w bieżącej klasie, w której jest definiowana.Przeczytaj Widoczność metody lub zmiennej w Podręczniku PHP.
źródło
Biorąc pod uwagę „ kiedy ”:
na początku deklaruję wszystko jako prywatne, jeśli nie jestem do końca pewien. Powodem jest to, że zwykle łatwiej jest zmienić metodę prywatną na publiczną niż na odwrót. To dlatego, że możesz być przynajmniej pewien, że prywatna metoda nie była używana nigdzie indziej niż w samej klasie. Metoda publiczna może być już wszędzie używana, co może wymagać obszernego przepisywania.
Aktualizacja : domyślam się
protected
teraz, ponieważ przekonałem się, że jest wystarczająco dobry do enkapsulacji i nie przeszkadza, gdy rozszerzam zajęcia (których i tak staram się unikać). Tylko jeśli będę miał dobry powód, aby użyć dwóch pozostałych.Dobrym powodem dla tej
private
metody jest implementacja czegoś nieodłącznego dla tego obiektu, którego nawet rozszerzająca się klasa nie powinna zmienić (uzasadnienie faktyczne, oprócz enkapsulacji, takie jak zarządzanie stanem wewnętrznym). W końcu wciąż jest dość łatwe do wyśledzenia, gdzieprotected
zwykle stosuje się metodę, więc domyślnieprotected
teraz. Przyznaję, że może nie 100% obiektywne doświadczenie „w okopach”.źródło
private
byłoby nadal „wystarczająco dobre” do użycia, ale nie sugerujesz, że choć wcześniejsze powody, które podałeś, brzmią jak „dobry powód”: enkapsulacja.protected
robi to już, ale zachowujesz elastyczność w zakresie przedłużania / dziedziczenia. Ponownie, chyba że masz dobry powód, aby to zrobićprivate
.protected
rzeczywistości przecieka do zakresu zewnętrznego i często stoi na twojej drodze, ponieważ wspiera złe decyzje projektowe, takie jak domyślnie faworyzowanie dziedziczenia, podczas gdy lepiej jest preferować kompozycję. Dlatego trzymanie się prywatnego, chyba że masz rzeczywiste wymagania, aby nie być, jest często lepszym sposobem na rozpoczęcie pisania kodu. Zapobiegnie to również podejmowaniu decyzji projektowych zbyt wcześnie, podczas gdy nie są one jeszcze potrzebne.protected
nie przenika do zakresu zewnętrznego (kod, który wywołuje / uzyskuje dostęp do metody / pola), a jedynie zakres wewnętrzny (rozszerzanie klas). Istnieje różnica, choć może być niewielka. Znacznie łatwiej jest wyśledzić użycieprotected
pola niż polapublic
.Podręcznik PHP ma dobrą lekturę na pytanie tutaj .
źródło
Dla mnie jest to najbardziej przydatny sposób zrozumienia trzech typów właściwości:
Publiczny : użyj tej opcji, gdy jesteś w porządku, gdy do tej zmiennej można uzyskać bezpośredni dostęp i zmienić ją z dowolnego miejsca w kodzie.
Przykładowe użycie spoza klasy:
Chroniony : Użyj tego, gdy chcesz zmusić innych programistów (i siebie) do używania getterów / setterów poza klasą podczas uzyskiwania dostępu i ustawiania zmiennych (ale powinieneś być konsekwentny i używać getterów i setterów również wewnątrz klasy). To lub
private
zazwyczaj jest domyślnym sposobem na skonfigurowanie wszystkich właściwości klasy.Dlaczego? Ponieważ jeśli zdecydujesz w pewnym momencie w przyszłości (może nawet za około 5 minut), że chcesz manipulować wartością zwracaną dla tej właściwości lub zrób coś z nią przed uzyskaniem / ustawieniem, możesz to zrobić bez refaktoryzacji, gdziekolwiek masz wykorzystałem to w twoim projekcie.
Przykładowe użycie spoza klasy:
Prywatne :
private
nieruchomości są bardzo podobne doprotected
nieruchomości. Ale wyróżniającą cechą / różnicą jest to, że czyniąc jąprivate
również niedostępną dla klas potomnych bez użycia gettera lub setera klasy nadrzędnej.Tak więc w zasadzie, jeśli używasz getterów i ustawiaczy dla właściwości (lub jeśli jest ona używana tylko wewnętrznie przez klasę nadrzędną i nie ma być nigdzie indziej dostępna), możesz to zrobić
private
, tylko po to , aby nikt nie próbował używać go bezpośrednio i wprowadzać błędy .Przykładowe użycie w klasie potomnej (która rozszerza MyObject):
źródło
Są tam, aby umożliwić różne poziomy enkapsulacji
źródło
Zmienne w PHP są rzutowane na trzy różne typy:
Publiczny: wartości tego typu zmiennych są dostępne we wszystkich zakresach i wywołują wykonanie twojego kodu. deklaruj jako:
public $examTimeTable;
Prywatne: wartości tego typu zmiennej są dostępne tylko dla klasy, do której należy.
private $classRoomComputers;
Chronione: wartości tej klasy i dostępne tylko wtedy, gdy Access został przyznany w formie dziedziczenia lub ich klasy potomnej. zwykle używany
::
do udzielania dostępu przez klasę nadrzędnąprotected $familyWealth;
źródło
Ożywiam stare pytanie, ale myślę, że naprawdę dobrym sposobem na myślenie o tym jest interfejs API, który definiujesz.
public
- Wszystko oznaczone jako publiczne jest częścią interfejsu API, z którego będzie korzystał każdy, kto korzysta z twojej klasy / interfejsu / innego.protected
- Nie daj się zwieść, to także część API! Ludzie mogą podklasować, rozszerzać kod i używać wszystkiego, co jest oznaczone jako chronione.private
- Prywatne właściwości i metody można zmieniać w dowolny sposób. Nikt inny nie może z nich korzystać. To jedyne rzeczy, które możesz zmienić bez dokonywania przełomowych zmian.Lub w kategoriach Semver :
Zmiany w czymkolwiek
public
lubprotected
powinny być traktowane jako GŁÓWNE zmiany.Wszystko nowe
public
lubprotected
powinno być (przynajmniej) MAŁETylko nowe / zmiany czegokolwiek
private
mogą być PATCHJeśli chodzi o utrzymanie kodu, dobrze jest uważać na to, co robisz
public
lubprotected
ponieważ są to rzeczy, które obiecujesz swoim użytkownikom.źródło
Kiedy podążamy za obiektowym php w naszym projekcie, powinniśmy przestrzegać pewnych zasad, aby używać modyfikatorów dostępu w php. Dzisiaj dowiemy się, czym jest modyfikator dostępu i jak go używać. Modyfikatory dostępu PHP służą do ustawiania praw dostępu do klas PHP i ich członków, które są funkcjami i zmiennymi zdefiniowanymi w zakresie klasy. W php istnieją trzy zakresy dla członków klasy.
Teraz spójrzmy na poniższy obrazek, aby zrozumieć poziom dostępu modyfikatora dostępu
Teraz spójrzmy na poniższą listę, aby dowiedzieć się o możliwych słowach kluczowych PHP używanych jako modyfikatory dostępu.
public: - klasa lub jej członkowie zdefiniowani za pomocą tego modyfikatora dostępu będą publicznie dostępni z dowolnego miejsca, nawet spoza zakresu klasy.
private: - członkowie klasy z tym słowem kluczowym będą dostępni w samej klasie. nie możemy uzyskać dostępu do prywatnych danych z podklasy. Chroni członków przed dostępem klasy zewnętrznej.
chroniony: - taki sam jak prywatny, z wyjątkiem umożliwienia podklasom dostępu do chronionych członków nadklasy.
Teraz zobacz tabelę, aby zrozumieć modyfikator dostępu Przeczytaj cały artykuł Modifire dostępu do php
źródło
Public
: jest stanem domyślnym, kiedy deklarujesz zmienną lub metodę, można uzyskać do niej dostęp bezpośrednio z obiektu.Protected
: Można uzyskać dostęp tylko w obrębie obiektu i podklas.Private
: Można się do niego odwoływać tylko w obiekcie, a nie w podklasach.źródło
Wspomniane słowa kluczowe są modyfikatorami dostępu i pomagają nam wdrożyć enkapsulację (lub ukrywanie informacji). Informują kompilator, które inne klasy powinny mieć dostęp do definiowanego pola lub metody.
prywatny - tylko bieżąca klasa będzie miała dostęp do pola lub metody.
chronione - tylko bieżąca klasa i podklasy (a czasem także klasy tego samego pakietu) tej klasy będą miały dostęp do pola lub metody.
public - każda klasa może odwoływać się do pola lub wywoływać metodę.
źródło