Геттери и сетери

PHP. Характеристики и функции

На живо

hui_nana 28 май 2014 г., 13:33 ч

26 май 2014 г

26 май 2014 г

23 май 2014 г. 10:26 ч

  • Преден край7.96
  • Yii framework7.92
  • Q&A6.03
  • OS Linux5.66
  • CMS 1C-Bitrix5.65
  • PHP. Продукти4.63
  • PHP. Производителност4.53
  • PHP. Характеристики и функции4.53
  • Сигурност4.52
  • HTML51.25

Джоузеф Крауфорд, един от моите читатели, прочете статия за това как не обичам да пиша геттери и сетери и ми предложи да използвам магическите методи __get и __set. Ще ви кажа защо не е добра идея да ги използвате по обичайния начин. Освен това ще ви разкажа една история, в която те наистина са ми били полезни, а именно за създаването на статични типове в PHP (динамичен език). За тези, които не са запознати с методите __get и __set, това са два "магически" метода, които работят по следния начин:

Обикновено горните методи се използват за създаване на динамични свойства. Какъв извод може да се направи от това? Ако искате да създадете произволни свойства, просто използвайте хеш (известен още като масив с ключове). Какво е добро за гетерите и сетерите? Да видим:

Какво? Отрицателно тегло? Това е грешно от повечето гледни точки. Една крава не трябва да е под 100 кг (така мисля :). В рамките на 1000 е приемливо. Как можем да наложим такова ограничение. Използването на __get и __set е доста бързо.

Ами ако имате клас с 10-20 свойства и проверки за тях? INВ този случай неприятностите са неизбежни.

Обратно, гетерите и сетерите се отличават, когато става въпрос за валидиране на данни.

Нищо не може да се сравни със стенографските функции в C#. Вероятно такава поддръжка скоро ще се появи в PHP, но засега не се отпускаме ... Всеки метод отговаря само за собствената си област, благодарение на което е по-лесно да се ориентирате в кода. Все още се оказва твърде много код, но е по-чист от версията __set. Има добър евристичен подход, който е следният: ако вашият метод (функция) отнема повече от 1 екран, трябва да го намалите. Това ще подобри четливостта на кода. Също така съхраняваме известна бизнес логика. Винаги ще има точно толкова копита, колкото и краката, и ако забележим промяна в теглото на добитъка, веднага ще уведомим пастира. Тъй като не ни интересуват прякорите на кравите и не ги проверяваме, оставете данните да бъдат публични без гетери и сетери. Отново не съм написал всички тези гетери и сетери - PHP Storm го направи вместо мен. Току що написах следното:

и натиснете Alt+Insert -> гетери и сетери. PHPStorm генерира всичко автоматично. Сега, като допълнителна полза от PHP Storm, когато се занимавам с гетери и сетери, имам опцията да използвам функцията за автоматично довършване:

В случай на __get нямам тази опция, мога да напиша само това:

Сега кравата "тежи" (тегло) минус 100 кг. Мога да забравя, че това е тегло в кг, просто напишете тегло и всичко ще работи. Така че гетерите и сетерите могат да бъдат много полезни (но не им се прекланяйте, вие не сте Java програмист). Ако просто искате безплатни свойства, използвайте масив:

Този трик е много по-лесенманивела от __get и __set. Но ако искате да сте сигурни, че вашите данни винаги имат само валидни стойности, използвайте сетери с валидиране. Ако имате интегрирана среда за разработка (IDE) като PHP Storm, ще харесате сетерите, защото са толкова лесни за използване. Вместо $cow->setLegs() за PHP Storm, всичко, което трябва да направите, е да въведете co[TAB]sl[TAB]. Да Лесно! Няма повече правописни грешки и можете да видите какви параметри приема методът. Методът __set има още един недостатък. Необходим е само 1 параметър. Ами ако имате нужда от 2? Например така: $store1->setPrice('item-1', 100). Трябва да зададете цената на артикула в магазина. Методът __set няма да ви позволи да направите това, но сетерът ще го направи.