Pata na uweke mbinu. Kuunda njia za kupata na kuweka. Seti ya data ya HashSet

Utekelezaji wa Kiolesura Weka ni mkusanyiko ambao haujapangwa ambao hauwezi kuwa na nakala ya data.

Kiolesura Weka inajumuisha mbinu zifuatazo:

NjiaMaelezo
ongeza (Kitu o) Kuongeza kipengee kwenye mkusanyiko ikiwa hakipo. Hurejesha kweli ikiwa kipengele kiliongezwa.
addAll(Mkusanyiko c) Kuongeza vitu vya kukusanya ikiwa havipo.
wazi () Kusafisha mkusanyiko.
ina (Kitu o) Kuangalia uwepo wa kipengele katika seti. Hurejesha kweli ikiwa kipengele kitapatikana.
inaYote(Mkusanyiko c) Kuangalia uwepo wa mkusanyiko katika seti. Hurejesha kweli ikiwa vipengele vyote vimo kwenye seti.
sawa (Kitu o) Ukaguzi wa usawa.
Msimbo wa hash() Kupata hashCode ya seti.
isEmpty() Kuangalia uwepo wa vipengele. Huleta kweli ikiwa hakuna vipengele kwenye mkusanyiko.
iterator() Kazi ya kupata kiboreshaji cha mkusanyiko.
ondoa (kitu o) Kuondoa kipengele kutoka kwa seti.
OndoaYote(Mkusanyiko c) Huondoa vipengele vyote vya mkusanyiko uliopitishwa kutoka kwa seti.
kuhifadhi (Mkusanyiko c) Kuondoa vipengele ambavyo si vya mkusanyiko uliopitishwa.
saizi() Idadi ya vipengele vya mkusanyiko
toArray() Kubadilisha seti kuwa safu ya vipengele.
kwaArray(T a) Kubadilisha seti kuwa safu ya vipengele. Tofauti na njia ya awali, ambayo inarudisha safu ya vitu vya aina ya Kitu, njia hii inarudisha safu ya vitu vya aina iliyopitishwa kwenye parameta.

Ili interface ya familia Weka kuhusiana HashSet, TreeSet Na ImeunganishwaHashSet. Katika seti Weka Utekelezaji tofauti hutumia mpangilio tofauti wa kuhifadhi vitu. Katika HashSet, mpangilio wa vipengele umeboreshwa kwa ajili ya utafutaji wa haraka. Chombo cha TreeSet huhifadhi vitu vilivyopangwa kwa mpangilio wa kupanda. LinkedHashSet huhifadhi vipengee kwa mpangilio ambavyo viliongezwa.

Seti ya data ya HashSet

Waundaji wa HashSet:

// Unda seti tupu na uwezo wa awali wa 16 na kipengele cha kawaida cha mzigo wa 0.75 HashSet ya umma (); // Kuunda seti kutoka kwa vipengele vya mkusanyiko wa HashSet ya umma (Mkusanyiko c); // Unda seti iliyo na uwezo uliobainishwa wa awali na // kipengele cha upakiaji chaguo-msingi (0.75) HashSet ya umma (int initialCapacity); // Unda seti iliyo na uwezo maalum wa awali na // HashSet ya upakiaji ya umma (int initialCapacity, float loadFactor);

Mbinu za HashSet

  • saizi ya int ya umma ()
  • boolean ya umma isEmpty()
  • nyongeza ya boolean ya umma (Kitu o)
  • public boolean addAll(Mkusanyiko c)
  • ondoa boolean ya umma (Kitu o)
  • public boolean removeAll(Mkusanyiko c)
  • boolean ya umma ina(Object o)
  • utupu wa umma wazi ()
  • kitu cha umma clone()
  • kiboreshaji tena cha umma ()
  • Public Object toArray()
  • uhifadhi wa boolean kwa umma(Mkusanyiko c)

HashSet ina njia zinazofanana na ArrayList . Isipokuwa ni njia ya kuongeza(Object o), ambayo huongeza tu kitu ikiwa haipo. Ikiwa kipengee kimeongezwa, mbinu ya kuongeza itarudi kuwa kweli, vinginevyo sivyo.

Mfano wa kutumia HashSet:

HashSet hashSet = HashSet mpya (); hashSet.add("Viazi"); hashSet.add("Karoti"); hashSet.add("Beets"); hashSet.add("Matango"); // Ingizo linalofuata lisiwe katika seti ya hashSet.add("Viazi"); // Chapisha ukubwa uliowekwa kwenye console System.out.println("HashSet size = " + hashSet.size()); // Chapisha maingizo ya Iterator ili kufariji itr = hashSet.iterator(); wakati (itr.hasNext()) ( System.out.println(itr.next().toString());)

Tunapaswa kuona maingizo 4 pekee kwenye koni. Ikumbukwe kwamba utaratibu ambao rekodi zinaongezwa kwenye seti itakuwa haitabiriki. HashSet hutumia hashing kuharakisha urejeshaji.

Mfano wa matumizi HashSet yenye maadili kamili. Tunaongeza maadili kutoka 0 hadi 9 kati ya 25 zinazowezekana zilizochaguliwa kwa nasibu kwenye seti - hakutakuwa na kurudia.

Nasibu nasibu = Nasibu mpya(30); Weka ist = HashSet mpya (); kwa (int i = 0; i< 25; i++) iset.add(random.nextInt(10)); // Вывести в консоль записи Iterator

Ikumbukwe kwamba utekelezaji HashSet haisawazishi. Ikiwa nyuzi nyingi hufikia seti ya heshi kwa wakati mmoja, na nyuzi moja au zaidi lazima zibadilishe seti, basi lazima zilandanishwe nje. Hii inafanywa vyema wakati wa uundaji ili kuzuia ufikiaji usiosawazishwa kwa seti:

Weka set = Collections.synchronizedSet(HashSet mpya ());

LinkedHashSet Dataset

Darasa ImeunganishwaHashSet kurithi HashSet bila kuongeza mbinu mpya, na kudumisha orodha iliyounganishwa ya vipengele vya kuweka kwa utaratibu ambao waliingizwa. Hii inaruhusu kurudia kwa utaratibu wa kuingizwa kwenye seti.

Waundaji wa LinkedHashSet:

// Unda seti tupu iliyo na uwezo wa awali (16) na thamani ya kipengele cha upakiaji chaguo-msingi (0.75) ya umma LinkedHashSet() // Unda seti kutoka kwa vitu vya mkusanyiko vya umma LinkedHashSet(Mkusanyiko c) // Unda seti iliyo na muundo maalum wa awali. uwezo na mzigo chaguo-msingi wa kipengele (0.75) umma LinkedHashSet(int initialCapacity) // Unda seti iliyo na uwezo maalum wa awali na kipengele cha upakiaji cha umma LinkedHashSet(int initialCapacity, float loadFactor)

Pia HashSet, ImeunganishwaHashSet haisawazishi. Kwa hivyo, wakati wa kutumia utekelezaji huu katika programu iliyo na nyuzi nyingi, ambazo zingine zinaweza kufanya mabadiliko kwenye seti, maingiliano yanapaswa kufanywa katika hatua ya uundaji:

Weka set = Collections.synchronizedSet(New LinkedHashSet ());

Seti ya data ya TreeSet

Darasa TreeSet huunda mkusanyiko unaotumia mti kuhifadhi vitu. Vitu huhifadhiwa kwa mpangilio uliopangwa wa kupanda.

Waundaji wa TreeSet:

// Unda miti tupu, iliyopangwa kulingana na utaratibu wa asili // wa vipengele vyake TreeSet() // Unda miti iliyo na vipengele katika seti maalum, // iliyopangwa kulingana na utaratibu wa asili wa vipengele vyake. TreeSet (Mkusanyikoc) // Unda seti tupu ya mti, iliyopangwa kulingana na kulinganisha TreeSet(Comparatorcomparator) // Unda seti ya mti iliyo na vitu sawa na kutumia // mpangilio sawa na seti maalum iliyopangwa ya TreeSet (SortedSet s)

Mbinu za Miti

  • kuongeza boolean (Kitu o)
  • boolean addAll(Mkusanyikoc)
  • Dari ya kitu (Kitu o)
  • utupu wazi ()
  • TreeSet clone()
  • Kilinganishikulinganisha()
  • boolean ina(Kitu o)
  • Iterator kushukaIterator()
  • NavigableSet kushukaSet()
  • Kitu kwanza()
  • Sakafu ya kitu (Kitu o)
  • SortedSet headSet(E e)
  • NavigableSet headSet(E e, pamoja na boolean)
  • Kitu cha juu (Kitu o)
  • boolean isEmpty()
  • Iterator iterator()
  • Elast()
  • E chini (E e)
  • E pollFirst()
  • E pollLast()
  • kuondoa boolean (Kitu o)
  • saizi ya ndani ()
  • Mgawanyiko mgawanyiko ()
  • NavigableSet Seti ndogo (E kutoka kwa Kipengele, boolean kutoka kwa Pamoja, E hadi Element, boolean hadiInayojumuisha)
  • SortedSet Seti ndogo (E kutoka kwa Kipengele, E hadi Kipengele)
  • SortedSet tailSet(E fromElement)
  • NavigableSet tailSet(E kutoka Element, pamoja na boolean)
  • Katika mfano ufuatao uliobadilishwa kutoka kwa kutumia TreeSet Thamani zitatolewa kwa kiweko katika fomu iliyoagizwa.

    SortedSet treeSet = TreeSet mpya (); treeSet.add("Beets"); treeSet.add("Matango"); treeSet.ongeza("Nyanya"); treeSet.add("Viazi"); treeSet.ongeza("Karoti"); // Ingizo hili lisijumuishwe kwenye set treeSet.add("Viazi"); // Chapisha ukubwa wa seti kwenye console System.out.println("treeSet size = " + treeSet.size()); // Chapisha maingizo ya Iterator ili kufariji itr = treeSet.iterator(); wakati (itr.hasNext()) ( System.out.println(itr.next().toString()); ) Nasibu nasibu = Nasibu mpya(30); SortedSet iset = TreeSet mpya (); kwa (int i = 0; i< 25; i++) iset.add(random.nextInt(10)); // Вывести в консоль записи Iteratoritr = iset.iterator(); wakati (itr.hasNext()) ( System.out.println(itr.next().toString());)

    Sasisho la mwisho: 07/29/2018

    Mbali na mbinu za kawaida, lugha ya C # hutoa mbinu maalum za kufikia zinazoitwa mali. Wanatoa ufikiaji rahisi kwa sehemu za darasa, kujua thamani yao, au kuziweka.

    Maelezo ya kawaida ya mali yana syntax ifuatayo:

    [access_modifier] return_type custom_name ( // msimbo wa mali)

    Kwa mfano:

    Mtu wa Darasa (jina la mfuatano wa kibinafsi; Jina la mfuatano wa umma ( pata ( rudisha jina; ) weka ( jina = thamani; ) ) )

    Hapa tuna uwanja wa jina la kibinafsi na mali ya Jina la umma. Ingawa wana karibu jina moja isipokuwa rejista, hii sio kitu zaidi ya mtindo; majina yao yanaweza kuwa ya kiholela na sio lazima yalingane.

    Kupitia mali hii tunaweza kudhibiti ufikiaji wa kutofautisha kwa jina. Ufafanuzi wa kawaida wa mali una vizuizi vya kupata na kuweka. Katika kizuizi cha kupata tunarudi thamani ya shamba, na katika kizuizi kilichowekwa tunaiweka. Kigezo cha thamani kinawakilisha thamani ya kupitishwa.

    Tunaweza kutumia mali hii kama hii:

    Mtu p = Mtu mpya(); // Weka mali - kizuizi cha Kuweka kimeanzishwa // thamani "Tom" ni thamani iliyopitishwa kwa mali p.Name = "Tom"; // Pata thamani ya mali na uikabidhi kwa kutofautisha - Kizuizi cha Pata mtuName = p.Name kimeanzishwa;

    Labda swali linaweza kutokea, kwa nini tunahitaji mali ikiwa tunaweza kupata na uwanja wa kawaida wa darasa katika hali hii? Lakini mali hukuruhusu kuongeza mantiki ya ziada ambayo inaweza kuwa muhimu, kwa mfano, wakati wa kugawa thamani kwa kutofautisha kwa darasa. Kwa mfano, tunahitaji kuweka ukaguzi wa umri:

    Mtu wa Darasa (umri wa kibinafsi; Umri wa int wa umma ( weka ( ikiwa (thamani< 18) { Console.WriteLine("Возраст должен быть больше 17"); } else { age = value; } } get { return age; } } }

    Seti na vizuizi vya kupata sio lazima viwepo katika mali kwa wakati mmoja. Ikiwa mali inafafanuliwa tu na block block, basi mali inasomwa tu - tunaweza kupata thamani yake, lakini sio kuiweka. Kinyume chake, ikiwa mali ina kizuizi tu, basi mali hiyo inaweza kuandikwa tu - unaweza kuweka tu thamani, lakini huwezi kuipata:

    Mtu wa Hatari (jina la mfuatano wa kibinafsi; // mali ya kusoma pekee Jina la mfuatano wa umma ( pata ( rudisha jina; ) ) umri wa int wa kibinafsi; // mali ya kuandika tu Umri wa int Umri ( weka ( umri = thamani; ) ) )

    Virekebishaji vya ufikiaji

    Tunaweza kutumia virekebishaji vya ufikiaji sio tu kwa mali nzima, lakini pia kwa vizuizi vya mtu binafsi - ama pata au weka:

    Mtu wa Darasa ( jina la mfuatano wa kibinafsi; Jina la mfuatano wa umma ( pata ( rudisha jina; ) seti ya faragha ( jina = thamani; ) ) Mtu wa umma(jina la mfuatano, umri wa ndani) ( Jina = jina; Umri = umri; ) )

    Sasa tunaweza kutumia kizuizi kilichofungwa tu katika darasa hili - kwa njia zake, mali, mjenzi, lakini sio katika darasa lingine:

    Mtu p = Mtu mpya("Tom", 24); // Hitilafu - seti inatangazwa na kiboreshaji cha kibinafsi //p.Name = "John"; Console.WriteLine(p.Name);

    Wakati wa kutumia marekebisho katika mali, kuna idadi ya vizuizi vya kuzingatia:

      Kirekebishaji cha seti au zuio la kupata kinaweza kuwekwa ikiwa sifa imeweka na kupata vizuizi.

      Seti moja tu au kizuizi cha kupata kinaweza kuwa na kirekebishaji cha ufikiaji, lakini sio zote mbili

      Kirekebishaji cha ufikiaji cha seti au zuio la kupata lazima kiwe na vizuizi zaidi kuliko kirekebisha ufikiaji wa mali. Kwa mfano, ikiwa mali ina kirekebishaji cha umma, basi set/get block inaweza tu kulindwa virekebishaji vya ndani, vya ndani, vilivyolindwa, na vya faragha.

    Ufungaji

    Tuliona hapo juu kuwa ufikiaji wa anuwai za darasa la kibinafsi huanzishwa kupitia mali. Kuficha hali ya darasa kutokana na kuingiliwa kwa nje kwa njia hii inawakilisha utaratibu wa encapsulation, ambayo inawakilisha mojawapo ya dhana muhimu za programu inayolenga kitu. (Inafaa kumbuka kuwa dhana yenyewe ya encapsulation ina tafsiri chache tofauti, ambazo haziingiliani kila wakati) Matumizi ya virekebishaji vya ufikiaji wa kibinafsi hulinda tofauti kutoka kwa ufikiaji wa nje. Ili kudhibiti ufikiaji, lugha nyingi za programu hutumia njia maalum, viboreshaji na seti. Katika C #, jukumu lao kawaida huchezwa na mali.

    Kwa mfano, kuna darasa la Akaunti ambalo linafafanua sehemu ya jumla inayowakilisha jumla:

    Akaunti ya Darasa (jumla ya malipo ya umma;)

    Kwa kuwa kigezo cha jumla ni cha umma, tunaweza kuipata popote kwenye programu na kuibadilisha, ikiwa ni pamoja na kuweka thamani yoyote isiyo sahihi, kwa mfano, hasi. Haiwezekani kwamba tabia hiyo ni ya kuhitajika. Kwa hivyo, encapsulation hutumiwa kuzuia ufikiaji wa kutofautisha kwa jumla na kuificha ndani ya darasa:

    Akaunti ya Darasa (jumla ya int ya kibinafsi; Jumla ya int ya umma ( pata (jumla ya kurejesha;) weka ( ikiwa (thamani > 0) ( jumla=thamani; ) ) ) )

    Mali ya otomatiki

    Sifa hudhibiti ufikiaji wa nyanja za darasa. Walakini, vipi ikiwa tunayo sehemu kadhaa au zaidi, kisha kufafanua kila uwanja na kuandika mali ya aina sawa itakuwa ngumu. Kwa hiyo, mali za moja kwa moja ziliongezwa kwenye mfumo wa NET. Wana tamko fupi:

    Mtu wa Hatari ( Jina la mfuatano wa umma ( pata; weka; ) Umri wa int wa umma ( pata; weka; ) Mtu wa umma(jina la kamba, umri wa ndani) ( Jina = jina; Umri = umri; ) )

    Kwa kweli, uwanja wa mali pia huundwa hapa, tu haujaundwa na programu kwenye msimbo, lakini mkusanyaji huzalisha moja kwa moja wakati wa mkusanyiko.

    Ni faida gani ya mali-otomatiki, ikiwa kimsingi wanapata tu kigeu kilichoundwa kiotomatiki, kwa nini usifikie moja kwa moja kigezo bila sifa za kiotomatiki? Ukweli ni kwamba wakati wowote, ikiwa ni lazima, tunaweza kupanua mali-otomatiki kuwa mali ya kawaida na kuongeza mantiki fulani kwake.

    Inafaa kuzingatia kuwa huwezi kuunda mali ya kuandika kiotomatiki, kama ilivyo kwa mali ya kawaida.

    Sifa za kiotomatiki zinaweza kupewa maadili chaguo-msingi (kuanzisha sifa otomatiki):

    Mtu wa Hatari ( Jina la mfuatano wa umma ( pata; weka; ) = "Tom"; Umri wa int hadharani ( pata; weka; ) = 23; ) Mpango wa darasa ( utupu tuli kuu(string args) ( Person person = new Person(); Console .WriteLine(person.Name); // Tom Console.WriteLine(mtu.Umri); // 23 Console.Soma(); ) )

    Na ikiwa hatutabainisha thamani za Jina na sifa za Umri kwa kitu cha Mtu, basi maadili chaguo-msingi yatatumika.

    Sifa za kiotomatiki pia zinaweza kuwa na virekebishaji vya ufikiaji:

    Mtu wa Darasa ( Jina la kamba ya umma ( seti ya kibinafsi; pata;) Mtu wa umma( kamba n) ( Jina = n; ) )

    Tunaweza kuondoa kizuizi kilichowekwa na kufanya kipengele cha otomatiki kusomeka pekee. Katika kesi hii, ili kuhifadhi thamani ya mali hii, uwanja ulio na kirekebishaji pekee utaundwa kwa ajili yake, kwa hivyo inapaswa kuzingatiwa kuwa mali kama hizo zinaweza kuwekwa ama kutoka kwa mjenzi wa darasa, kama katika mfano. hapo juu, au wakati wa kuanzisha mali:

    Mtu wa Darasa ( Jina la kamba ya umma ( pata;) = "Tom")

    Nukuu ya mkato ya mali

    Kama vile mbinu, tunaweza kufupisha mali. Kwa mfano:

    Mtu wa Hatari (jina la mfuatano wa kibinafsi; // sawa na Jina la mfuatano wa umma ( pata ( rudisha jina; ) ) Jina la mfuatano wa umma => jina; )

    Joseph Crawford, mmoja wa wasomaji wangu, alisoma makala kuhusu jinsi sipendi kuandika getters na setters na akapendekeza kwamba ningeweza kutumia uchawi __get and __seti mbinu.
    Nitakuambia kwa nini sio wazo nzuri kuzitumia kwa njia ya kawaida. Pia nitakuambia hadithi ambapo zilikuja kwa manufaa - kuunda aina tuli katika PHP (lugha yenye nguvu).
    Kwa wale wasiofahamu __get na __seti mbinu, ni njia mbili za "uchawi" zinazofanya kazi kama hii:
    darasa Mnyama ( kazi __get($property) ( //... ) kazi __set($property, $value) ( //... ) ) $cow = Mnyama mpya; $ ng'ombe-> uzito = "tani 1"; // sawa na $cow->__set("uzito", "tani 1") chapisha $cow->uzito; // sawa na kuchapisha $cow->__get("uzito");

    Kwa kawaida, njia zilizo hapo juu hutumiwa kuunda mali zenye nguvu. Ni hitimisho gani linaweza kutolewa kutokana na hili? Ikiwa unataka kuunda mali yoyote ya nasibu, tumia tu heshi (aka safu na funguo).
    Je! ni nini kizuri kuhusu watengenezaji na wawekaji?
    Hebu tuangalie:
    darasa Mnyama ( public $weightInKgs; ) $cow = new Animal; $ ng'ombe->weightInKgs = -100;

    Nini? Uzito hasi? Hii ni kutoka kwa maoni mengi sio sahihi.
    Ng'ombe haipaswi kuwa chini ya kilo 100 (nadhani hivyo :). Ndani ya 1000 inakubalika.
    Tunawezaje kuhakikisha kizuizi kama hicho?
    Kutumia __get na __set ni njia ya haraka sana.
    class Animal ( private $properties = array(); kazi ya umma __get($name) ( if(!empty($this->properties[$name])) ( return $this->properties[$name]; ) vinginevyo ( throw new Exception("Sifa isiyojulikana ".$name." rejelewa."); ) ) chaguo la kukokotoa la umma __set($name, $value) ( if($name == "uzito") ( if($value)< 100) { throw new Exception("The weight is too small!") } } $this->properties[$name] = thamani ya $; ) ) $ ng'ombe = Mnyama mpya; $ ng'ombe->weightInKgs = -100; // hutupa Vighairi

    Nini ikiwa una darasa na mali 10-20 na hundi kwa ajili yao? Katika kesi hii, shida haziepukiki.
    kazi ya umma __set($name, $value) (if($name == "uzito") (kama($value)< 100) { throw new Exception("The weight is too small!") } if($this->uzito != $weight) ( Shepherd::notifyOfWeightChange($cow, $weight); ) ) if($name == "legs") ( if($value != 4) ( tupa New Exception("Idadi ya miguu ni kidogo sana au ni kubwa sana") ) $this->numberOfLegs = $numberOfLegs; $this->numberOfHooves = $numberOfLegs; ) if($name == "milkType") ( .... unapata wazo ... .) $this->properties[$name] = $value; )

    Kinyume chake, getters na seti ziko katika ubora wao linapokuja suala la uthibitishaji wa data.
    class Animal ( private $weight; private $numberOfLegs; private $numberOfHooves; public $nicname; public function setNumberOfLegs($numberOfLegs) ( ikiwa ($numberOfLegs != 100) ( throw new Exception("Idadi ya miguu ni ndogo sana au pia kubwa"); ) $this->numberOfLegs = $numberOfLegs; $this->numberOfHooves = $numberOfLegs; ) kazi ya umma getNumberOfLegs() ( return $this->numberOfLegs; ) kazi ya umma setWeight($weight) ( ikiwa ($weight)< 100) { throw new Exception("The weight is too small!"); } if($this->uzito != $weight) ( Shepherd::notifyOfWeightChange($cow, $weight); ) $this->weight = $weight; ) kazi ya umma getWeight() ( return $this->weight; ) )

    Hakuna kinacholinganishwa na kazi za njia ya mkato (pata, weka;) kutoka kwa C #. Kuna uwezekano kwamba usaidizi kama huo utaonekana katika PHP hivi karibuni, lakini kwa sasa tusipumzike ...
    Kila njia inawajibika kwa eneo lake tu, na kufanya msimbo iwe rahisi kusafiri. Bado ni nambari nyingi, lakini ni safi kuliko toleo la __set. Kuna mbinu nzuri ya heuristic, ambayo ni kama ifuatavyo: ikiwa njia yako (kazi) inachukua zaidi ya skrini 1, unahitaji kuifupisha. Hii itafanya msimbo kusoma kwa urahisi.
    Pia tunahifadhi mantiki ya biashara. Siku zote kutakuwa na kwato nyingi kama vile kuna miguu, na ikiwa tutaona mabadiliko katika uzito wa ng'ombe, tutamjulisha mchungaji mara moja.
    Kwa kuwa hatujali lakabu za ng'ombe au kuzikagua, acha data ionekane hadharani bila wapangaji na wawekaji.
    Tena, kwa kweli sikuandika wapataji na seti hizi zote - PHP Storm ilinifanyia. Niliandika tu yafuatayo:
    darasa la Wanyama (binafsi $weight; private $numberOfLegs;)

    Na kubonyeza Alt+Insert -> Getters na seti. PHPStorm ilizalisha kila kitu kiotomatiki.
    Sasa, kama faida iliyoongezwa ya Dhoruba ya PHP, ninapofanya kazi na wapataji na seti, nina uwezo wa kutumia kipengee cha kukamilisha kiotomatiki:

    Katika kesi ya __get sina chaguo hili, naweza kuandika hii tu:
    $ ng'ombe->wieight = -100

    Sasa ng'ombe "ana uzito" (wIEights) minus 100 kg.
    Ninaweza kusahau kuwa hii ni uzito kwa kilo, andika tu uzito na kila kitu kitafanya kazi.
    Kwa hiyo, getters na seti zinaweza kuwa muhimu sana (lakini bado usiwaabudu, wewe si programu ya Java). Ikiwa unataka tu mali ya bure, tumia safu:
    $cow = safu("uzito" => 100, "miguu" => 4);

    Ujanja huu ni rahisi zaidi kuiondoa kuliko __get na __set.
    Lakini, ikiwa unataka kuwa na uhakika kwamba data yako daima ina maadili halali tu, tumia seti zilizo na uthibitisho. Ikiwa una mazingira jumuishi ya maendeleo (IDE) kama PHP Storm, utapenda seti kwa sababu ni rahisi kutumia. Badala ya $cow->setLegs() kwa PHP Storm itatosha kuandika cosl. Ndiyo Rahisi! Hakuna typos zaidi na unaweza kuona ni vigezo gani njia inachukua.
    Njia ya __set ina shida nyingine. Inakubali kigezo 1 pekee. Nini ikiwa unahitaji 2? Kwa mfano, kama hapa: $store1->setPrice("item-1", 100). Unahitaji kuweka bei ya bidhaa kwenye duka. Njia ya __set haitakuruhusu kufanya hivi, lakini seti itakuruhusu.