Kontakty

Členovia statických tried. Neodávajte im zničiť váš kód. Statické php metódy primsel static php p

Nie je to tajomstvo, že milujete klásť zložité otázky o rozhovoroch. Nie vždy adekvátne, nie vždy súvisí s realitou, ale fakt zostáva faktom - pýta sa. Samozrejme, otázka je problém, a niekedy aj otázka, na prvý pohľad, zdanlivo hlúpy, je vlastne zameraný na kontrolu toho, ako dobre poznáte jazyk, ktorý píšete.

Pokúsme sa rozobrať "kosť" jednu z týchto otázok - Čo znamená slovo "statické" v PHP a prečo sa to aplikuje?

Kľúčové slovo static má tri rôzne hodnoty v PHP. Budeme ich analyzovať v chronologickom poradí, keď sa objavili v jazyku.

Prvá hodnota je statická lokálna premenná

Funkcia FOO () ($ A \u003d 0; ECHO $ \u200b\u200bA; $ A \u003d $ A + 1;) FOO (); // 0 foo (); // 0 foo (); // 0.

V PHP premenných miestnych. To znamená, že definovaná premenná a hodnota vo vnútri funkcie (metóda) existuje len pri vykonávaní tejto funkcie (metóda). Pri opustení metódy je lokálna premenná zničená a pri opätovnom zadaní sa pokračuje. V kódexe nad takou miestnou premennou je $ premenná - existuje len vo funkcii FOO () a zakaždým, keď táto funkcia je zakázaná. Prírastok premennej v tomto kóde je bezvýznamný, pretože na ďalšej rovnakej línii kódu bude funkcia dokončiť svoju prevádzku a hodnota premennej sa stratí. Koľkokrát sme nespôsobili funkciu foo (), vždy to bude trvať 0 ...

Všetko sa však zmení, ak pred pridelením zadáme kľúčové slovo statical:

Funkcia foo () (statické $ A \u003d 0; echo $ A; $ A \u003d $ A + 1;) FOO (); // 0 foo (); // 1 foo (); // 2.

Statické kľúčové slovo napísané pred priradením hodnoty lokálnej premennej vedie k nasledujúcim účinkom:

  1. Priradenie sa vykonáva iba raz, keď prvý hovoríte funkciu
  2. Hodnota označená týmto spôsobom sa uloží po dokončení operácie.
  3. S následnými funkčnými hovormi namiesto zadania, premenná dostane predtým uloženú hodnotu
Takéto použitie slova static sa nazýva statická lokálna premenná.
Statické variabilné podmorské kamene
Samozrejme, ako vždy v PHP, to nie je stáť bez "úskalia".

Kameň je prvá statická premenná na priradenie iba konštanty alebo konštantné výrazy. Tu je kód:
Statické $ a \u003d bar ();
S nevyhnutnosťou povedie k chybe analyzátora. Našťastie, počnúc verziou 5.6, to bolo prípustné priradiť nielen konštanty, ale aj konštantné výrazy (napríklad - "1 + 2" alebo ""), to znamená, že také výrazy, ktoré nezávisia od iného kódu a môžu byť Vypočítané na fáze kompilácie

Druhý kameň - metódy existujú v jednej kópii.
Všetko je tu komplikovanejšie. Ak chcete pochopiť podstatu, uvediem kód:
Trieda A (verejná funkcia foo () (statické $ x \u003d 0; echo ++ $ x;)) $ A1 \u003d Nový A; $ A2 \u003d NOVÉ A; $ A1-\u003e FOO (); // 1 $ A2-\u003e FOO (); // 2 $ A1-\u003e foo (); // 3 $ A2-\u003e FOO (); // štyri
Na rozdiel od intuitívneho čakania na "rôzne objekty - rôzne metódy" vizuálne vidíme tento príklad, že dynamické metódy v PHP "sa nevšímajú." Aj keď máme sto objektov tejto triedy, metóda bude existovať len v jednom prípade, len s každým výzvam na to bude razené rôzne $ tohto.

Takéto správanie môže byť neočakávané pre vývojára nepripraveného na ňu a slúži ako zdroj chýb. Treba poznamenať, že dedičstvo triedy (a metódy) vedie k tomu, že je vytvorená nová metóda:

Trieda A (verejná funkcia foo () (statické $ x \u003d 0; echo ++ $ x;)) trieda B rozširuje a () $ A1 \u003d Nový A; $ b1 \u003d nový B; $ A1-\u003e FOO (); // 1 $ B1-\u003e foo (); // 1 $ A1-\u003e FOO (); // 2 $ B1-\u003e foo (); // 2.

Záver: Dynamické metódy v PHP existujú v kontexte tried, nie predmetov. A len v odstraňovacom časovom období je substitúcia "$ this \u003d súčasnosť_object"

Význam druhý - statické vlastnosti a metódy triedy

V modeli objektu PHP je možné nastaviť vlastnosti a metódy nielen pre inštancie triedy objektov, ale aj pre triedu ako celok. Na tento účel tiež slúži kľúčové slovo static:

Trieda A (Verejné statické $ X \u003d FOO "; Test verejnej statickej funkcie () (návrat 42;)) echo A: $ x; // "foo" echo a :: test (); // 42.
Pre prístup k takýmto vlastnostiam a metódam sa používajú štruktúry s dvojitým hrubým črevom ("Paamayim Nekuudotayim"), ako napríklad názov_name :: $ účel a meno_name :: namemode ().

Je samozrejmé, že statické vlastnosti a statické metódy majú svoje vlastné charakteristiky a ich "úskalia", ktoré potrebujete vedieť.

Funkcia je prvá, banálna - nie $ to. V skutočnosti, toto stonky z veľmi definície statickej metódy - pretože je spojená s triedou, a nie objektom, nie je k dispozícii pre pseudo-teplotu $ tohto, čo indikuje v dynamických metódach na aktuálny objekt. Čo je úplne logické.

Avšak, musíte vedieť, že na rozdiel od iných jazykov, PHP nedefinuje situáciu "v statickej metóde je napísaná $ This" v štádiu analýzy alebo kompilácie. Podobná chyba sa môže vyskytnúť len v ramene, ak sa pokúsite vykonávať kód s $ tohto v rámci statickej metódy.

Typový kód:
Trieda A (verejná $ ID \u003d 42; statická verejná funkcia foo () (echo $ this-\u003e ID;)
Nebude viesť k žiadnym chybám, pokiaľ sa nepokúšate používať metódu foo () nevhodným spôsobom:
$ A \u003d nový A; $ A-\u003e FOO (); (A okamžite získajte "Fatal Error: Použitie $ This, keď nie je v kontexte objektov")

Funkcia Two - Static nie je Axioma!
Trieda A (statická verejná funkcia foo () (ECHO 42;)) $ A \u003d nový A; $ A-\u003e FOO ();
Takto, áno. Statická metóda, ak neobsahuje v kóde $ toto, je možné volať dynamický kontext ako metóda objektu. Toto nie je chyba v PHP.

Reverz nie je celkom TRUE:
Trieda A (verejná funkcia foo () (echo 42;)) a :: foo ();
Dynamická metóda, ktorá nepoužíva $ Toto je možné vykonať v statickom kontexte. Dostanete však varovanie "non-statická metóda A: FOO () by sa nemala nazývať staticky" e_strict úrovni. Tam vyriešili vás - alebo striktne dodržiavať normy kódov alebo potlačenie upozornení. Najprv, samozrejme, je vhodnejšie.

A mimochodom, všetko písomné vyššie sa vzťahuje len na metódy. Použitie statických vlastností prostredníctvom "-\u003e" je nemožné a vedie k fatálnej chybe.

Hodnota je tretia, zrejmá najťažšia - neskoršia statická väzba

Vývojári jazyka PHP sa nezastavili na dvoch hodnotách kľúčového slova "Static" a vo verzii 5.3 pridal ďalší jazyk "funkcie", ktorý je implementovaný rovnakým slovom! Nazýva sa "neskôr statická väzba" alebo LSB (neskoré statické viazanie).

Pochopiť podstatu LSB je najjednoduchší spôsob, ako byť jednoduché príklady:

Triedny model (verejný statický $ stola \u003d "tabuľka"; verejná statická funkcia vyberateľná () (návrat self :: $ tabuľka;)) echo model :: Gesttable (); // "tabuľka"
Samohodnota v PHP vždy znamená "názov triedy, kde je toto slovo napísané." V tomto prípade sa samostatne nahrádza modelovou triedou a self :: $ tabuľka - na modeli :: $ tabuľka.
Takáto jazyková možnosť sa nazýva "skoré statické viazanie". Prečo skoro? Vzhľadom k tomu, že viazanie seba a špecifického mena triedy sa nevyskytuje v odstraňovaní, ale v predchádzajúcich štádiách - analýza a zostavovanie kódu. No, "statické" - pretože hovoríme o statických vlastnostiach a metódach.

Mierne Zmeniť náš kód:

Trieda model (verejný statický $ stola \u003d "tabuľka"; verejná statická funkcia vyberateľná () (návrat self :: $ tabuľka;)) užívateľ triedy rozširuje model (verejný statický $ stola \u003d "užívatelia";) ; \\ T // "tabuľka"

Teraz chápete, prečo sa PHP chová v tejto situácii neintenzívne. Self bol spojený s triedou modelu, keď sa užívateľská trieda ešte nebola známa, preto označuje model.

Ako byť?

Na vyriešenie tejto dilemy sa "neskorý" väzbový mechanizmus vymyslel v etape v hodnote hodnotenia. Funguje to veľmi jednoducho - dosť namiesto slova "seba" zápis "static" a pripojenie bude inštalované s triedou, ktorá spôsobuje tento kód, a nie tam, kde je napísané:
Trieda model (verejný statický $ stôl \u003d "tabuľka", verejná statická funkcia vyberateľná () (návrat static :: $ tabuľka;)) užívateľ triedy rozširuje model (verejný statický $ stola \u003d "užívatelia";) ; \\ T // "užívatelia"

Toto je tajomná "neskôr statická väzba".

Treba poznamenať, že pre väčšie pohodlie v PHP, s výnimkou slova "statické", stále existuje špeciálna funkcia get_called_class (), ktorá vás bude informovať - \u200b\u200bv súvislosti s ktorou triedou je v súčasnosti váš kód funguje.

Úspešné rozhovory!



Na svete existujú dva odrody vývojárov PHP. Niektorí uprednostňujú statické metódy, pretože je ľahké pracovať s nimi, iní, naopak, naopak, zvažujú statické metódy - zlo a nepoužívajú ich v ich praxi.
V tomto článku sa pokúsim používať skúsenosti s niekoľkými rámcami, aby som vysvetlil, prečo niektorí vývojári ignorujú najlepšie postupy a používajú celú banda statických metód.

Kto miluje statické metódy?

Zvlášť často využívajú vývojárov, ktorí niekedy používali vo svojom pracovnom rámci Codeigniter.

Nasledovníci štatistických metód zahŕňajú aj väčšinu vývojárov KOHANA aARA.
Nie je možné uvádzať skutočnosť, že programátori, ktorí sa rozhodnú začať písať svoje vlastné veci, zvyčajne odmietajú používať Codeigniter.

Prečo sa pýtaš?

Kodeniteľ podporovaný PHP 4 Pred pridaním statických metód do PHP 5. Okrem toho Codeigniter používa "Super objekt", ktorý poskytuje rovnaký prístup ku všetkým triedam priradeným regulátoru. Takto sa stanú prístupnými na použitie v celom systéme.

To znamená, že triedy môžu byť dostupné z akéhokoľvek modelu pomocou metódy __Get (), ktorá bude vyhľadávať požadovaný majetok pomocou get_instance () -\u003e ($ var). Predtým, keď podpora pre funkciu __Get () nebola v PHP 4, pre to bolo použité prevedenie FOREACH prostredníctvom parametrov CI_CONTROLLER, a potom boli priradené k $ tejto premennej v modeli.

V knižnici musíte volať get_instance. Knižnica neindeduje triedu v povinnom poradí, takže neexistuje spôsob, ako obísť funkciu __Get ().

Objem ...

Ukazuje sa na dosť ťažkopádny dizajn prístup k kódexu. Presne rovnaké funkcie bez dodatočného úsilia možno dosiahnuť pomocou statickej metódy.

Áno, a nie je žiadny zvláštny zmysel argumentovať o takomto dizajne. No, môžete pristupovať k údajom relácie vo vašom modeli. Ale prečo to musíte urobiť?

"Rozhodnutie"

Vývojári Kohana boli prví, ktorí pracovali vážne cez statické metódy. Vykonali tieto zmeny:
// bol $ this-\u003e vstup-\u003e dostať ("foo"); // sa stal vstupom :: get ("foo");
Pre mnoho vývojárov Codeigniter s ich zastaraným PHP 4, ktorý sa presunul do rámca Kohana, aby si vychutnávali všetky PHP 5 kúzla, v tomto nie je nič nezvyčajné. Ale, tým menej postáv, tým lepšie?

A aký je problém?

Mnoho vývojárov PHP (najmä tí, ktorí chápu Symfony a Zend) povedia: "Je to zrejmé - použite zavedenie závislostí!" Ale nie veľa vývojárov v komunite Codeigniter majú skutočnú skúsenosť s týmto procesom, pretože je dosť komplikovaná.

Ďalší fakt o fáze paliva PHP je stále hlavne statické metódy fungujú ako rozhranie. Napríklad logika má stále problémy so statickým, najmä keď je aktivovaný koncept HMVC.

Toto je pseudokód, ktorý som nepoužil v palivPHP, počnúc verziou 1.1:
Class Controllera rozširuje regulátor (verejná funkcia Action_foo () (ECHO Vstup :: Získajte ("Param");)
Pekný štandardný kód. Táto metóda vydá hodnotu ? Bar \u003d. v metóde.

Čo sa stane, keď urobíme požiadavku HMVC na túto metódu?
Class ControllerB rozširuje regulátor (ECHO Vstup :: Získajte ("Param"); \u200b\u200bECHO "&"; echo Žiadosť :: Forge ("Controllera / Foo? Param \u003d Val1") -\u003e Execute ();)
Volanie v prehliadači controllerb / BAZ.Uvidíte výstup "Val1", ale ak sa dostanete controllerB / BAZ? Param \u003d PrepísaťObidve výzvy dostanete, aby ste získali metódu, ktorá vracia rovnakú hodnotu.

Relevantnosť

Globálny kód vám nedám žiadny vzťah. Príklad je lepší ako akékoľvek slová:
$ This-\u003e Request-\u003e Input-\u003e Získajte ("Param");
Požadovaný objekt bude obsahovať úplne novú inštanciu pre každý dotaz, potom bude zadanie objektu vytvorený pre každú požiadavku, ktorá obsahuje iba vstupné údaje pre konkrétny dotaz. To platí pre paliva 2.0 plánuje pracovať a rieši problém pridávania závislosti, ako aj problémy s HMVC.

Ako sa vysporiadať s hrubou syntax?

Symfony- alebo Zend vývojári netrpia toľko, ale tí, ktorí používajú Codeigniter, budú dlhodobo nočné mory o "návrat na PHP 4".

$ Toto vždy odkazuje na "aktuálny" objekt a nie je presne potrebné používať ho na prístup k globálnemu kódexu.

$ This-\u003e Request-\u003e Input-\u003e Získajte () Môže vyzerať ako predĺžený kodeigniter-syntax forma, ale v skutočnosti sme jednoducho v regulátore. Keď regulátor vytvorí inštanciu nového dotazu vloženého do neho, konštruktér dotazu tiež prijíma inštanciu na vstup.

Ak ste v modeli alebo inej triede, potom prístup je typ $ This-\u003e Request-\u003e Input-\u003e FOO () nebude fungovať, pretože $ Toto nie je regulátor.

Vstup :: Získajte dizajn ("foo") vytvára fasádu pre logické inštancie v pozadí. To však nerieši otázky súvisiace s prácou globálneho kódu. Lazy pri testovaní aplikácií môže prepínať medzi dvoma režimami bez nutnosti plne využívať nový rámec.

Tam je skvelé video z Taylor Oblonla (Creator alebo Laravel 4), v ktorom popisuje, ako môžete nahradiť statický kód s jedinou inštanciou overenou prostredníctvom kontajnera DIC.

Laravel 4 - IOC kontrolér Injekcia a testovanie jednotiek od užívateľov na Vimeo.

Toto je vynikajúca prezentácia toho, ako môžete urobiť bez použitia statických metód v paravel. Hoci niektoré moderné rámce, na prvý pohľad, sú veľmi pripomenuté Kohana, absolútne riešia aj tie najdražšie úlohy rôznymi spôsobmi.

Na tomto smutnom poznámku ...

Teraz som zapojený do konverzie pyrocms s Codeigniter na Reavel. Snažím sa pohybovať priamo z globálneho kódu PHP 4 k dokonalej implementácii závislostí je absolútna samovražda. Medziproduktový krok pred použitím CI Bootloader - použitie PHP 5, Auto-Loaded PSR-2 kód s banda statických metód. No, zatiaľ čo sme stále v kozničiteľa.

Prechod zo statiky na kód DIC možno ľahko zobraziť, keď konečne urobíme prechod na Laravel.

Hlavnou úlohou je prechod z kódového kódu kodeigniter podľa subliink. Tím pyro je už na ceste - a bude to EPIC.

V PHP je možné určiť spôsob ako statický. Statická metóda nemá prístup k vlastnostiam objektu. Takéto metódy môžu byť spôsobené len v kontexte triedy, ale nie v kontexte predmetu.

Najdôležitejšou vecou je pochopenie - statické vlastnosti a metódy sú prezentované podľa tried, nie objektov.

Príklad sa bude okamžite číry. Vytvorme si matematický objekt (skrátený matematiku v angličtine).

Statické metódy PHP.
", $ Math_1 \u003d Nová matematika (); $ Math_2 \u003d Nová matematika (); $ Math_3 \u003d Nová matematika (); $ Math_4 \u003d Nová matematika (); ECHO" Vytvorené objekty: ". Math :: getcount ();?\u003e

Táto trieda poskytuje nástroje na prácu s matematickými funkciami bez nutnosti vytvoriť objekt. Trieda má konštruktor, ktorý zvyšuje statickú vlastnosť počtu $ na jednotku. Trieda si pamätá hodnotu tejto nehnuteľnosti, ako je statická.

Mimochodom, slovom statické slovo sa používa na deklaráciu metódy alebo statického majetku, a slovo self s dvojitým hrubým kútom sa používa na prístup k statickému majetku "::".

To všetko je najlepšie pochopené v porovnaní, najmä v porovnaní s pracovným príkladom s chybným. Poďme trochu rozšíriť náš príklad.

Statické metódy PHP. počítadlo ++; ) Verejná statická funkcia Calccin ($ x) (návratný hriech ($ x);) verejná statická funkcia CALCCQRT ($ X) (RETURN SQRT ($ X);) Public Static Funkcia GetCount (Späť Self :: $ COUNT;) Verejná funkcia Getcounter () (návrat $ this-\u003e counter;)) echo matematika :: calcin (1); Echo "
"Echo matematika :: calcsqrt (9); echo"
", $ Math_1 \u003d Nová matematika (); $ Math_2 \u003d Nová matematika (); $ Math_3 \u003d Nová matematika (); $ Math_4 \u003d Nová matematika (); ECHO" Vytvorené objekty: "Math :: getcount (); echo"
", ECHO" Vytvorené objekty: "$ Math_4-\u003e GetCounter ();

V tomto príklade sme pridali triedu obvyklých $ counter nehnuteľnosti, tiež sa zvýšil o jeden v konštruktore. Zvyčajná nehnuteľnosť však patrí k objektu, takže nie je zachránený medzi výzvami objektov. S akomkoľvek vytvoreniu inštancie triedy (objektu) sa nehnuteľnosť rovná NULO, v dizajnéri bude zvýšená o jeden.

Stavba patrí do triedy, takže jeho hodnota sa uloží.

Nižšie sú uvedené ďalšie príklady, ktoré odhaľujú prácu statických vlastností a metód.

Pokus o použitie v statickej metóde $ Táto premenná bude mať za následok chybu (smrteľná chyba: používanie $ thiss, keď nie v kontexte objektov).

Statické metódy PHP. vek. "Starý."; // Toto je chyba "Používanie $ This, keď nie je v kontexte objektov". )) $ Testclass \u003d nová test čiara (); $ Testclass-\u003e Sayhello (); ?\u003e.

Mimochodom, bez reťazca:

$ Testclass-\u003e Sayhello ();

chyby nebudú, ale hneď, ako sa pokúsite spustiť statickú metódu z tejto premennej $, okamžite dostanete chybové hlásenie.

Ak v tomto príklade odstráňte slovo static, potom sa chyby nebudú.

Ak sa odvolávate na objektový majetok zo statickej metódy, bude mať za následok chybu. Môžete požiadať len na statické vlastnosti pomocou seba :: $ vek dizajn. Upozorňujeme, že tam je znak $ pred názvom premennej, na rozdiel od $ this-\u003e vek dizajnu.

Statické metódy PHP. povedz ahoj (); ?\u003e.

Ak v tomto príklade odstráňte slovo statické pred názvom nehnuteľnosti, potom sa vyskytne "prístup k neohlásenému statickému majetku" chyby.

Statické vlastnosti chýbajú v objektoch triedy.

Statické metódy PHP. "; Print_r ($ testclass); echo""; ?>

Statická metóda môže byť nazývaná pomocou metódy Self :: Metóda (). Príklad:

Statické metódy PHP. printhello (); ?\u003e.

Statické vlastnosti je možné získať v kontexte triedy pomocou syntaxe:

echo testclass :: $ vek;

Okrem toho bude teda pokus o označenie obvyklého majetku viesť k chybe: "Fatálna chyba: prístup k neohlásenému statickému majetku".

Statické vlastnosti je možné zmeniť v kontexte triedy pomocou syntaxe:

Testclass :: $ AGE + \u003d 20; // napr

Ďalší príklad kódu so statickými metódami a vlastnosťami

V tomto príklade, jednoduchšie možnosti používania statických metód a vlastností. Čím viac jednoduchého kódu pochopíte, tým lepšie si pamätajte na materiál.

Statické metódy PHP. ".Testclass :: $ vek; // echo testclass :: $ txt; // Chyba: Fatálna chyba: Prístup k neohlásenému statickému majetku. ECHO"
"Testclass :: SEYSHI (); ECHO"
"Testclass :: Sayhello (); // a tak som mohol získať prístup k statickej premennej prostredníctvom objektu ($ obj :: $ Age) ... Echo"
"; $ obj \u003d nová testcka; echo" Získame titul na statickú premennú prostredníctvom objektu: ". $ Obj :: $ vek;

Poznámka, a to je dôležité, v tomto príklade sme sa otočili k neštátnej metóde Sayhi () pomocou syntaxe prístupu k prvkom statickej triedy.

Zhrnutie

  • Hlavné: Statické vlastnosti patria do tried, nie objektov.
  • Zo statickej metódy nie je možné obrátiť sa na obvyklých vlastností a metódy triedy, $ This-\u003e Meno nefunguje tu.
  • Zo statickej metódy môžete odkazovať na statické vlastnosti pomocou seba :: $ NAME.
  • Vlastnosti statickej triedy nie sú k dispozícii pre objekty.
  • Zvyčajná metóda sa môže vzťahovať na statické vlastnosti pomocou seba :: $ name.
  • Statické vlastnosti je možné získať v kontexte triedy pomocou syntaxe: Testclass :: $ AGE.
  • Zvyčajná metóda môže byť volaná v kontexte a objekte ($ objekt-\u003e metóda ()) a trieda pomocou syntaxe testníka :: Metóda ().
  • Pomocou syntaxe $ objektu :: $ AGE AGEUMENT I Podarilo sa mi pristupovať k statickému majetku prostredníctvom objektu.

Paralelne s javascriptom

JavaScript má takú matematickú triedu obsahujúcu veľa rôznych matematických funkcií.

Na vykonávanie matematických výpočtov (výpočet sínusu alebo výstavu) v JavaScript nie je potrebné vytvoriť objekt triedy matematiky, pretože jeho metódy sú statické. Pred štúdiom PHP som nemohol pochopiť, čo to bolo, a len študoval triedy a predmety v php v mojej hlave, všetko padlo na police.

V skutočnosti je veľmi pohodlné, mať priamy prístup k matematické metódy triedy matematiky, vyhnúť sa vytvoreniu objektu.

Dlho som chcel písať na túto tému. Prvým šokom bol článok Miško Hevery "Statické metódy sú smrťou testovacnosti". Napísal som článok odpovede, ale nikdy ho neuverejnil. Ale nedávno videl niečo, čo sa dá nazývať "Class-orientované programovanie". Toto osviežovalo môj záujem o tému a tu je výsledok.

"Class-orientované programovanie" je, keď sa používajú triedy pozostávajúce len zo statických metód a vlastností a inštancia triedy nie je nikdy vytvorená. V tomto článku budem hovoriť o:

  • nepodáva žiadne výhody v porovnaní s procesným programovaním.
  • nevzdávajte sa objektov
  • dostupnosť statických členov triedy! \u003d Testy smrti
Hoci tento článok o PHP, pojmy platia pre iné jazyky.

Závislosti

Kód zvyčajne závisí od druhého kódu. Napríklad:

$ Foo \u003d substr ($ bar, 42);
Tento kód závisí od premennej $ bar a funkcie substrátu. $ Bar je len lokálna premenná definovaná o niečo vyššia v rovnakom súbore av rovnakom rozsahu. Substr je funkcia PHP jadra. Všetko je tu jednoduché.

Teraz, taký príklad:

Trieda Bloomfilter (... Verejná funkcia __Construct ($ M, $ K) (...) Public Static Funkcia Getk ($ M, $ N) (RETURN CEIL ((($ M / $ N) * LOG (2)) ) ...)
Táto malá pomocná funkcia jednoducho poskytuje obal pre konkrétny algoritmus, ktorý pomáha vypočítať dobré číslo pre Argument $ K používaný v konštruktore. Pretože Musí byť spôsobený pred vytvorením inštancie triedy, musí to byť statické. Tento algoritmus nemá žiadne externé závislosti a je nepravdepodobné, že by sa vymenila. Používa sa to takto:

$ m \u003d 10 000; $ n \u003d 2000; $ B \u003d nový BLOOMFILTER ($ M, BLOOMFILTER :: GETK ($ M, $ N));
Nevytvára žiadne ďalšie závislosti. Trieda závisí od seba.

  • Alternatívny dizajnér. Dobrým príkladom je trieda DateTime zabudovaná do PHP. Jeho inštancia môže byť vytvorená dvoma rôznymi spôsobmi:

    $ DATE \u003d Nový DateTime ("2012-11-04"); $ DATE \u003d DateTime :: Createfromformat ("D-M-Y", "04-11-2012");
    V oboch prípadoch bude výsledkom inštancia dateTime av oboch prípadoch je kód zviazaný na triedu datov jedným alebo druhým. Statická metóda DateTime :: createfromfromat je alternatívnym objektom objektu, ktorý sa vracia rovnako ako nový dátový dátum, ale pomocou ďalších funkcií. Kde môžete napísať novú triedu, môžete písať a triedu :: Metóda (). Žiadne nové závislosti.

  • Zostávajúce použitie statických metód ovplyvňuje väzbu a môže tvoriť implicitné závislosti.

    Slovo o abstrakcii

    Prečo táto prestávka so závislosťami? Schopnosť abstraktu! S rastom vášho produktu rastie jeho zložitosť. A abstrakcia je kľúčom k riadeniu zložitosti.

    Máte napríklad aplikáciu triedu, ktorá prezentuje vašu aplikáciu. Komunikuje s triedou používateľa, čo je prevencia užívateľa. Ktoré prijíma údaje z databázy. Trieda databázy potrebuje databázuDriver. DatabasedRiver Potrebujete nastavenia pripojenia. Atď. Ak jednoducho zavoláte aplikáciu :: Start () staticky, čo spôsobí užívateľovi :: getdata () staticky, čo spôsobí databázu staticky a tak ďalej, v nádeji, že každá vrstva sa bude zaoberať svojimi závislosťami, môžete sa dostať hrozný neporiadok, ak niečo nie je týmto spôsobom. Nie je možné uhádnuť, či aplikácia :: štart () volania bude fungovať, pretože nie je zrejmé, ako sa budú vnútorné závislosti správať. Je ešte horšie, že jediný spôsob, ako ovplyvniť správanie aplikácie :: Štart () je zmeniť zdrojový kód tejto triedy a triedny kód, ktorý to vyžaduje a triedny kód, ktorý sa triedy objavujú ... v dome ktorý zabudoval.

    Najefektívnejší prístup pri vytváraní komplexných aplikácií je vytvorenie jednotlivých častí, ktoré možno v budúcnosti zamietnuť. Časti, ktoré možno prestať myslieť, v ktorom si môžete byť istí. Napríklad pri volaní statickej databázy :: fetchall (...), nie sú žiadne záruky, že pripojenie k databáze je už nainštalované alebo bude nainštalované.

    Funkcia (databáza $ databáza) (...)
    Ak je kód v tejto funkcii vykonaný - to znamená, že inštancia databázy bola úspešne prenesená, čo znamená, že inštancia objektu databázy bola úspešne vytvorená. Ak je trieda databázy správne navrhnutá, môžete si byť istí, že prítomnosť inštancie tejto triedy znamená schopnosť vykonávať požiadavky na databázu. Ak inštancia triedy nie je, telo funkcie nebude vykonaná. To znamená, že funkcia by sa nemala starať o stav databázy, databázová trieda to urobí sám. Tento prístup vám umožňuje zabudnúť na závislosti a sústrediť sa na riešenie problémov.

    Bez možnosti nemyslite na závislosti a závislosti týchto závislostí, je takmer nemožné písať aspoň komplexnú aplikáciu. Databáza môže byť malá trieda obalu alebo obrovské viacvrstvové monštrum s banda závislostí, môže začať ako malý obal a mutovať v obrovskom monštrukte s časom, môžete zdediť triedu databázy a preniesť na potomku, je to Nie všetky dôležité pre vašu funkciu (databázová $ databáza), pokiaľ sa verejné rozhranie databázy nezmení. Ak sú vaše triedy správne oddelené od ostatných častí aplikácie implementačnými závislosťami, každý z nich môžete otestovať pomocou zástrčiek namiesto ich závislostí. Keď ste testovali dostatočnú triedu, aby ste sa uistili, že to funguje, ako by to malo, môžete vyhodiť viac zbytočné z hlavy, len vedieť, že musíte použiť inštanciu databázy do práce s databázou.

    Triedne orientované programovanie je nezmysel. Naučte sa používať OOP.

    Reg.ru: domény a hosting

    Najväčší rekordér a hosting poskytovateľa v Rusku.

    Viac ako 2 milióny doménových mien pre údržbu.

    Propagácia, pošta pre doménu, obchodné riešenia.

    Viac ako 700 tisíc zákazníkov na celom svete sa už rozhodlo.

    * Myš na pozastavenie rolovania.

    Vpred

    Statické metódy a vlastnosti v PHP

    V predchádzajúcich materiáloch sme zvládli hlavné možnosti objektovo orientovaného programovania v PHP a teraz prejdite na štúdium zložitejších a zaujímavých aspektov.

    Predtým sme vždy pracovali s objektmi. Opísali sme triedy ako šablóny, s ktorými sú vytvorené objekty a objekty - ako aktívne komponenty, ktorých spôsoby, ktoré hovoríme a ktorých vlastnosti získavame prístup.

    Odtiaľ nasledovala záver, že v objektovo orientované programovanie sa skutočná práca vykonáva pomocou prípadov tried. A triedy sú v konečnom dôsledku len šablóny pre vytváranie objektov.

    Ale v skutočnosti nie je všetko také jednoduché. Môžeme pristupovať k samotným metódam a vlastnostiam v kontexte triedy a nie objekt. Takéto metódy a vlastnosti sa nazývajú "statické" a musia byť oznámené pomocou kľúčového slova statické..

    Trieda Staticexample (statická verejná správa $ \u003d 0; statická verejná funkcia Sayhello () (print hello! "))

    Statické metódy - Toto sú funkcie používané v kontexte triedy. Sami nemôžu dostávať prístup k akýmkoľvek spoločným vlastnostiam triedy, pretože takéto vlastnosti patria k objektom.

    Z statických metód, ako ste pravdepodobne uhádli, môžete sa obrátiť na statické vlastnosti. A ak zmeníte statickú vlastnosť, potom všetky inštancie tejto triedy budú môcť pristupovať k novej hodnote.

    Keďže prístup k statickému prvku sa vykonáva cez triedu, a nie prostredníctvom inštancie objektu, nepotrebujeme premennú, ktorá sa vzťahuje na objekt. Namiesto toho sa používa názov triedy, potom, čo sú uvedené dve farby "::".

    Tlačiť StateTexample :: $ ANUM; StateCexample :: Sayhello ();

    S touto syntaxou musíte byť už známe na základe OOP v PHP. Použili sme návrh ":::" v kombinácii s kľúčovým slovom rodič. S cieľom získať prístup k predefinovanej metóde rodičovskej triedy.

    Teraz, ako potom, apelujeme na triedu, a nie na údaje obsiahnuté v objekte. V kóde tried môžete použiť kľúčové slovo rodič. Na prístup k nadpalisku bez použitia názvu triedy.

    Ak chcete získať prístup do statickej metódy alebo majetku z tej istej triedy (a nie z triedy detí), budeme používať kľúčové slovo seba..

    Kľúčové slovo seba. Na odvolanie na súčasnú triedu a pseudo-zničenú $ Toto - na aktuálny objekt. Preto, zvonku triedy Statetixample Odvolávame sa na majetok $ ALUM Pomocou jeho názvu triedy.

    StateCexample :: $ ANUM;

    A vo vnútri triedy Statetixample Môžete použiť kľúčové slovo seba..

    Trieda Staticexample (statická verejná skupina $ AUM \u003d 0; Statická verejná funkcia Sayhello () (Self :: $ ANUM ++; tlač "Ahoj! (" Self :: $ ANUM. ")

    Poznámka: Okrem prípadov odvolanie na predefinovanú metódu rodičovskej triedy by sa mala vždy použiť len na prístup statických metód alebo vlastností.

    Podľa definície sa v kontexte objektu nevyvolávajú statické metódy. Z tohto dôvodu sa statické metódy a vlastnosti často nazývajú premenné a vlastnosti triedy. V dôsledku toho nie je možné použiť pseudo-zničené $ Toto vo vnútri statickej metódy.

    Prečo používať statickú metódu alebo majetok?

    Tak sme dosiahli najdôležitejšiu otázku. Faktom je, že statické prvky majú niekoľko užitočných charakteristík.

    NajprvSú k dispozícii z akéhokoľvek bodu skriptu (za predpokladu, že máte prístup do triedy). To znamená, že máte prístup k funkciám bez odoslania inštancie triedy z jedného objektu do druhého alebo ešte horšie, uloženie inštancie objektu v globálnej premennej.

    Po druhé, Statická nehnuteľnosť je k dispozícii každému prípadu tejto triedy. Preto môžete definovať hodnoty, ktoré by mali byť prístupné všetkým objektom tohto typu.

    A nakoniec tretíSkutočnosť, ktorá nemusí mať inštanciu triedy na prístup k statickému majetku alebo metóde, sa vyhne vytvárať inštancie objektov výlučne kvôli volaniu jednoduchej funkcie.

    Na preukázanie toho, vytvorte statickú metódu pre triedu Shopproduct.ktorý automaticky vytvorí inštancie objektov Shopproduct.. C Použitie SQLITE Určite tabuľku produkty. Nasledujúcim spôsobom:

    Vytvorenie tabuľkových produktov (ID Integer Primárny kľúč AutoinCrement, zadajte text, textový text, mainName text, text, text, cena float, NUMPAGES INT, Hráč Dĺžka int, zľava Int)

    Teraz vytvorte metódu getinstance ()ktorý prechádza identifikátor riadku a objekt typu CHOP. Budú použité na extrahovanie riadku z databázovej tabuľky, na základe ktorých sa potom vytvorí typ typu. Shopproduct.vrátil do volacieho programu.

    Tieto metódy môžeme pridať do triedy Shopproduct.ktorý bol vytvorený v skorších materiáloch. Ako pravdepodobne viete, CHOP je dešifrovaný ako PHP dátový objekt (PHP dátové objekty). Trieda PDO poskytuje univerzálne rozhranie pre rôzne databázové aplikácie.

    // Class ShopProduct Private $ ID \u003d 0; Verejná funkcia SETID ($ ID) ($ this-\u003e ID \u003d $ ID;) // ... Verejná statická funkcia Getinstance ($ ID, CHOP $ CHOP) ($ STMT \u003d $ CHOP-\u003e Pripravte ("SELECT * z produktov Kde ID \u003d? "); $ Výsledok \u003d $ STMT-\u003e Execut (Array ($ ID)); $ Row \u003d $ STMT-\u003e Fetch (); ak (prázdny ($ Row)) (návrat null;) ROW ["TYP"] \u003d\u003d "Kniha") ($ Product \u003d Nový Knihkprodukt ($ Row ["Názov"], $ Row ["FirstName"], $ Row ["MainName"], $ Row ["cena"] , $ Row ["NumpAges"]);) inak, ak ($ \u200b\u200bRow ["Typ"] \u003d\u003d "CD") ($ Product \u003d Nový CDPRODUCT ($ Row ["Názov"], $ Row [FirstName "], $ Row ["MainName"], $ Row ["cena"], $ Row ["PlaylTength"]);) inak ($ \u200b\u200bProduct \u003d New ShopProduct ($ Row ["Názov"], $ Row ["FirstName"], $ Row ["MainName"], $ Row ["Cena"]);) $ Product-\u003e SETID ($ Row [ID "]); $ Product-\u003e setDiscount ($ Row [" Zľava "]); Vrátiť produkt $ ;) // ...

    Ako môžete vidieť, metóda getinstance () Vráti typ objektu Shopproduct.a je to dosť "inteligentné", aby bolo založené na hodnotách poľa typ Vytvorte objekt s požadovanými vlastnosťami.

    Špeciálne som znížil kód manipulácie s chybou tak, aby bol príklad jednoduchší. Napríklad v skutočnej verzii tohto kódu nemôžeme byť príliš dôverčivá a predpokladať, že vysielaný objekt PDO bol správne inicializovaný a pripojený k požadovanej databáze.

    V skutočnosti sme pravdepodobne uzavreli objekt CHOP v triede, ktorá zaručuje takéto správanie. Na túto otázku sa vrátime v jednom z budúcich materiálov.

    Metóda getinstance () Užitočnejšie v kontexte triedy ako v kontexte predmetu. Uľahčuje prevod údajov, ktoré sú v databáze objektu, a preto nemusíme mať samostatnú inštanciu objektu typu Shopproduct..

    Táto metóda nepoužíva žiadne metódy ani vlastnosti, ktoré vyžadujú samostatnú inštanciu objektu, takže neexistuje žiadny dôvod, aby ste ju nehlásili statické. Potom, ktorí majú správny objekt CHOP, môžeme zavolať túto metódu z ľubovoľného miesta aplikácie.

    $ dsn \u003d "sqlite: //home/bob/projects/products.db"; $ CHOP \u003d Nový CHOP ($ DSN, NULL, NULL); $ Ccko-\u003e setatibút (CHOP :: ATTH_RERMODE, CHOP :: ERRMODE_EXPERION); $ Obj \u003d SHOPPRODUCT :: Getinstance (1, $ CHOP);

    Takéto metódy fungujú ako "továreň", pretože prijímajú "surové" materiály (napríklad údaje získané z databázového reťazca alebo konfiguračného súboru) a používajú ich na vytvorenie objektov.

    Termín "továreň" označuje kód určený na vytvorenie inštancií objektov. S príkladmi takýchto "tovární" sa s vami stretneme ďalej.


    Trvalé vlastnosti

    Niektoré vlastnosti by sa nemali meniť. Napríklad prvky, ako napríklad chybové kódy alebo programové kódy stavu programu, sa zvyčajne nastavujú ručne v triedach. Hoci musia byť verejne dostupné a statické, kód klienta by nemal byť schopný ich zmeniť.

    Ak to chcete urobiť, môžete definovať konštantné vlastnosti v triede. Rovnako ako globálne konštanty, triedna konštanty nemožno zmeniť po ich identifikácii. Trvalý majetok vyhlasuje pomocou kľúčového slova const..

    Na rozdiel od bežných vlastností nie je znak dolára pred názvom trvalé nehnuteľnosti. Podľa prijatej dohody sú často predpísané mená pozostávajúce z hlavných listov, ako v nasledujúcom príklade: \\ t

    Trieda ShopProduct (Const k dispozícii \u003d 0, const out_of_stock \u003d 1; // ...

    Trvalé vlastnosti môžu obsahovať iba hodnoty súvisiace s elementárnym typom. Konštanta nemožno priradiť objekt.

    Rovnako ako pri statických vlastnostiach, prístup k trvalým vlastnostiam sa vykonáva cez triedu, a nie prostredníctvom inštancie objektu. Rovnako ako konštanta je určená bez znamenia dolára, pri jeho prístupe, nemusí tiež používať žiadny symbol vpredu.

    Tlač ShopProduct :: K dispozícii;

    Pokus o priradenie konštantnej hodnoty po jej vyhlásení, bude mať za následok chybu vo fáze syntaktickej analýzy.

    Konštanty by sa mali používať vtedy, keď musí byť vlastnosť prístupná všetkým inštanciám triedy a keď musí byť hodnota vlastnosti stanovená a nezmenené.

    Dokončil tento článok a ďalej budeme hovoriť.

    Páči sa vám materiál a chceli sa poďakovať?
    Práve zdieľajte s priateľmi a kolegami!




    Páči sa vám článok? Zdieľaj to