U čemu je razlika između javnog, privatnog i zaštićenog?

Kada i zašto bi se public , private i protected funkcije i varijable mogle koristiti unutar razreda? U čemu je razlika između njih?

primjeri:

 // Public public $variable; public function doSomething() { // ... } // Private private $variable; private function doSomething() { // ... } // Protected protected $variable; protected function doSomething() { // ... } 
880
06 дек. postavio Adam 06 dec. 2010-12-06 01:13 '10 u 1:13 2010-12-06 01:13
@ 16 odgovora

Koristite:

  • public opseg kako bi ova varijabla / funkcija bila dostupna s bilo kojeg mjesta, drugih klasa i instanci objekata.

  • private područje kada želite da vaša varijabla / funkcija bude vidljiva samo u svojoj klasi.

  • protected područje kada želite učiniti vašu varijablu / funkciju vidljivom u svim klasama koje proširuju trenutnu klasu, uključujući roditeljsku klasu.

Pročitajte više: (za potpune informacije)

1143
06 дек. odgovor od Sarfraz 06. prosinca. 2010-12-06 01:17 '10 u 1:17 2010-12-06 01:17

2019

1070
20 февр. Odgovor daje Shankar Damodaran 20. veljače. 2014-02-20 11:35 '14 u 11:35 2014-02-20 11:35

Obično se pretpostavlja da je za normalan rad potrebna minimalna vidljivost, jer to doprinosi enkapsulaciji podataka i dobrom dizajnu sučelja. Kada razmatrate vidljivost elemenata i vidljivost metode, razmislite o ulozi koju član igra u interakciji s drugim objektima.

Ako "kodirate sučelje, a ne implementaciju", onda je obično prilično lako donositi odluke o vidljivosti. Općenito, varijable trebaju biti privatne ili zaštićene ako nemate valjane razloge za njihovo otkrivanje. Umjesto toga, koristite javne pristupnike (getters / seters) kako biste ograničili i regulirali pristup internim klasama.

Koristiti automobil kao analogiju, stvari kao što su brzina, brzina i smjer će biti privatne varijable instance. Ne želite da vozač izravno manipulira stvarima kao što je omjer zraka i goriva. Umjesto toga, objavljujete ograničen broj radnji kao javne metode. Sučelje stroja može uključivati ​​metode kao što su accelerate() , deccelerate() / brake() , setGear() , turnLeft() , turnRight() , itd.

Vozač ne zna i ne bi trebao brinuti o tome kako se ove radnje izvode unutarnjim komponentama automobila, a izlaganje ove funkcije opasnom je za vozača i druge ljude na cesti. Stoga je dobra praksa razviti javno sučelje i zarobiti podatke iza tog sučelja.

Ovaj pristup također vam omogućuje da modificirate i poboljšate implementaciju javnih metoda u svojoj klasi bez kršenja ugovora s kodom klijenta. Na primjer, možete poboljšati metodu accelerate() kako bi bila ekonomičnija, ali upotreba ove metode ostat će ista; Kôd klijenta ne zahtijeva nikakve promjene, ali još uvijek ima koristi od povećanja učinkovitosti.

Uredi: Budući da se čini da ga još uvijek nalazite među objektno-orijentiranim konceptima učenja (koje je mnogo teže svladati od bilo koje sintakse jezika), preporučujem da sakupite kopije PHP objekata, uzoraka i praksi od Matta Zandstra. Ovo je knjiga koja me je prvi naučila kako učinkovito koristiti OOP, a ne samo da me podučava sintaksi. Proučavao sam sintaksu prije nekoliko godina, ali to je bilo beskorisno bez razumijevanja zašto PLO.

82
03 сент. Odgovor daje The Awnry Bear 03 sep . 2012-09-03 23:17 '12 u 23:17 2012-09-03 23:17

private - može se pristupiti samo iz klase ININ

zaštićeni - može se pristupiti iz razreda UNUTAR i NASLIJEĐIVANJE

public - može se pristupiti i iz koda OUTSIDE

To se odnosi na obje funkcije i varijable.

73
06 дек. Odgovor je dan Olaf 06 dec. 2010-12-06 01:17 '10 u 1:17 2010-12-06 01:17

Razlika je sljedeća:

Public :: Pristup otvorenoj varijabli ili metodi može dobiti bilo koji korisnik ove klase.

Protected :: Zaštićena varijabla ili metoda možda neće biti dostupna korisnicima klase, ali mogu biti dostupni unutar podklase koja nasljeđuje od klase.

Private :: Privatnoj varijabli ili metodi može se pristupiti samo unutar klase u kojoj je definirana. To znači da osobna varijabla ili metoda ne može biti pozvana iz dječjeg objekta koji proširuje klasu.

24
03 сент. Odgovor je dao Matthew Watts 3. rujna. 2012-09-03 22:51 '12 u 22:51 2012-09-03 22:51

Opsezi s primjerima sa apstraktom :: Lako razumljivi

Ta vidljivost svojstva ili metode određuje se proglašavanjem jedne od tri ključne riječi (javne, zaštićene i privatne).

Javno. Ako je svojstvo ili metoda definirana kao javno dostupna, to znači da joj se može pristupiti i kontrolirati svatko tko se može pozvati na objekt.

  • Esej, na primjer. Zamislite širinu javne vidljivosti kao "javni piknik" u koji svatko može doći.

Zaštićeno: kada se pristupačnosti svojstava ili metoda za zaštićene članove može pristupiti samo unutar same klase i naslijeđenih i nasljednih klasa. (Naslijeđeno: - klasa može imati sva svojstva i metode druge klase).

  • Razmislite o zaštićenom području vidljivosti kao o "tvrtki za piknik", u kojoj članovi društva i članovi njihovih obitelji nisu dopušteni za javnost. To je najčešće ograničenje količine.

Zatvoreno: Kada je svojstvo ili vidljivost metode postavljeno na privatno, samo klasa s privatnim članovima može pristupiti tim metodama i svojstvima (unutar klase), iako može biti.

  • s analogijom piknika, smatraju piknik tvrtke , gdje su samo članovi tvrtke dopušteni na pikniku . a ne obitelj, nije dopušteno objavljivanje javnosti.
16
07 февр. Odgovor daje Suman KC 07. veljače. 2014-02-07 06:07 '14 u 6:07 2014-02-07 06:07
  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  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 

Izdvojeno iz:

http://php.net/manual/en/>

03 окт. Odgovoriti Techie 03. list. 2013-10-03 14:01 '13 u 14:01 2013-10-03 14:01

Ovdje je jednostavan način za pamćenje public , protected i private .

PUBLIC :

  • public domena: zajednička varijabla / funkcija dostupna je i za objekte i za druge klase.

PROTECTED :

  • protected opseg: zaštićena varijabla / funkcija dostupna je za sve klase koje proširuju trenutnu klasu.
  • Ne! Objekti ne mogu pristupiti ovom području.

PRIVATE :

  • private područje: private varijabla / funkcija vidljiva je samo u trenutnoj klasi, gdje je definirana.
  • Ne! Klasa koja proširuje trenutnu klasu ne može pristupiti tom području.
  • Ne! Objekti ne mogu pristupiti ovom području.

Pročitajte vidljivost metode ili varijable u priručniku za PHP.

11
30 июня '16 в 10:27 2016-06-30 10:27 odgovor je dao Ahmad Awais 30. lipnja 16. u 10:27 2016-06-30 10:27

S obzirom na "kada":
Sklon sam proglasiti sve u početku kao privatno, ako nisam sasvim siguran. Razlog tome je što je privatna metoda obično mnogo lakša za objavljivanje nego obrnuto. To je zato što možete biti sigurni da privatna metoda nije korištena nigdje osim u samoj klasi. Javna metoda se već može koristiti svugdje, što možda zahtijeva opsežno ponovno pisanje.

Ažuriranje : Trenutno sam protected standard po defaultu, jer sam otkrio da je dovoljno dobar za enkapsulaciju i ne ometa proširenje klasa (što pokušavam izbjeći u svakom slučaju). Samo ako imam dobar razlog da iskoristim ostala dva, učinit ću to.

Dobar razlog za private metodu može biti onaj koji implementira nešto svojstveno ovom objektu, da se čak i klasa koja se širi ne smije mijenjati (stvarni razlog, osim enkapsulacije, je unutarnja kontrola stanja). Na kraju, još uvijek je prilično lako pratiti gdje se obično koristi protected metoda, tako da trenutno koristim protected prema zadanim postavkama. Možda ne 100% objektivno iskustvo "u rovovima", priznajem.

8
28 мая '12 в 17:27 2012-05-28 17:27 odgovor je danMan 28. svibanj '12 u 17:27 2012-05-28 17:27

Priručnik za PHP ima dobro čitanje o ovom pitanju.

Vidljivost svojstva ili metode može se odrediti prefiksom deklaracije ključnim riječima javnim, zaštićenim ili privatnim. Članovima koji su proglašeni javnim mogu se pristupiti u svim zemljama. Pristup elementima koji su proglašeni zaštićenim mogu biti dostupni samo unutar same klase i naslijeđenih i roditeljskih klasa. Članovi deklarirani private mogu imati pristup samo klasi koja definira člana.

6
06 дек. Odgovor je dan code_burgar 06 dec. 2010-12-06 01:16 '10 u 1:16 2010-12-06 01:16

Za mene je ovo najkorisniji način razumijevanja tri vrste svojstava:

Javno. Upotrijebite to kada ste dobro, kada je ova varijabla izravno dostupna i promijenjena s bilo kojeg mjesta u kodu.

Primjer korištenja izvan razreda:

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

Zaštićeno . Koristite ovo kada želite da drugi programeri (i vi sami) koriste gettere / seters izvan klase kada pristupaju i postavljaju varijable (ali morate biti dosljedni i koristiti getters i setters unutar klase). Ovaj ili private obično standardni način kada morate konfigurirati sva svojstva klase.

Zašto? Jer ako se odlučite u nekom trenutku u budućnosti (možda čak i 5 minuta) da želite manipulirati vrijednošću koja je vraćena za ovo svojstvo ili učiniti nešto s njom prije dobivanja / postavljanja, možete to učiniti ovo je bez refactoringa gdje god ga je koristio u vašem projektu.

Primjer korištenja izvan razreda:

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

Privatno : private svojstva su vrlo slična protected svojstvima. No, osobitost / razlika je u tome što je čini private nepristupačnom za klase dijete bez upotrebe roditeljske klase getter ili setter.

U osnovi, ako koristite getters i setters za svojstvo (ili ako se koristi samo unutar roditeljske klase i nije namijenjen za pristup bilo gdje), možete ga učiniti i private , samo da ga nitko ne pokuša koristiti izravno i uvesti greške.

Primjer korištenja unutar podređene klase (koja proširuje MyObject):

 $this->setPrivateVar('newvalue'); $privateVar = $this->getPrivateVar(); 
6
25 янв. odgovor dat Andrewu 25. siječnja 2016-01-25 06:16 '16 u 6:16 2016-01-25 06:16

Oni su tu da omoguće različite razine enkapsulacije

4
06 дек. Odgovor je dan Mchl 06 dec. 2010-12-06 01:22 '10 u 1:22 2010-12-06 01:22

Varijable u PHP-u prikazane su u tri različite vrste:

Objavljivanje: vrijednosti tih vrsta varijabli dostupne su u cijelom opsegu i uzrokuju izvršavanje koda. proglasi kao: public $examTimeTable;

Zatvoreno: vrijednosti ove vrste varijabli dostupne su samo za klasu kojoj pripada. private $classRoomComputers;

Zaštićeno: vrijednosti ove klase dostupne su i dostupne samo ako je Pristup omogućen kao nasljedstvo ili njihova podređena klasa. najčešće se koristi za pružanje pristupa roditeljskoj klasi

protected $familyWealth;

4
15 марта '13 в 11:25 2013-03-15 11:25 odgovor je dan star18bit 15. ožujka '13 u 11:25 2013-03-15 11:25

Oživljavanje starog pitanja, ali mislim da je to stvarno dobar način da o tome razmišljate - sa stajališta API-ja koji definirate.

  • public - Sve što je javno je dio API-ja koji će se koristiti i oslanjati na svakoga tko koristi vašu klasu / sučelje / drugo.

  • protected - Nemojte se zavaravati, to je također dio API-ja! Ljudi mogu podklasu, proširiti vaš kod i koristiti sve što je označeno kao zaštićeno.

  • private - Privatna svojstva i metode mogu se mijenjati kako želite. Nitko drugi ih ne može koristiti. To su jedine stvari koje možete promijeniti bez promjene.

Ili u uvjetima Semver :

  • Promjene u nečemu public ili protected trebaju se smatrati VEĆIM promjenama.

  • Sve nove ili protected moraju biti (barem) MINOR

  • Samo novo / promjenljivo bilo što private može biti PATCH

Dakle, sa stajališta održavanja koda, dobro je biti oprezan s onim što radite public ili protected , jer to je ono što obećavate svojim korisnicima.

3
16 нояб. odgovor je dao mcfedr 16. studenog 2016-11-16 12:51 '16 u 12:51 2016-11-16 12:51

Javno: Ovo je zadano stanje kada deklarirate varijablu ili metodu kojoj objekt može izravno pristupiti.

Zaštićeno: Pristup je moguć samo unutar objekta i podklasa.

Privatno: može se odnositi samo na objekt, a ne na potklase.

1
04 янв. odgovor je Nomadme 04 Jan 2016-01-04 20:46 '16 u 20:46 2016-01-04 20:46

Kada pratimo objektno orijentirani php u našem projektu, moramo slijediti neka pravila kako bismo koristili modifikatore pristupa u php-u. Danas ćemo jasno znati što je modifikator pristupa i kako ga možemo koristiti. PHP modifikatori pristupa koriste se za postavljanje dozvola s PHP klasama i njihovim članovima, koje su funkcije i varijable definirane u opsegu klase. Postoje tri područja za učenike u php.

  1. JAVNI
  2. PRIVATNI
  3. REZERVIRANO

Pogledajmo sada sljedeću sliku kako bismo razumjeli razinu pristupa modifikatora pristupa.

Sada pogledajmo sljedeći popis kako bismo saznali o mogućim PHP ključnim riječima koje se koriste kao modifikatori pristupa.