Php magic get metode. Getteri i Setteri - magija koja mora znati svoje mjesto

Da biste kontrolirali kako se polja koriste, možete kreirati dobiti metode i postaviti i objaviti ih. Oni pružaju mogućnost kontrole pristupa polju. U isto vrijeme, bolje je da polje Age bude privatno tako da mu se ne može direktno pristupiti izvan klase.

račun javne klase

privatni int age;

public int GetAge()

vrati this.age;

public void SetAge(int inAge)

if ((u starosti > 0) && (u godinama< 120))

this.age = inAge;

Sada možemo kontrolirati pristup našem polju, ali to zahtijeva pisanje puno dodatnog koda. Da biste pristupili vrijednosti starosti, morate pozvati kreirane metode:

Račun s = novi račun();

Console.WriteLine("Age: " + s.GetAge());

    1. Korištenje svojstava

Svojstva olakšavaju upravljanje podacima. Svojstvo Age se može deklarirati na sljedeći način:

račun javne klase

private int ageValue;

if ((vrijednost > 0) && (vrijednost< 120))

ageValue = vrijednost;

return ageValue;

Ovdje je vrijednost starosti svojstvo. Svojstvo deklarira sekcije za pisanje i čitanje njegove vrijednosti. Radnje opisane u ovim odeljcima su ekvivalentne prethodno opisanim metodama. U ovom slučaju, svojstva se koriste na isti način kao i obična polja:

Račun s = novi račun();

Console.WriteLine("Starost: " + s.Age);

Kada je svojstvo Age postavljeno na vrijednost, poziva se skupni kod odjeljka. Ključna riječ value označava vrijednost koja je dodijeljena svojstvu. Prilikom čitanja vrijednosti svojstva Age, poziva se get kod odjeljka. Ovaj pristup kombinuje prednosti korišćenja metoda i omogućava vam da radite sa svojstvima jednako lako kao i sa poljima klase.

Provjera ispravnosti podataka u svojstvima . Ako pokušate postaviti nevažeću vrijednost starosne dobi (na primjer, 150), gornji kod će izvršiti provjeru valjanosti i odbiti vrijednost (nitko stariji od 120 godina ne može imati račun u našoj banci), ostavljajući starosnu vrijednost. Jedini način da saznate da li je svojstvu dodijeljena vrijednost je da provjerite vrijednost svojstva nakon ove operacije:

Račun s = novi račun();

int newAge = 150;

if (s.Age != newAge)

Console.WriteLine("Vrijednost starosti nije postavljena");

Sljedeći kod pokušava postaviti starost na nevažeću vrijednost od 150, a zatim provjerava da li je ta vrijednost postavljena. Ako se metoda Set koristi za dodjelu vrijednosti, može vratiti vrijednost false Ako ovo ne uspije, tada korištenje svojstva zahtijeva od korisnika da obavi malo više posla.

Različiti načini čitanja vrijednosti svojstva. Svojstva vam omogućavaju obavljanje drugih korisnih radnji.

public int AgeInMonths

vrati this.ageValue * 12;

Ovdje je opisano novo svojstvo AgeInMonths. Samo je za čitanje jer ne sadrži set sekciju. Vraća vrijednost starosti u mjesecima, koristeći istu vrijednost kao svojstvo Age. To znači da možete koristiti nekoliko razne načine da dobijete istu vrijednost. Moguće je kreirati svojstva samo za čitanje, a da se ne mogu direktno mijenjati, kao i svojstva samo za pisanje, iako se potonja rijetko koriste.

Svojstva vizuelnih elemenata . Ima smisla koristiti svojstva u opisu bankovnog računa, gdje trebate zaštititi podatke u objektima. Ali u Silverlight-u možete unijeti bilo koji tekst u element TextBlock i čini se da nema potrebe provjeravati valjanost unesene vrijednosti. Pokretanje ovog koda će usporiti proces unosa vrijednosti. Dakle, ako vrijednost teksta bude javna string, program će sadržavati manje koda i raditi brže.

Ali kada promijenimo tekst u elementu TextBlock, želimo da se promijeni i tekst na stranici Silverlight, na primjer kada program Adder prikaže rezultat. Ako bi program jednostavno promijenio vrijednost polja, Silverlight ne bi imao načina da sazna da poruku na ekranu treba ažurirati.

Međutim, ako se Text učini svojstvom, kada se ažurira vrijednost elementa TextBlock, pokrenut će se odgovarajući metod, koji može ažurirati pohranjenu vrijednost tekstualnog okvira i pozvati metodu za ažuriranje ekrana kako bi se prikazala nova vrijednost. Svojstva pružaju mogućnost manipulacije objektom kada se njegova vrijednost promijeni. Jednostavna operacija:

resultTextBlock.Text = "0";

može rezultirati nekoliko stotina C# operacija jer pohranjivanje nove vrijednosti u element TextBlock pokreće operacije ažuriranja slike ekrana.

Posljednje ažuriranje: 29.07.2018

Pored redovnih metoda, jezik C# pruža posebne metode pristupa koje se nazivaju svojstva. Oni pružaju lak pristup poljima klase, saznaju njihovu vrijednost ili ih postavljaju.

Standardni opis svojstva ima sljedeću sintaksu:

[access_modifier] return_type custom_name ( // kod svojstva)

Na primjer:

Class Person ( privatno ime niza; ime javnog stringa ( get ( povratno ime; ) set ( ime = vrijednost; ) ) )

Ovdje imamo privatno polje imena i javno svojstvo Name. Iako imaju skoro isto ime osim registra, ovo nije ništa drugo do stil njihova imena mogu biti proizvoljna i ne moraju se nužno podudarati.

Preko ovog svojstva možemo kontrolirati pristup varijabli name. Standardna definicija svojstva sadrži blokove get i set. U bloku get vraćamo vrijednost polja, au set bloku je postavljamo. Parametar vrijednosti predstavlja vrijednost koju treba proslijediti.

Ovu nekretninu možemo koristiti na sljedeći način:

Osoba p = nova osoba(); // Postavi svojstvo - aktivira se blok Set // vrijednost "Tom" je vrijednost proslijeđena svojstvu p.Name = "Tom"; // Dobiti vrijednost svojstva i dodijeliti je varijabli - aktivira se blok Get string personName = p.Name;

Možda se postavlja pitanje zašto su nam potrebna svojstva ako se u ovoj situaciji možemo snaći sa običnim poljima klase? Ali svojstva vam omogućavaju da dodate dodatnu logiku koja može biti neophodna, na primjer, kada se dodjeljuje vrijednost varijabli klase. Na primjer, moramo postaviti provjeru starosti:

Klasa Osoba (privatna int starost; javna int starost (podesi (ako (vrijed< 18) { Console.WriteLine("Возраст должен быть больше 17"); } else { age = value; } } get { return age; } } }

Blokovi set i get ne moraju biti prisutni u svojstvu u isto vrijeme. Ako je svojstvo definirano samo blokom get, tada je svojstvo samo za čitanje – možemo dobiti njegovu vrijednost, ali ne i postaviti. Suprotno tome, ako svojstvo ima samo postavljeni blok, tada je u to svojstvo moguće samo pisati - možete postaviti samo vrijednost, ali je ne možete dobiti:

Class Person ( ime privatnog stringa; // svojstvo samo za čitanje javni string Ime ( get ( povratno ime; ) ) private int age; // svojstvo samo za pisanje public int Age ( set ( age = value; ) ) )

Modifikatori pristupa

Možemo primijeniti modifikatore pristupa ne samo na cijelo svojstvo, već i na pojedinačne blokove - bilo get ili set:

Klasa Osoba ( privatni naziv stringa; javni string Ime ( get ( povratno ime; ) privatni skup ( ime = vrijednost; ) ) javna osoba (naziv niza, int starost) ( Ime = ime; Dob = starost; ) )

Sada možemo koristiti blok zatvorenog skupa samo u ovoj klasi - u njegovim metodama, svojstvima, konstruktoru, ali ne i u drugoj klasi:

Osoba p = nova osoba("Tom", 24); // Greška - set je deklarisan sa privatnim modifikatorom //p.Name = "John"; Console.WriteLine(p.Name);

Kada koristite modifikatore u svojstvima, postoji niz ograničenja koja treba uzeti u obzir:

    Modifikator za set ili get blok može se postaviti ako svojstvo ima i set i get blokove.

    Samo jedan set ili get blok može imati modifikator pristupa, ali ne oba

    Modifikator pristupa skupa ili get bloka mora biti restriktivniji od modifikatora pristupa svojstva. Na primjer, ako svojstvo ima modifikator public, tada blok set/get može imati samo modifikatore zaštićene interno, interno, zaštićeno, privatno

Enkapsulacija

Iznad smo vidjeli da se pristup privatnim varijablama klase uspostavlja kroz svojstva. Skrivanje stanja klase od vanjskih smetnji na ovaj način predstavlja mehanizam enkapsulacije, koji predstavlja jedan od ključnih koncepata objektno orijentisanog programiranja. (Vrijedi napomenuti da sam koncept enkapsulacije ima dosta različitih interpretacija, koje se ne preklapaju uvijek jedna s drugom) Upotreba modifikatora privatnog pristupa štiti varijablu od vanjskog pristupa. Za kontrolu pristupa, mnogi programski jezici koriste posebne metode, gettere i settere. U C#, njihovu ulogu obično igraju svojstva.

Na primjer, postoji neka klasa Account koja ima polje zbroja koje predstavlja iznos:

Račun razreda (javna int suma; )

Pošto je varijabla suma javna, možemo joj pristupiti bilo gdje u programu i promijeniti je, uključujući postavljanje bilo koje nevažeće vrijednosti, na primjer, negativne. Malo je vjerovatno da je takvo ponašanje poželjno. Stoga se enkapsulacija koristi za ograničavanje pristupa varijabli zbroja i sakrivanje unutar klase:

Klasni račun (privatni int zbroj; javni int zbroj (dobiti (povratni zbroj;) set (if (vrijednost > 0) ( suma=vrijednost; ) ) ))

Automatska svojstva

Svojstva kontrolišu pristup poljima klase. Međutim, šta ako imamo desetak ili više polja, onda bi definiranje svakog polja i pisanje svojstva istog tipa za njega bilo zamorno. Stoga su automatska svojstva dodana u .NET framework. Imaju skraćenu deklaraciju:

Klasa Osoba ( javni string Ime ( get; set; ) public int Age ( get; set; ) javna osoba (naziv niza, int starost) ( Ime = ime; Starost = starost; ) )

U stvari, ovdje se kreiraju i polja za svojstva, samo što ih ne kreira programer u kodu, već ih kompajler automatski generiše tokom kompilacije.

Koja je prednost automatskih svojstava, ako u suštini samo pristupaju automatski kreiranoj varijabli, zašto ne bi direktno pristupili varijabli bez automatskih svojstava? Činjenica je da u svakom trenutku, ako je potrebno, možemo proširiti auto-svojstvo u regularno svojstvo i dodati mu određenu logiku.

Vrijedi uzeti u obzir da ne možete kreirati automatsko svojstvo samo za pisanje, kao što je slučaj sa standardnim svojstvima.

Automatskim svojstvima se mogu dodijeliti zadane vrijednosti (inicijalizacija automatskih svojstava):

Class Person ( public string Name ( get; set; ) = "Tom"; public int Age ( get; set; ) = 23; ) class Program ( static void Main (string args) ( Person person = new Person(); Console .WriteLine(person.Name); // Tom Console.WriteLine(person.Age);

A ako ne navedemo vrijednosti svojstava Ime i Dob za objekt Person, tada će se primijeniti zadane vrijednosti.

Automatska svojstva također mogu imati modifikatore pristupa:

Klasa Osoba (javni niz Ime (privatni skup; get;) javna Osoba(niz n) (Naziv = n; ))

Možemo ukloniti postavljeni blok i auto svojstvo učiniti samo za čitanje. U ovom slučaju, da bi se pohranila vrijednost ovog svojstva, za njega će se implicitno kreirati polje sa modifikatorom samo za čitanje, pa treba uzeti u obzir da se takva get-properties mogu postaviti ili iz konstruktora klase, kao u primjeru iznad, ili prilikom inicijalizacije svojstva:

Class Person (javni niz Ime (get;) = "Tom")

Skraćenica za svojstva

Baš kao i metode, možemo skratiti svojstva. Na primjer:

Class Person ( naziv privatnog stringa; // ekvivalent javnom stringu Ime ( get ( povratno ime; ) ) javni string Ime => ime; )

Implementacija interfejsa Set je neuređena kolekcija koja ne može sadržavati duple podatke.

Interfejs Set uključuje sljedeće metode:

MetodaOpis
dodaj (objekat o) Dodavanje elementa u kolekciju ako nedostaje. Vraća true ako je element dodan.
addAll (kolekcija c) Dodavanje predmeta kolekcije ako nedostaju.
clear() Brisanje kolekcije.
sadrži (Objekat o) Provjera prisutnosti elementa u skupu. Vraća true ako je element pronađen.
sadrži sve (kolekcija c) Provjera prisutnosti kolekcije u setu. Vraća true ako su svi elementi sadržani u skupu.
jednako (Objekat o) Provjera jednakosti.
hashCode() Dobijanje hash koda skupa.
prazno je() Provjera prisutnosti elemenata. Vraća true ako nema elemenata u kolekciji.
iterator() Funkcija za dobivanje iteratora kolekcije.
ukloniti (Objekat o) Uklanjanje elementa iz skupa.
ukloni sve (kolekcija c) Uklanja sve elemente proslijeđene kolekcije iz skupa.
zadržati sve (kolekcija c) Uklanjanje elemenata koji ne pripadaju proslijeđenoj kolekciji.
veličina() Broj elemenata kolekcije
toArray() Pretvaranje skupa u niz elemenata.
toArray(T a) Pretvaranje skupa u niz elemenata. Za razliku od prethodne metode, koja vraća niz objekata tipa Object, ovu metodu vraća niz objekata tipa proslijeđenog u parametru.

Za povezivanje porodice Set odnose HashSet, TreeSet I LinkedHashSet. U setovima Set Različite implementacije koriste različit redoslijed pohranjivanja elemenata. U HashSet-u, redoslijed elemenata je optimiziran za brzo pretraživanje. Kontejner TreeSet pohranjuje objekte sortirane uzlaznim redoslijedom. LinkedHashSet pohranjuje elemente redoslijedom kojim su dodani.

HashSet Dataset

HashSet konstruktori:

// Kreirajte prazan skup sa početnim kapacitetom od 16 i zadanim faktorom opterećenja od 0,75 public HashSet(); // Kreiranje skupa od elemenata kolekcije public HashSet(Collection c); // Kreirajte skup sa specificiranim početnim kapacitetom i // zadanim faktorom opterećenja (0,75) public HashSet(int initialCapacity); // Kreirajte skup sa specificiranim početnim kapacitetom i // faktorom opterećenja public HashSet(int initialCapacity, float loadFactor);

HashSet Methods

  • public int size()
  • javni boolean isEmpty()
  • javni boolean add (Objekat o)
  • public boolean addAll (kolekcija c)
  • javni logički ukloni (Objekat o)
  • public boolean removeAll (kolekcija c)
  • javni boolean sadrži (Objekat o)
  • javna void clear()
  • javni klon objekta()
  • javni Iterator iterator()
  • javni objekat toArray()
  • javni boolean retainAll (kolekcija c)

HashSet sadrži metode slične ArrayList . Izuzetak je metoda add(Object o), koja dodaje objekt samo ako nedostaje. Ako se doda objekt, metoda add vraća true, u suprotnom netočno.

Primjer korištenja HashSeta:

HashSet hashSet = novi HashSet (); hashSet.add("Krompir"); hashSet.add("Šargarepa"); hashSet.add("Cvekla"); hashSet.add("Krastavci"); // Sljedeći unos ne bi trebao biti u skupu hashSet.add("Potatoes"); // Ispis zadane veličine na konzoli System.out.println("HashSet size = " + hashSet.size()); // Ispis unosa iteratora na konzolu itr = hashSet.iterator(); while (itr.hasNext()) ( System.out.println(itr.next().toString()); )

Trebali bismo vidjeti samo 4 unosa u konzoli. Treba napomenuti da će redosled kojim se zapisi dodaju skupu biti nepredvidiv. HashSet koristi heširanje za ubrzanje preuzimanja.

Primjer upotrebe HashSet sa cjelobrojnim vrijednostima. U skup dodajemo vrijednosti od 0 do 9 od 25 mogućih nasumično odabranih vrijednosti - neće biti dupliranja.

Random random = novi Random(30); Set iset = novi HashSet (); for(int i = 0; i< 25; i++) iset.add(random.nextInt(10)); // Вывести в консоль записи Iterator

Treba napomenuti da je implementacija HashSet nije sinhronizovano. Ako više niti istovremeno pristupa hash skupu, a jedna ili više niti moraju modificirati skup, tada on mora biti eksterno sinkroniziran. Ovo je najbolje uraditi u vrijeme kreiranja kako bi se spriječio slučajan nesinhroniziran pristup skupu:

Set set = Collections.synchronizedSet(novi HashSet ());

LinkedHashSet skup podataka

Klasa LinkedHashSet nasljeđuje HashSet bez dodavanja novih metoda i održava povezanu listu elemenata skupa redosledom kojim su umetnuti. Ovo omogućava urednu iteraciju umetanja u skup.

LinkedHashSet konstruktori:

// Kreirajte prazan skup s početnim kapacitetom (16) i zadanom faktorom opterećenja (0,75) public LinkedHashSet() // Kreirajte skup od elemenata kolekcije public LinkedHashSet(Collection c) // Kreirajte skup sa specificiranim početnim kapacitet i vrijednost faktora default load (0.75) public LinkedHashSet(int initialCapacity) // Kreirajte skup sa specificiranim početnim kapacitetom i faktorom opterećenja public LinkedHashSet(int initialCapacity, float loadFactor)

Kao i HashSet, LinkedHashSet nije sinhronizovano. Stoga, kada koristite ovu implementaciju u aplikaciji s mnogo niti, od kojih neke mogu napraviti promjene u skupu, sinhronizaciju treba izvršiti u fazi kreiranja:

Set set = Collections.synchronizedSet(novi LinkedHashSet ());

TreeSet Dataset

Klasa TreeSet kreira kolekciju koja koristi stablo za pohranjivanje elemenata. Objekti se pohranjuju sortiranim uzlaznim redoslijedom.

TreeSet konstruktori:

// Kreiraj prazan skup stabala, sortiran prema prirodnom // redoslijedu njegovih elemenata TreeSet() // Kreiraj skup stabala koji sadrži elemente u navedenom skupu, // sortiran prema prirodnom redoslijedu njegovih elemenata. TreeSet(kolekcijac) // Kreirajte prazan skup stabala, sortiran prema komparatoru TreeSet(Comparatorkomparator) // Kreirajte skup stabla koji sadrži iste elemente i koristi // isti redoslijed kao specificirani sortirani skup TreeSet(SortedSet s)

TreeSet Methods

  • boolean add (Objekat o)
  • boolean addAll(kolekcijac)
  • Strop objekta (Objekat o)
  • void clear()
  • TreeSet clone()
  • Comparatorkomparator()
  • boolean sadrži (Objekat o)
  • Iterator descendingIterator()
  • NavigableSet descendingSet()
  • Prvo objekt()
  • Pod objekta (Objekat o)
  • SortedSet slušalice (E e)
  • NavigableSet slušalice (E e, uključujući boolean)
  • Objekt viši (Objekat o)
  • boolean isEmpty()
  • Iterator iterator()
  • Elast()
  • E niže (E e)
  • E anketaFirst()
  • E anketaPosljednja()
  • boolean remove (Objekat o)
  • int size()
  • Spliterator spliter()
  • NavigableSet podskup (E odElementa, Boolean od Inkluzivnog, E doElementa, Boolov do Inkluzivnog)
  • SortedSet podskup (E odElementa, E doElementa)
  • SortedSet tailSet(E fromElement)
  • NavigableSet tailSet(E odElementa, uključivo boolean)
  • U sljedećem izmijenjenom primjeru iz upotrebe TreeSet Vrijednosti će biti iznesene na konzolu u naređenom obliku.

    SortedSet treeSet = novi TreeSet (); treeSet.add("Cvekla"); treeSet.add("Krastavci"); treeSet.add("Paradajz"); treeSet.add("Krompir"); treeSet.add("Šargarepa"); // Ovaj unos ne bi trebao biti uključen u set treeSet.add("Potatoes"); // Ispis veličine skupa na konzoli System.out.println("treeSet size = " + treeSet.size()); // Ispis unosa iteratora na konzolu itr = treeSet.iterator(); while (itr.hasNext()) ( System.out.println(itr.next().toString()); ) Random random = new Random(30); SortedSet iset = novi TreeSet (); for(int i = 0; i< 25; i++) iset.add(random.nextInt(10)); // Вывести в консоль записи Iteratoritr = iset.iterator(); while (itr.hasNext()) ( System.out.println(itr.next().toString()); )

    Joseph Crawford, jedan od mojih čitatelja, pročitao je članak o tome kako ne volim pisati gettere i settere i predložio je da bih mogao koristiti magične metode __get i __set.
    Reći ću vam zašto nije dobra ideja da ih koristite na normalan način. Takođe ću vam ispričati priču u kojoj su zaista dobro došli - kreiranje statičkih tipova u PHP-u (dinamički jezik).
    Za one koji nisu upoznati s metodama __get i __set, to su dvije "magične" metode koje rade ovako:
    klasa Animal ( funkcija __get($property) ( //... ) funkcija __set($property, $value) ( ​​//... ) ) $cow = nova životinja; $cow->weight = "1 tona"; // isto kao $cow->__set("weight", "1 ton") print $cow->weight; // isto kao print $cow->__get("weight");

    Obično se gore navedene metode koriste za kreiranje dinamičkih svojstava. Kakav zaključak se može izvući iz ovoga? Ako želite da kreirate bilo koja nasumična svojstva, samo koristite hash (aka niz sa ključevima).
    Šta je dobro kod gettera i setera?
    Hajde da pogledamo:
    klasa Životinja (javno $weightInKgs; ) $krava = nova životinja; $cow->weightInKgs = -100;

    Šta? Negativna težina? Ovo je sa većine tačaka gledišta netačno.
    Krava ne bi trebalo da ima manje od 100 kg (mislim da je tako:). Unutar 1000 je prihvatljivo.
    Kako možemo osigurati takvo ograničenje?
    Korištenje __get i __set je prilično brz način.
    class Animal (privatne $properties = array(); javna funkcija __get($name) ( if(!empty($this->properties[$name])) (vrati $this->properties[$name]; ) else ( throw new Exception("Nedefinirano svojstvo ".$name." referencirano." ) ) javna funkcija __set($name, $value) (if($name == "težina") ( if($value< 100) { throw new Exception("The weight is too small!") } } $this->svojstva[$name] = $vrijednost; ) ) $krava = nova životinja; $cow->weightInKgs = -100; // izbacuje izuzetak

    Šta ako imate klasu sa 10-20 svojstava i provjeravate ih? U ovom slučaju, nevolje su neizbježne.
    javna funkcija __set($name, $value) (if($name == "težina") ( if($value< 100) { throw new Exception("The weight is too small!") } if($this->težina != $težina) ( Shepherd::notifyOfWeightChange($cow, $weight); ) ) if($name == "noge") ( if($value != 4) (baci novi izuzetak("Broj nogu je premalo ili preveliko") ) $this->numberOfLegs = $numberOfLegs; $this->numberOfHooves = $numberOfLegs; ) if($name == "milkType") ( .... shvatili ste ... ) $this->properties[$name] = $value; )

    S druge strane, getteri i setteri su najbolji kada je u pitanju validacija podataka.
    klasa Animal (privatna $weight; privatno $numberOfLegs; privatno $numberOfHooves; javni $nickname; javna funkcija setNumberOfLegs($numberOfLegs) ( if ($numberOfLegs != 100) (baci novi izuzetak("Broj nogu je premali ili previše big"); ) $this->numberOfLegs = $numberOfLegs; $this->numberOfHooves = $numberOfLegs; ) javna funkcija getNumberOfLegs() (vrati $this->numberOfLegs; ) javna funkcija setWeight($weight) ( if ($weight< 100) { throw new Exception("The weight is too small!"); } if($this->težina != $težina) ( Shepherd::notifyOfWeightChange($cow, $weight); ) $this->weight = $weight; ) javna funkcija getWeight() (vrati $this->weight; ) )

    Ništa se ne može porediti sa funkcijama prečica (dobi, postavi;) iz C#. Vjerovatno će se takva podrška uskoro pojaviti u PHP-u, ali za sada nemojmo se opuštati...
    Svaka metoda je odgovorna samo za svoje područje, što čini kod lakšim za navigaciju. Još uvijek ima puno koda, ali je čišći od __set verzije. Postoji dobar heuristički pristup, koji je sljedeći: ako vaša metoda (funkcija) zauzima više od 1 ekrana, trebate je skratiti. Ovo će učiniti kod lakšim za čitanje.
    Pohranjujemo i poslovnu logiku. Kopita će uvijek biti onoliko koliko i nogu, a ako primijetimo promjenu težine stoke, odmah ćemo obavijestiti pastira.
    Pošto nas ne zanimaju nadimci krava niti ih provjeravamo, neka podaci budu javni bez gettera i settera.
    Opet, nisam baš napisao sve ove gettere i settere - PHP Storm je to uradio za mene. Jednostavno sam napisao sledeće:
    klasa Animal (privatno $weight; privatno $numberOfLegs; )

    I pritisnuli Alt+Insert -> Getters and setters. PHPStorm je sve generisao automatski.
    Sada, kao dodatna prednost PHP Storm-a, kada radim sa getterima i setterima, imam mogućnost da koristim funkciju automatskog dovršavanja:

    U slučaju __get nemam ovu opciju, mogu samo ovo napisati:
    $krava->težina = -100

    Sada krava "teži" (težine) minus 100 kg.
    Mogu zaboraviti da je ovo težina u kg, samo napišite težinu i sve će raditi.
    Dakle, getteri i setteri mogu biti vrlo korisni (ali ih ipak nemojte obožavati, niste Java programer). Ako želite samo besplatna svojstva, koristite niz:
    $cow = array("težina" => 100, "noge" => 4);

    Ovaj trik je mnogo lakše izvesti nego __get i __set.
    Ali, ako želite biti sigurni da vaši podaci uvijek imaju samo važeće vrijednosti, koristite setere s validacijom. Ako imate integrisano razvojno okruženje (IDE) kao što je PHP Storm, svideće vam se setteri jer su tako jednostavni za korišćenje. Umjesto $cow->setLegs() za PHP Storm biće dovoljno ukucati cosl. Yes Easy! Nema više grešaka u kucanju i možete vidjeti koje parametre metoda uzima.
    Metoda __set ima još jedan nedostatak. Prihvata samo 1 parametar. Šta ako trebate 2? Na primjer, kao ovdje: $store1->setPrice("item-1", 100). Morate postaviti cijenu proizvoda u trgovini. Metoda __set vam to neće dozvoliti, ali će seter.

    mob_info