Jaka jest różnica między publicznym, prywatnym a chronionym?

988

Kiedy i dlaczego należy używać public, privateoraz protectedfunkcje 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() {
  // ...
}
Adam
źródło
59
Myślę, że to pytanie również skorzystałoby z odpowiedzi z praktycznymi przykładami użycia każdego z nich, zamiast podać dosłowną definicję tego, co robi każde słowo kluczowe.
Matthew
70
Naprawdę uważam, że to pytanie powinno być publiczne, a nie chronione.
dotancohen

Odpowiedzi:

1260

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)

Sarfraz
źródło
79
protectedzasięg, gdy chcesz, aby twoja zmienna / funkcja była widoczna we wszystkich klasach, które rozszerzają bieżącą klasę ORAZ jej klasy nadrzędne .
Shahid
4
@Shahid - Nie rozumiem, o co ci chodzi. Każda klasa, która rozszerza klasę A, również rozszerza klasę nadrzędną A, nie?
JDelage,
4
@JDelage - Proszę zobaczyć linkhttp://www.php.net/manual/en/language.oop5.visibility.php#109324
Shahid
4
@ Growler Po co więc w ogóle męczyć się z użyciem obiektów?
J.Steve
27
@ Grrowler, bardziej pomocną odpowiedzią byłoby to, że dobrze jest ukryć jak najwięcej wewnętrznych działań obiektu. W ten sposób prawdopodobieństwo pęknięcia jest mniejsze. Jeśli podasz wszystko do publicznej wiadomości, inny programista może zmienić zmienną, której nie chcesz zmieniać przez nic innego niż wewnętrzne działanie twojego obiektu.
Relaks na Cyprze
1174

dd

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:

  • Ta sama klasa, która to zadeklarowała.
  • Klasy, które dziedziczą wyżej zadeklarowaną klasę.
  • Wszelkie obce elementy poza tą klasą również mogą uzyskać dostęp do tych rzeczy.

Przykład:

<?php

class GrandPa
{
    public $name='Mark Henry';  // A public variable
}

class Daddy extends GrandPa // Inherited class
{
    function displayGrandPaName()
    {
        return $this->name; // The public variable will be available to the inherited class
    }

}

// Inherited class Daddy wants to know Grandpas Name
$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'

// Public variables can also be accessed outside of the class!
$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Prints 'Mark Henry'

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ą

  • Ta sama klasa, która to zadeklarowała.
  • Klasy, które dziedziczą wyżej zadeklarowaną klasę.

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:

<?php

class GrandPa
{
    protected $name = 'Mark Henry';
}

class Daddy extends GrandPa
{
    function displayGrandPaName()
    {
        return $this->name;
    }

}

$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'

$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error

Dokładny błąd będzie następujący:

PHP Błąd krytyczny: nie można uzyskać dostępu do chronionej właściwości GrandPa :: $ name


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:

  • Ta sama klasa, która to zadeklarowała.

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:

<?php

class GrandPa
{
    private $name = 'Mark Henry';
}

class Daddy extends GrandPa
{
    function displayGrandPaName()
    {
        return $this->name;
    }

}

$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Results in a Notice 

$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error

Dokładne komunikaty o błędach to:

Uwaga: Niezdefiniowana właściwość: Tatuś :: $ nazwa
Błąd krytyczny: Nie można uzyskać dostępu do prywatnej własności GrandPa :: $ nazwa


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 protectedi privateczł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 protectedi privateczłonków spoza klasy!

Czym jest odbicie?

Refleksja dodaje możliwość inżynierii wstecznej klas, interfejsów, funkcji, metod i rozszerzeń. Ponadto oferują sposoby pobierania komentarzy do funkcji, klas i metod.

Preambuła

Mamy klasę o nazwie Grandpasi mówimy, że mamy trzy właściwości. Aby ułatwić zrozumienie, weź pod uwagę trzy dziadki o nazwach:

  • Mark Henry
  • John Clash
  • Will Jones

Uczyńmy je (przydział modyfikatorów) public, protectedi privateodpowiednio. Wiesz bardzo dobrze, że protecteddo privateczłonków nie można uzyskać dostępu poza klasą. Sprzeczmy teraz z tym stwierdzeniem za pomocą refleksji.

Kod

<?php

class GrandPas   // The Grandfather's class
{
    public     $name1 = 'Mark Henry';  // This grandpa is mapped to a public modifier
    protected  $name2 = 'John Clash';  // This grandpa is mapped to a protected  modifier
    private    $name3 = 'Will Jones';  // This grandpa is mapped to a private modifier
}


# Scenario 1: without reflection
$granpaWithoutReflection = new GrandPas;

# Normal looping to print all the members of this class
echo "#Scenario 1: Without reflection<br>";
echo "Printing members the usual way.. (without reflection)<br>";
foreach($granpaWithoutReflection as $k=>$v)
{
    echo "The name of grandpa is $v and he resides in the variable $k<br>";
}

echo "<br>";

#Scenario 2: Using reflection

$granpa = new ReflectionClass('GrandPas'); // Pass the Grandpas class as the input for the Reflection class
$granpaNames=$granpa->getDefaultProperties(); // Gets all the properties of the Grandpas class (Even though it is a protected or private)


echo "#Scenario 2: With reflection<br>";
echo "Printing members the 'reflect' way..<br>";

foreach($granpaNames as $k=>$v)
{
    echo "The name of grandpa is $v and he resides in the variable $k<br>";
}

Wynik:

#Scenario 1: Without reflection
Printing members the usual way.. (Without reflection)
The name of grandpa is Mark Henry and he resides in the variable name1

#Scenario 2: With reflection
Printing members the 'reflect' way..
The name of grandpa is Mark Henry and he resides in the variable name1
The name of grandpa is John Clash and he resides in the variable name2
The name of grandpa is Will Jones and he resides in the variable name3

Wspólne nieporozumienia:

Proszę nie mylić z poniższym przykładem. Jak widać, do członków privatei protectednie można uzyskać dostępu poza klasą bez użycia refleksji

<?php

class GrandPas   // The Grandfather's class
{
    public     $name1 = 'Mark Henry';  // This grandpa is mapped to a public modifier
    protected  $name2 = 'John Clash';  // This grandpa is mapped to a protected modifier
    private    $name3 = 'Will Jones';  // This grandpa is mapped to a private modifier
}

$granpaWithoutReflections = new GrandPas;
print_r($granpaWithoutReflections);

Wynik:

GrandPas Object
(
    [name1] => Mark Henry
    [name2:protected] => John Clash
    [name3:GrandPas:private] => Will Jones
)

Funkcje debugowania

print_r, var_exportI var_dumpto działa debugger . Prezentują informacje o zmiennej w formie czytelnej dla człowieka. Te trzy funkcje ujawnią protectedi privatewłaściwości obiektów w PHP 5. Członkowie klasy statycznej nie zostaną pokazani.


Więcej zasobów:


Shankar Damodaran
źródło
przepraszam za spóźnienie się na ten konwój. Czy możesz mi powiedzieć, dlaczego ktoś miałby z nich korzystać? Wyjaśniłeś doskonale, jak one działają itp. Chciałbym po prostu poznać zalety korzystania z każdego z nich. Dziękuję
JamesG
@JamesG jest nieco wyjaśniony w innym komentarzu powyżej. stackoverflow.com/questions/4361553/…
cjmling
Nie wiem, dlaczego może to trochę nie wchodzi w zakres tego pytania, ale nikt nie wspomniał, że w PHP są jeszcze dwa modyfikatory dostępu: streszczenie i końcowe tego słowa kluczowego można używać tylko w przypadku klas PHP, ale nadal ma on dostęp do modyfikatorów
bxN5
1
Proponuję zapoznać się z objaśnieniem abstrakcji dostarczanych przez Dhairya Lakhera tutaj: stackoverflow.com/questions/2558559/... . Jest to doskonały dodatek do wyjaśnień Shankar Damodaran.
Julio Marchi
83

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.

Awnry Bear
źródło
3
Książka zalecana w edycji tego postu jest naprawdę bardzo doskonała. Część, którą do tej pory okazałem się całkiem pouczająca. Pierwsze kilka rozdziałów zawierało odpowiedzi na większość moich pytań związanych z klasą.
Josiah
Książki, które pozwoliły mi naprawdę zrozumieć przedmioty, bez wypierania mojego myślenia niepotrzebnymi szczegółami, takie jak przykłady w Smalltalk, zostały napisane przez Davida A Taylora, będącego technologią zorientowaną obiektowo: przewodnik menedżera i inżynierię biznesową z technologią obiektową . Obie mają tylko 100 stron, a każda z nich jest łatwa do odczytania po południu. Oczywiście istnieją wzorce projektowe Gamma i in. , Jednak podstawowe podejście można po prostu opisać „podklasą tego, co chcesz zmieniać”.
Patanjali,
Bardzo ładna analogia. Czy masz taki chroniony czy prywatny?
Jānis Elmeris,
79

private - można uzyskać dostęp TYLKO w klasie

protected - można uzyskać dostęp Z WEJŚCIA do klasy i DZIEDZICTWA

public - można uzyskać dostęp również z kodu POZA klasą

Dotyczy to zarówno funkcji, jak i zmiennych.

Olaf
źródło
Nie jestem pewien, czy chroniona definicja jest tutaj poprawna, wydaje się, że z faktycznie wybranej odpowiedzi Chronione - można uzyskać do niej dostęp tylko od klasy odziedziczonej, a nie od klasy oryginalnej / macierzystej. Powiedzenie „WEWNĄTRZ klasy” może być nieco mylące.
pal4life
7
Nie sądzę, tak naprawdę wydaje się, że wybrana odpowiedź jest myląca tutaj. Zobacz komentarz Shahids. IMHO metoda chroniona jest bardzo dobrze dostępna z oryginalnej klasy.
Olaf
czy klasa może uzyskać dostęp do opinii publicznej innej klasy?
Serjas,
1
@Serjas: Nie, tylko inne obiekty, chyba że są to statyczne metody / pola.
DanMan
Nie wiem, czy dotyczy to wszystkich języków programowania, ale w PHP można uzyskać dostęp do „chronionych” właściwości / metod w klasie, w której zostało zadeklarowane, lub w klasach, które dziedziczą po klasie definiującej właściwość / metodę.
John Slegers
25

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

Matthew Watts
źródło
17

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.

  • Streszczenie np. Pomyśl o zasięgu widoczności publicznej jako o „pikniku publicznym”, na który każdy może przyjść.

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

  • Pomyśl jako chroniony zakres widoczności jako „piknik firmowy”, w którym członkowie firmy i członkowie ich rodzin nie są publicznie dostępni. Jest to najczęstsze ograniczenie zakresu.

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.

  • z analogią pikniku pomyśl jako „piknik firmowy, w którym tylko członkowie firmy są dozwoleni” na pikniku. nie rodzina ani ogół społeczeństwa są dozwolone.
Suman KC
źródło
15
/**
 * Define MyClass
 */
class MyClass
{
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj = new MyClass();
echo $obj->public; // Works
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Shows Public, Protected and Private


/**
 * Define MyClass2
 */
class MyClass2 extends MyClass
{
    // We can redeclare the public and protected method, but not private
    protected $protected = 'Protected2';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj2 = new MyClass2();
echo $obj2->public; // Works
echo $obj2->private; // Undefined
echo $obj2->protected; // Fatal Error
$obj2->printHello(); // Shows Public, Protected2, Undefined

Wypakowany z :

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

Techie
źródło
12

⚡️ Oto prosty sposób na zapamiętanie zakresu public, protectedi private.

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ę.
  • Nie! Obiekty nie mogą uzyskać dostępu do tego zakresu

PRIVATE:

  • private zakres: Prywatna zmienna / funkcja jest widoczna tylko w bieżącej klasie, w której jest definiowana.
  • Nie! Klasa rozszerzająca bieżącą klasę nie może uzyskać dostępu do tego zakresu.
  • Nie! Obiekty nie mogą uzyskać dostępu do tego zakresu.

Przeczytaj Widoczność metody lub zmiennej w Podręczniku PHP.

Ahmad Awais
źródło
9

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ę protectedteraz, 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 privatemetody 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, gdzie protectedzwykle stosuje się metodę, więc domyślnie protectedteraz. Przyznaję, że może nie 100% obiektywne doświadczenie „w okopach”.

DanMan
źródło
3
Dzięki aktualizacji: czy możesz wyjaśnić, jak „wystarczająco dobry” i „dobry powód” idą tutaj razem? Na przykład używanie privatebył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.
hakre
@hakre: Powodem, dla którego powinniśmy dążyć do enkapsulacji, jest uniknięcie wycieku stanu do zakresu zewnętrznego. protectedrobi to już, ale zachowujesz elastyczność w zakresie przedłużania / dziedziczenia. Ponownie, chyba że masz dobry powód, aby to zrobić private.
DanMan
Cóż, chyba nie o to się zgadzamy: w protectedrzeczywistoś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.
hakre
Nie będę się kłócił z twoim ogólnym punktem, ponieważ jest to wystarczająco sprawiedliwe, ale protectednie 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życie protectedpola niż pola public.
DanMan
6

Podręcznik PHP ma dobrą lekturę na pytanie tutaj .

Widoczność właściwości lub metody można zdefiniować, poprzedzając deklarację słowami kluczowymi public, protected lub private. Członkowie klasy zadeklarowani publicznie są dostępni wszędzie. Dostęp do członków uznanych za chronione można uzyskać tylko w obrębie samej klasy oraz klas dziedziczonych i nadrzędnych. Członkowie zadeklarowani jako prywatni mogą uzyskać dostęp tylko do klasy, która definiuje członka.

code_burgar
źródło
6

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:

$myObject = new MyObject()
$myObject->publicVar = 'newvalue';
$pubVar = $myObject->publicVar;

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 privatezazwyczaj 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:

$myObject = new MyObject()
$myObject->setProtectedVar('newvalue');
$protectedVar = $myObject->getProtectedVar();

Prywatne : privatenieruchomości są bardzo podobne do protectednieruchomości. Ale wyróżniającą cechą / różnicą jest to, że czyniąc ją privateró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):

$this->setPrivateVar('newvalue');
$privateVar = $this->getPrivateVar();
Andrzej
źródło
4

Są tam, aby umożliwić różne poziomy enkapsulacji

Mchl
źródło
10
Prawdopodobnie mógłbyś to trochę ulepszyć.
Aaron Hall
4

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;

star18bit
źródło
3

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 publiclub protectedpowinny być traktowane jako GŁÓWNE zmiany.

  • Wszystko nowe publiclub protectedpowinno być (przynajmniej) MAŁE

  • Tylko nowe / zmiany czegokolwiek privatemogą być PATCH

Jeśli chodzi o utrzymanie kodu, dobrze jest uważać na to, co robisz publiclub protectedponieważ są to rzeczy, które obiecujesz swoim użytkownikom.

McFedr
źródło
1

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.

  1. PUBLICZNY
  2. PRYWATNY
  3. CHRONIONY

Teraz spójrzmy na poniższy obrazek, aby zrozumieć poziom dostępu modyfikatora dostępu wprowadź opis zdjęcia tutaj

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

Mahedi Hasan Durjoy
źródło
1

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.

Nomadme
źródło
0

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

Farzana Khan
źródło