Prispôsobte php-fpm. Entity "Rámec" pre PHP z jednej triedy Anemic Group PHP

  • 20.06.2020

PHP Programovací jazyk Bola to veľká cesta z nástroja na vytvorenie osobných stránok na všeobecný účel. Dnes je inštalovaný na miliónoch serverov po celom svete, používajú sa milióny vývojárov, ktorí vytvárajú veľa rôznych projektov.

Je ľahké študovať a mimoriadne populárne, najmä medzi nováčikmi. Po vývoji jazyka preto nasledoval silný rozvoj Spoločenstva okolo neho. Obrovské množstvo skriptov, pre všetky príležitosti, rôzne knižnice, rámce. Nedostatok jednotlivých noriem registrácie a písania kódu viedol k vzniku obrovskej nádrže informačných produktov vybudovaných na vlastných princípoch developer tohto produktu. To bolo obzvlášť viditeľné pri práci s rôznymi PHP rámceKTORÝ JE DLHÝM TIOMPOOD ZATVORENÝM EKOSYSTMU, KTORÝMI ZLOŽENÍM S INÝMI ROZMERNÝMI ROZMERNÝMI POTREBUJÚCEHO POTREBUJÚCEHO POTREBUJÚCEHO POTREBUJÚCEHO POTREBUJÚCEHO POTRUČNOSTI.

V roku 2009 sa vývojári viacerých rámcov dohodli na vytvorení komunity Group Framework PHP (PHP-Obr)To by vytvorilo odporúčania pre vývojárov. Je dôležité zdôrazniť, že to nie je Normy ISO, Správne rozprávajte o odporúčaniach. Ale od vytvárania Php-obr Vývojári Spoločenstva predstavujú hlavné rámce, ich odporúčania majú vážnu váhu. podpora Normy PSR (PHP štandardné odporúčania) Umožňuje zabezpečiť kompatibilitu, ktorá uľahčuje a urýchľuje vývoj konečného výrobku.

Celkovo v čase tohto písania existuje 17 štandardov a 9 z nich sú schválené, 8 sú v štádiu projektu, aktívne diskutované, 1 štandard sa neodporúča používať na použitie.

Teraz sa poďme priamo na popis každej normy. Všimnite si, že tu nebudem podrobne rozobrať každý štandard, skôr je to mierne zavedenie. Aj v článku sa budú brať do úvahy iba tie normy psrktoré sú oficiálne akceptované, t.j. sú umiestnené v stave prijatých..

Psr-1. Základný kód kódovania

Je to najobecnejšie pravidlá, ako napríklad použitie tagy php., Kódovacie súbory, oddelenie miesta inzerátov funkcie, triedy a miesta používania, názov tried, metód.

Psr-2. Kód Štýl Sprievodca

Ide o pokračovanie prvého štandardu a reguluje otázky použitia v kóde na karte, riadky prevodov, maximálnu dĺžku riadkov kódu, pravidlá registrácie kontrolných štruktúr atď.

Psr-3. Rozhranie.

Tento štandard je navrhnutý tak, aby poskytoval (žurnálovanie) prihlásenie do aplikácií napísaných v Php..

PSR-4. Standard Autoload

To je pravdepodobne najdôležitejší a nevyhnutný štandard, na ktorý sa oddelený, podrobný článok bude venovaný. Triedy, ktoré implementujú PSR-4.si môžete stiahnuť jediným autoloader, ktorý umožňuje, aby sa diely a komponenty z jedného rámca alebo knižnice používali v iných projektoch.

PSR-6. Rozhranie do pamäte cache

Caching sa používa na zvýšenie výkonu systému. A PSR-6. Umožňuje ukladať a extrahovať údaje z pamäte cache pomocou jednotného rozhrania.

PSR-7. Rozhranie http Messaging

Pri písaní trochu ťažké stránky na PHP., takmer vždy musí pracovať HTTP titulky. Samozrejme, jazyk php poskytuje nám hotové príležitosti s nimi, ako napr superglobal $ _server poleFunkcie hEADER (), setcookie () Avšak, ich manuálna analýza je plná chýb a nie je vždy možné zohľadniť všetky nuansy s nimi. A tak uľahčiť prácu developera, ako aj jednotné rozhranie interakcie Protokol HTTP Tento štandard bol prijatý. Podrobnejšie o tomto štandarde, poviem v jednom z nasledujúcich článkov.

PSR-11. Rozhranie kontajnerov

Pri písaní PHP programy Často musíte použiť komponenty tretích strán. A aby sa nestratili v tejto závislosti v tomto lese, boli vynájdené rôzne metódy kódových závislostí, často nekompatibilné medzi sebou, ktoré poskytli štandard a vedie k spoločnému menovatu.

Psr-13. Odkazy HYPERMEDIA

Toto rozhranie je navrhnuté tak, aby uľahčilo vývoj a používanie aplikačných programovacích rozhraní ( API.).

Psr-14. Jednoduché rozhranie cache

Je pokračovanie a zlepšenie štandardu PSR-6.

Dnes sme preskúmali Normy psr. Pre aktuálne informácie o stave noriem, kontaktujte prosím

Ak sa zaoberáte vývojom PHP za posledných niekoľko rokov, pravdepodobne viete o problémoch tohto jazyka. Často môžete počuť, že ide o roztrieštený jazyk, nástroj na hackovanie, že nemá skutočnú špecifikáciu atď. Realita je taká, že PHP silne "pestovala" nedávno. Verzia PHP 54 ju priniesla na kompletný model objektov a poskytol veľa nových funkcií.

A je to všetko, samozrejme, dobré, ale čo freignors? Na php je obrovská súprava. Je to len stojí za to hľadať a pochopíte, že nemáte dostatok života, aby ste ich mohli študovať, pretože nové snímky sa objavujú neustále av každej osobe, ktoré sa vynárajú. Tak ako ho premeniť na niečo, čo neodpudzuje vývojári a uľahčuje prenos funkcií z jedného rámca na druhú?

Čo je php-obr

PHP-FIG (Framework PHP Interop Group) je organizovaná skupina vývojárov, ktorej cieľom je nájsť spôsoby, ako spolupracovať niekoľko rámcov.

Len si predstavte: Teraz podporujete projekt na Ráde Zend, ktorý potrebujete modul košíka obchodu. Takýto modul ste už napísali na predchádzajúci projekt, ktorý bol na symfónii. Nerobte to znova? Našťastie a Zendf a Symphony sú súčasťou PHP-Obr, takže môžete importovať modul z jedného rámca do druhého. Nie je to skvelé?

Poďme zistiť, ktoré rámce zadajte php-obr

Účastníci PHP-Obr

Každý vývojár môže vytvoriť svoj rámec na zozname účastníkov PHP-Obr. Avšak, na to bude potrebné zaplatiť určitú sumu, takže ak nemáte podporu Spoločenstva, je nepravdepodobné, že by ste s ním súhlasili. To sa vykonáva, aby sa zabránilo registrácii miliónov mikrofraymvorski bez akejkoľvek reputácie.

Súčasní účastníci:

Čo je psr?

PSR (PHP štandardné odporúčania) - štandardné odporúčania, výsledok php-obr. Niektorí členovia skupiny ponúkajú pravidlá pre každú psr, iní hlasujú na podporu týchto pravidiel alebo na ich zrušenie. Diskusia sa uskutočňuje v skupinách Google a sú k dispozícii na oficiálnej webovej stránke PHP-FIG.

Pozrime sa na niektoré PSR:

Prvým krokom na spôsob, ako kombinovať rámce, je dostupnosť všeobecnej štruktúry adresára, preto je prijatá všeobecná norma autooload.

  1. Namespace (názov menného priestoru) a trieda musia mať štruktúru () * *.
  2. Každý menný priestor musí obsahovať priestor na najvyššej úrovni ("názov dodávateľa").
  3. Každý menný priestor môže mať všetky úrovne.
  4. Každý separátor menného priestoru sa konvertuje na adresár_separator pri načítaní.
  5. Každý symbol "_" v názve triedy sa prevedie na adresár_separator.
  6. Pri načítaní sa pridá "ephp".

Príklad funkcie automatického zapnutia:

PSR-1 - Základný kódovací štandard

Tieto vsrs regulujú hlavné normy, ktorej hlavná myšlienka - ak všetci vývojári používajú niektoré normy, potom je možné vykonať prevod kódu bez akýchkoľvek problémov.

  1. V súboroch by sa mali používať iba tagy.
  2. V súboroch sa má použiť iba kódovanie UTF-8 bez kusovníka.
  3. Priestor a triedy musia nasledovať PSR-0.
  4. Názvy tried musia byť oznámené v notácii studnecaps.
  5. Trieda konštanty musia byť oznámené v veľkých prípadoch oddelených podčiarknutiami.
  6. Metódy musia byť oznámené v notácii Camelcase.

PSR-2 - Sprievodca kódovaním

Toto sú predĺžené pokyny pre PSR-1, opisujú pravidlá formátovania kódov.

  1. Kód musí zodpovedať PSR-1.
  2. Namiesto tabelácie by sa mali použiť 4 medzery.
  3. Nemala by existovať prísny limit na dĺžku reťazca, odporúčaná dĺžka je až 80 znakov.
  4. Po vyhlásení menného priestoru musí byť jeden prázdny riadok.
  5. Triedy konzoly musia byť otvorené na nasledujúcom riadku po oznámení a zatvorené po tele triedy (rovnaké pre metódy).
  6. Musí sa definovať viditeľnosť metód a vlastností (verejnosť, súkromná).
  7. Otváracie konzoly pre riadiace konštrukcie by mali byť na tej istej línii, po štruktúre konštrukcie musia byť na nasledujúcom riadku.
  8. Priestory nie sú umiestnené po otvorení okrúhlych konzol na kontrolných konštrukciách a pred zatváraním konzol.

PCR-3 - Logger Rozhranie

V PCR-3 je protokolovanie regulované, najmä základné deväť metód.

  1. LoggerinTinTinCeace poskytuje 8 metód na prihlásenie s osem úrovní RFC 5424 (ladenie, upozornenie, varovanie, chyba, kritické, upozornenie, núdzový stav).
  2. Ninth Method Log () prevezme na prvom parametri. Spôsob volania parametra výstražnej úrovne musí vrátiť rovnaký výsledok ako hovor na spôsob špecifickej protokolovej vrstvy (log (alert) \u003d\u003d upozornenie ()). Volanie metódy s neurčitou výstražnou úrovňou musí generovať PSR log \\ invalidargmentException.

Rovnako ako PSR-0, PSR-4 poskytuje vylepšené metódy automatického zapnutia.

  1. Termín "trieda" sa vzťahuje na triedy, rozhrania, znaky a iné podobné štruktúry
  2. Názov plne definovanej triedy je nasledujúci formulár: \\ t (\)*\
  3. Pri sťahovaní súboru, ktorý zodpovedá plne definovanému menu triedy:
  • Nepretržité série jedného alebo viacerých popredných menných priestorov, ktoré nepočítajú oddeľovač menového priestoru, v plne definovanom názve triedy zodpovedá aspoň jednému "root adresár".
  • Názvy adresárov a poddivorcov musia spĺňať register menného priestoru.
  • Koniec názvu úplného triedy zodpovedá názvu súboru s koncom. PHP. Register Názov súboru je povinný dodržiavať kompletný register triedy.
  • Autoloader nemôže implementovať výnimky, vytvárať chyby akejkoľvek úrovne a nie je potrebné vrátiť hodnotu.

Záver

PHP-FIG Zmení metódy písania rámcov, ale nie ako fungujú. Zákazníci často zaväzujú prácu s existujúcim kódom v rámci rámca alebo určujú, ktorý rámec by ste mali pracovať na projekte. Odporúčania PSR robia život vývojárov oveľa jednoduchšie v tomto ohľade a je to skvelé!

PHP môže byť plne nazývaný "Webový programovací jazyk", je veľmi ťažké nájsť iný takýto jazyk, ktorý by s ňou mohol konkurovať z hľadiska jeho popularity. Rozhodol som sa sa naučiť, ako sa učiť ľudí za jeho rozvojom, odpovedajte na ostré otázky, diskutujte o najnovších nových položkách, a dokonca sa snaží pozrieť do budúcnosti internetu. Pre to sme sa stretli s legendárnymi účastníkmi PHP CORE TEAM.ktoré priamo dohliadajú na rozvoj tohto jazyka a získali povesť ako uznaných svetových expertov v oblasti webových technológií.

Takže dnes vedúci vývojári PHP CORE TEAM. - (Andrei Zmievski), (Stas Malyshev), (Ilia Alshanetsky).

Ak chcete začať, prosím, povedzte mi niečo o sebe - čo teraz robíte a kde pracujete. Zapamätajte si príbeh o tom, ako ste prišli do sveta programovania.

Cm: Teraz žijem v Spojených štátoch a pracujem v firme, zaoberám sa infraštruktúrou tohto produktu - t.j. Tieto časti systému, ktoré poskytujú databázu pre celkovú funkčnosť a poskytujú rozhranie pre vývoj špecifických modulov.

Ak hovoríme o histórii môjho príchodu do programovania, začal som v škole, s programami publikovanými v časopise " Technika - Mládež" Hoci spočiatku to bolo nemožné nazvať programovanie - v podstate jednoducho zaviedol programy vytlačené v časopise, v pamäti auta a sledoval, čo bolo získané. Ale potom som sa chcel, aby som sa naučil, ako to ťažiť (v tej dobe) auto robiť to, čo chcem, a ja som začal porozumieť - na vlastnú päsť as pomocou starších - ako to všetko funguje. Zúčastnil sa na kruhoch, zachytil hodiny v knižnici na čítanie zahraničných časopisov, napísal programy pre jeho potešenie, a potom - a za peniaze. Ukázalo sa, že som rád prinútiť počítače, aby prospech, a na moje veľké šťastie, takáto zručnosť má dnes dobrý dopyt na trhu práce.

Zoznam Všetko, čo ma ovplyvnilo na tejto ceste, bude ťažké, ale najväčší vplyv na mňa, pravdepodobne mal knihy, najmä práce, ("Mythical Man-Menter") a (väzňov prevádzkujú azyl - v ruskom preklade " Duševná nemocnica v rukách pacientov ").

AZ: Po dobu 5 rokov žijem v San Franciscu a verím, že toto je najkrajšie mesto v Amerike. Pracujem v spoločnosti. Hoci ide o relatívne mladý stav, máme približne 110-120 zamestnancov. Rôzne firmy po celom svete využívajú náš produkt na monitorovanie svojich obchodných systémov a rýchlo nájsť problémy. Máme veľké klientov, ako napríklad Netflix, Priceline a ďalšie.

O mojom románe s programovaním ... Myslím, že sa vám táto profesia vyberá ako vy. Pamätám si, keď som mal 9 rokov, dostal som svoju prvú programovanú kalkulačku, ale predtým som si myslel, že som si myslel vklady pre matematiku, logiku a technické veci - pokiaľ si pamätám, tieto schopnosti boli pôvodne.

Ako svetlý príklad toho, ako to všetko začalo, dám príbeh z detstva. Potom, ja, rovnako ako väčšina sovietskych detí, nebol doma môj počítač, takže som pravidelne išiel do počítačového centra, kde si mohol prenajať hodinové auto a pracovať na základnom a pascal. Išiel som tam niekoľkokrát týždenne, ale akonáhle som prišiel z veľmi skoro ráno, bol som taký záujem, že s mojou hlavou som pre mňa spadol do zaujímavého programu, zatiaľ čo som úplne stratil zmysel času a zabudol, že je čas ísť Domov.

Prebudil som sa len vtedy, keď bolo toto centrum už zatvorené, o 10.00 hod. V tom čase rodičia už telefonovali všetkých mojich priateľov, učiteľov atď. Pri hľadaní mňa, ale našťastie na mňa vrátili z centra. Potom som sa veľmi veľa, ale pozeral som sa, chápem: koľko si spomínam sám, vždy som napísal programy a žil v tomto čiastočnom virtuálnom svete, takže moja súčasná profesia je len pokračovaním fascinujúcej cesty začala v detstve.

IA: Žijem a pracujem v Toronte, Kanade.

Pokiaľ ide o môj príchod do programovania, je to pre mňa stále prekvapujúce. Na samom začiatku mojej cesty bolo programovanie skôr koníčkom, s výnimkou jednej náhodnej práce, ktorú som nejako získal na leto a súvisiaci nízky vývoj na C. Vedome v mladšom, nikdy som neuviedol úlohy a plánuje to urobiť profesionálne. Na pozadí amatérske vychystávanie svojich programov na SI raz som sa zapojil do môjho prvého vlastného vývoja webu, ktorý bol vyrobený v jazyku Perl. Odtiaľ začína moja cesta k internetu a mojej špecializácii na webové programovanie.

Bohužiaľ, pretože tento projekt rastie na Perl, stále som nemal rád nekonzistentnosť tohto jazyka, a tu "mučená" hostingová spoločnosť, ktorá mi slúžila v tej dobe, kedysi sama navrhla nový čas PHP. Ihneď som sa páčil tento jazyk, pretože to bolo lepšie štruktúrované a bližšie v jeho syntaxi k mojim milovaným Si. Vynikajúca online dokumentácia - dokončená mojím rýchlym a konečným prechodom na to.


Ilya Alshanetsky (Ilia Alshanetsky)

Začal som používať PHP 3 tak aktívne, čo sa postupne začalo objavovať svoj vlastný vývoj, rozšírenie jeho schopností, ktoré začali pravidelne ponúkajú svojmu tvorcovi Rasmus v IRC kanáli. Záplaty a korekcie odo mňa bolo toľko, že bol z toho rýchlo unavený, a dal mi priamy prístup CVS do úložiska projektu. Od tej doby, tam bolo veľa vecí napísaných a urobil, dokonca som mal možnosť byť manažérom vydania (PHP RELEASE MASTER) pre svoje populárne verzie 4.3, 5.1 a 5.2.

Mimochodom, paralelne s touto činnosťou bolo veľa poradenských prác pre externých komerčných zákazníkov, pre ktorých boli vyriešené najmä veľmi mimoriadne problémy s produktivitou, škálovateľnosťou a bezpečnosťou ich vlastných projektov vytvorených na PHP. V jednej z týchto konzultácií som bol tak hlboko ponoril do svojho projektu, ktorý sa nakoniec stal partnerom tejto spoločnosti (Centah Inc.) a dostal v ňom CIO pozíciu, kde som v súčasnosti pracoval.

Ako ste sa dostali do PHP CORD TEAM, AKO TO TO KTORÉ SA KOOL?

AZ: Dovoľte mi odpovedať na váš príklad, ale najprv malú históriu. Začal som pracovať s PHP niekde v roku 1998, potom to bolo php 3, jedna z najstarších verzií. Veľký projekt sme prepracovali z iného jazyka do PHP a potreboval som nájsť podporu teraz takmer zabudnuté. Nenašiel som takúto knižnicu, ale naozaj som sa mi páčil, že PHP mal vynikajúcu dokumentáciu a API, takže som sa rozhodol napísať moju expanziu. Keď som skončil, okamžite ho poslal do poštovej schôdzky PHP. A nečakane sa rozhodli pridať ho na ďalšie vydanie jazyka.

Následne som dostal prístup k CVS a začal som opravovať chyby, písanie rôznych funkcií atď. Do konca roku 1999 som bol jedným z najaktívnejších členov skupiny, a potom navrhol organizovanie prvého kongresu vývojárov PHP v Izraeli, aby diskutoval o budúcnosti jazyka a zahrnula ma v tomto newslettere. Takže tam nebolo hlasovanie, stalo sa to, že som sa okamžite dostal do PHP CORE TEAM..


Rasmus Lerdorf (Rasmus Lerdorf), Creator PHP

Takáto dôvera a otvorenosť ma motivovala pracovať viac a viac cez kódu PHP. Po WDDX, pracoval som na module relácie, potom napísal banda funkcií na prácu s poliami, potom som sa rozhodol, že PHP by mal mať pravidelné výrazy ako Perl, takže vytvoril modul PCRE. Do tej doby, PHP 4 dlho vyšiel von, ale niektoré problémy som bol veľmi naštvaný s tým, ako som pracoval (alebo skôr nefungovali) objekty a triedy. Pri tejto príležitosti som mal veľa korešpondencie s ANDI a ZEEV, ktorá vytvorila a od neho sa ukázala v podstate nová podpora Objektovo orientované programovanie V novej PHP 5.

Potom som pracoval hlavne cez kód Zend Engine, tiež urobil nový modul tokenizátora. Od roku 2003 spolu s Rasmusom a tam som spustil projekt na podporu Unicode v PHP, ale to je na inom čase ...

Čo si myslíte, že je to v PHP, čo to urobilo tak populárne?

AZ: Tak sa to stalo, že v súčasnosti píšem projekt na C ++ a Python, takže budem odpovedať na základe tejto komparatívnej skúsenosti, vyzerať ako táto "iná zvonica".

Pre mňa je hlavná vec, že \u200b\u200bPHP má bohaté a rozsiahle API, s ktorým môžete rozšíriť jazyk v mnohých, dokonca aj neočakávaných smeroch. Na druhej strane som často počul od ľudí, ako ľahko to bolo začať používať PHP a ako sa im páči, že môžete napísať webovú stránku alebo program v priebehu niekoľkých hodín. Tu je podstata PHP: Je to v rovnakom čase komplexné a jednoduché, staromódne a moderné, originálne a požičiavané nápady z vonkajšej strany - je to jednoducho veľmi univerzálne.

Chyby súvisiace s bezpečnosťou sú hlavnou bolesťou hlavy pre webových programátorov a mnohých používateľov svojich výrobkov. Pri pohľade na svoje bohaté skúsenosti, aké sú najdôležitejšie a typické problémy s bezpečnosťou PHP a jeho vývojárov, môžete zvýrazniť? Môžete poskytnúť nejaké rady v oblasti editácie mladých programov PHP?

Cm: Jedným z hlavných lekcií, zdá sa mi, že bezpečnosť kódu nie je kvalitou, ktorá môže byť vštepovaná smerom von, bez ohľadu na zvyšok kódu. Starostlivosť o bezpečnosť by mala byť denná časť práce, od prvej minúty, počnúc dizajnom a na vydanie hotového výrobku. V PHP bolo vykonaných niekoľko pokusov o pridanie bezpečnostných nástrojov "zvonku" - ale skúsenosti ukázali, že tieto pokusy, bez neustálej ostražitosti programátorom, sú odsúdené na zlyhanie. Platforma mu môže pomôcť dodržiavať bezpečnosť kódexu, ale nemôže zaručiť túto bezpečnosť bez úsilia z jeho časti.

Preto bude hlavnou radou nasledovné - nikdy dôverujte žiadne externé údaje alebo údaje, kontrolu nad ktorou je možné. 99% z bezpečnostných problémov sa vyskytuje, pretože predpoklady týkajúce sa vstupných údajov sú nesprávne, a keď sa útok následne vyskytne, kód sa nespôsobí, že sám developer. Preto vyvinúť zvyk sa opýtať sami seba vždy - "Čo ak je tento parameter zmeniť neočakávaný spôsob? Čo ak sa tento argument vzťahuje, pretože sa predpokladalo? " A otestujte svoj kód.

Ďalšie moje odporúčania je namiesto kontroly "Neexistuje žiadny problém niečoho neoprávneného", preventívne previesť dáta tak, aby boli zaručené podľa potreby. Takže to bude oveľa jednoduchšie vyhnúť sa chybám. Tiež sa nespoliehajú, že ostatné časti kódu sa postará o bezpečnosť - napríklad, ak urobíte dynamickú požiadavku na databázu, vždy sa uistite, že parametre a požiadavky sú generované a filtrované takým spôsobom sQL Injekcia Je nemožné - aj keď ste si istí, že údaje sú stále filtrované (napríklad na úrovni rámca). Potom, ak sa externý kód zmení takým spôsobom, že neflikované údaje náhle spadajú do vášho postupu, zraniteľné miesta tak nevznikajú.

Rýchly rast mobilných aplikácií bude pravdepodobne pokračovať, ale mnohé z nich sa prepne na HTML5 ako univerzálnu platformu. V tomto ohľade bude potrebné vyvinúť protokoly synchronizácie údajov, ako aj vo vývoji modelov, ktoré nám umožňujú pracovať súčasne s tradičnými prehliadačmi a rôznymi mobilnými klientmi, ktorí majú často rôzne funkcie.

Všeobecne platí, že prehliadač sa konečne stane plnou súčasťou webovej infraštruktúry, a preto je súčasťou zodpovednosti vykonaných serverom teraz obráti na strane klienta. Preto by som radil ľuďom, ktorí pracovali teraz s PHP, zároveň sledovať najnovšie úspechy v Javascript, HTML5, CSS3 atď.

Ďakujem členom PHP CORE TEAM.Kto, napriek veľkým zamestnanosti, láskavo zistil, že čas odpovedať na otázky pre našich čitateľov.

Znaky:


Andrei Zmeievsky, jeden z kurátorov Projekt PHP., Developer Zend Engine, tvorca projektov a spoluautorom populárnej učebnice, autorom Unicode a Implementácie OOP v PHP. Vo svojom voľnom čase je fond športu, varenie doma, varenie. Miluje veľa čítať a cestovať.

Stas Malyshev, účastník Projekt PHP. Od roku 2000, manažér vydania PHP 5.4, člen mnohých projektov OpenSource. Vo svojom voľnom čase, intelektuálne hry (športová verzia "Čo? Kde? Kedy?", "Brain Ring") a Aikido.

Ilya alschenetskyBezpečnostný expert a jeden z najstarších vývojárov PHP, kapitoly, manažéra vydania PHP 4.3, 5.1, 5.2 verzie, tvorca motora fóra, aktívny člen Set OpenSource Projekty. A na bezpečnosť webového programovania.

p.S .: Sľubujem, že v novom roku 2013 budem uverejniť viac ako mnoho VIP rozhovorov s poprednými svetovými vývojármi, nech je niektoré špecifikácie tajomstvom.

Keďže rozvoj technológií viedlo k tomu, že každý programátor má teraz svoj vlastný počítač, ako vedľajší účinok, máme tisíce rôznych knižníc, rámcov, služieb, API atď. Pre všetky príležitosti. Ale keď príde tento prípad života, problém vzniká - čo ich používať a čo robiť, ak to nie je celkom vhodné - prepísať, písať od nuly alebo zapínanie niekoľko riešení pre rôzne možnosti použitia.

Myslím, že mnohí si všimli, že je často potrebné vytvoriť projekt nie je toľko, aby sme programovali, koľko písať kód pre integráciu niekoľkých hotových riešení. Niekedy takéto kombinácie sa zmenia na nové riešenia, ktoré sa môžu opakovane používať v nasledujúcich úlohách.

Obrátime sa na konkrétnu "spustenú" úlohu - objektová vrstva pre prácu s databázami v PHP. Riešenia sú skvelým množstvom, od CHOP a končiace s viacúčelou (a podľa môjho názoru nie sú celkom relevantné v PHP) ORM motoroch.

Väčšina z týchto riešení sa presťahovala do PHP z iných platforiem. Autori však často neberú do úvahy vlastnosti PHP, ktoré by umožnili ostro zjednodušiť pravopis, tak aj používanie prenosných štruktúr.
Jednou zo spoločných architektúr pre túto triedu úloh je aktívny obraz. Najmä tzv. Subjekt (subjekt) sú postavené na tomto vzore, v jednej forme alebo inom použití v mnohých plošinách, od trvalých košov v EJB3 končiacich EF veterinárom.

Takže postavíme podobný dizajn pre PHP. Pripojte dva chladné kúsky navzájom - pripravená knižnica ADODB a ľahšie a dynamické vlastnosti objektov PHP.
Jedným z početných funkcií ADODB je tzv. SQL Auto-Generation žiadosti o vložku (vložiť) a aktualizácie (aktualizáciu) záznamov založené na asociatívnych poliach s údajmi.
Vlastne nie je nič vojenské, aby si vzali pole, kde sú kľúče mená polí a hodnoty - resp Ale ADODB to robí intelektuálne. Žiadosť je založená na štruktúre tabuľky, ktorá sa predtým používa z databázového systému. Výsledkom je, že prvé, len existujúce polia klesá v SQL, a nie všetko, po druhé, typ poľa sa berie do úvahy - citácie sa pridávajú pre struny, dátumy môžu byť vytvorené na základe časovej značky, ak ho ADODB vidí namiesto a reťazec v prenášanej hodnote atď.

Teraz idete z PHP.
Predstavte si, že taká trieda (zjednodušená).

Trieda Entity (chránené polia $ \u003d pole (); verejná finálna funkcia __SET ($ name, $ hodnotu) ($ This-\u003e Fields [$ name] \u003d $ hodnotu;) Verejná finálna funkcia __GET ($ NAME) (RETURN $\u003e FINE [$ Name];)

Prejdeným interným radom knižnice ADODB môžeme automaticky vygenerovať požiadavky SQL na aktualizáciu záznamu v databáze s týmto objektom, zatiaľ čo nie je potrebný objemné návrhy mapovacích polí databázových tabuliek na objektívnom poli založené na XML a Páči sa mi to. Je potrebné len, aby názov poľa zhoduje s majetkom objektu. Keďže polia sú označované v databáze a objektových poliach, hodnota nemá hodnotu pre počítač, potom nie je dôvod, prečo sa nezhodujú.

Ukážte, ako funguje v konečnej verzii.
Kód ukončenej triedy sa nachádza na GIST. Toto je abstraktná trieda obsahujúca minimum potrebné na prácu s databázou. Všimol si, že táto trieda je zjednodušená verzia riešenia vynaloženého na niekoľkých desiatok projektoch.

Predstavte si, že máme takéto znamenie:

Vytvorte tabuľku "Používateľom" (`Užívateľské meno` Varchar (255),` COUTION` Dátum, `user_id` int (11) nie null auto_increment, primárny kľúč (` user_id`))
Typ databázy nezáleží - ADODB poskytuje prenosnosť pre všetky bežné databázové servery.

Vytvorte triedu používateľa entity, na základe triedy entity

/ ** * @ Table \u003d Používatelia * @ keyfield \u003d user_id * / užívateľ triedy rozširuje subjekt ()

Vlastne.
Používa sa jednoducho:

$ User \u003d nový používateľ (); $ User-\u003e Username \u003d "Vasya Pupkin"; $ User-\u003e vytvorené \u003d čas (); $ User-\u003e uložiť (); // Uložiť do úložiska // Upload opäť $ ThesameUser \u003d User :: LOAD ($ User-\u003e User_id); Echo $ thesameuser -\u003e užívateľské meno;

Pole tabuľky a kľúčov označujú pseudoanotáciu.
Môžeme tiež zadať prezentáciu (napríklad zobrazenie \u003d USERSVIEWSVIEW), ak je často sa stáva, účtovná jednotka je vybraná na základe jeho tabuľky s juhožnicami alebo vypočítanými poliami. V tomto prípade budú údaje vybrané z pohľadu a tabuľka bude aktualizovaná. Kto sa nepáči takéto anotácie, môžu prepísať metódu getmetatada () a špecifikovať parametre tabuľky v vrátenom poli.

Čo iného používa triedu entity v tejto implementácii?

Môžeme napríklad prepísať metódu init (), ktorá sa volá po vytvorení inštancie entity na inicializáciu predvoleného dátumu stvorenia.
Alebo preťaženie metódy APPLOADLOAD (), ktorá sa automaticky volá po načítaní účtovnej jednotky z databázy previesť dátum v časovej penzióne pre ďalšie pohodlnejšie použitie.
V dôsledku toho získame oveľa zložitejší dizajn.

/ ** * @ Tabuľka \u003d Užívatelia * @ view \u003d Usersview * @ keyfield \u003d user_id * / užívateľ triedy rozširuje entity (chránené funkcie init () ($ this-\u003e vytvorené \u003d čas ();) chránené funkcie () -\u003e vytvorené \u003d strtotime ($ this-\u003e vytvorené);)

Môžete tiež preťažiť metód BEFORESAVE A PRIPOJENÝMU A PRIESTORY ŽIVOTNÉHO CYKLUJÚCEHO CYKLUJÚCICH, KTORÉ MAJÚ PRIPOJETE VOZIDLOSTI PRED ULOŽIŤ ALEBO NIEKTORÉHO AKTIVOSTI - Napríklad odstráňte obrázky z aplikácie AppleEder pri vymazaní používateľa.

Stiahneme zoznam subjektov podľa kritéria (v podstate podmienka, kde).
Používatelia $ \u003d User :: LOAD ("Username ako" Pupkin ");
Trieda entity vám tiež umožňuje vykonávať ľubovoľné, "Native" tak, aby hovoril SQL dotaz. Chceme napríklad vrátiť zoznam používateľov s niektorými statickými skupinami. Čo konkrétne polia sa vrátia, nezáleží na nezáleží (hlavná vec je byť user_id, ak je potreba ďalšej manipulácie s entitou), stačí poznať ich mená, aby ste sa mohli otočiť na vybrané polia. Keď je účtovná jednotka udržiavaná, rovnako z vyššie uvedeného, \u200b\u200bnie je tiež potrebné vyplniť všetky oblasti, ktoré budú prítomné v predmete subjektu, tí sa dostanú do databázy. To znamená, že nemusíme vytvoriť ďalšie triedy pre ľubovoľné vzorky. Približne ako anonymné štruktúry pri odbere vzoriek v EF je tu rovnaká trieda subjektu so všetkými obchodnými logickými metódami.

Prísne povedané, vyššie uvedené metódy získavania zoznamov presahujú limity vzoru AR. V podstate sú to továrenské metódy. Ale ako starý muž OKKAM odkázal, nebudeme vyrábať esencie v prebytku potrebného a spaľovania samostatného manažéra entity alebo typu jedného.

Všimnite si, že vyššie uvedené je jednoducho triedy PHP a môžu byť prístupné a upravené, pridávanie v podstate (alebo trieda základnej jednotky) a metódy obchodnej logiky. To znamená, že nie sme len dostať kópiu riadkov databázy, konkrétne podnikateľský subjekt ako súčasť objektovej architektúry.

Kto to môže byť užitočné? Samozrejme, nečerpané nezrovnalosti, ktoré sa domnievajú, že použitie niečoho je ľahšie, doktrína nie je pevná, a nie perfekcionisti, istí, že ak sa rozhodnutie nevytiahne miliardy odvolaní do databázy v rámci sekundy, toto nie je riešenie. Posudzovanie fórami, pred mnohými konvenčnými vývojármi pracujúcimi na bežných projektoch (KOI 99,9%) skôr alebo neskôr je problém nájsť jednoduchú a pohodlnú metódu objektu pre prístup do databázy. Ale čelia skutočnosti, že väčšina riešení je buď neopodstatnená, alebo sú súčasťou akéhokoľvek rámca.

P.S. Vylúčil z rámca samostatný projekt

1. Skupina jedným kľúčom

Táto funkcia funguje ako skupina pre poľa, ale jedno dôležité obmedzenie: je možné len jedno zoskupenie "stĺpec" ($ identifikátor).

Funkcia ArrayuniqueIdentifier (Array $ Array, String $ Identifier) \u200b\u200b($ IDS \u003d Array_Column ($ Array, $ identifikátor); $ IDS \u003d Array_unique ($ IDS); $ Array \u003d Array_filter ($ Array, Funkcia ($ Key, $ Hodnota ) Použite ($ IDS) (Return In_Array ($ Hodnota, Array_KEYS ($ IDS));), Array_Filter_Use_both); RETURN $ ARRAY;)

2. Detekcia jedinečných riadkov pre tabuľku (Twodimensional Array)

Táto funkcia je určená pre filtrovanie "riadkov". Ak povieme, dvojité pole je tabuľka, potom je jeho každý prvok riadok. Takže môžeme odstrániť duplicitné riadky s touto funkciou. Dva rady (prvky prvej dimenzie) sú rovnaké, ak sú všetky ich stĺpce (prvky druhej dimenzie) rovnaké. Na súcit "stĺpci" sa uplatňujú hodnoty: ak je hodnota jednoduchého typu, samotná hodnota sa bude používať na porovnanie; V opačnom prípade sa použije jeho typ (pole, objekt, zdroj, neznámy typ).

Stratégia je jednoduchá: Vytvorte z pôvodného poľa Shalkladové pole, kde sú prvky implode d "stĺpce" pôvodného poľa; Potom na ňom aplikujte array_unique (...); A ako posledné použite zistené ID pre filtrovanie pôvodného poľa.

Funkcia ArrayuniqueByRew (pole $ tabuľka \u003d, reťazec $ Imlodeseparator) ($ ElementStrings \u003d; Foreach ($ tabuľka ako $ Row) (// Aby sa zabránilo oznámeniam, ako je "Array na konverziu reťazca". $ ElementPreparedForimPlode \u003d Array_map (Funkcia (Funkcia) $ CALUETYPE \u003d GETTYPE ($ point); $ SimpleTepes \u003d ["Boolean", "Integer", "Double", "Float", "String", "NULL"]; $ poory: $ valuethype; návrat $ poľa;), $ Row); $ elementstrings \u003d implodovať ($ Imlodseparator, $ elementpreredforimplode);) $ elementsstringsUnique \u003d Array_unique ($ Elementstrings); Návrat $ tabuľka;)

Je tiež možné zlepšiť porovnanie, detekcia triedy "stĺpec", ak je jeho typ objekt.

$ ImlodeSeparator by mal byť viac alebo menej komplexný, z.b. Spl_Object_hash ($ This).

3. Detekcia riadkov s jedinečným identifikačným stĺpom pre tabuľku (Twodimensional Array)

Toto riešenie sa spolieha na 2. jedného. Teraz úplný "riadok" nemusí byť jedinečný. Two "riadky" (prvky prvej dimenzie) sú teraz rovnaké, ak všetko relevantné. "Polia jedného" riadku "sa rovná" poliam "(prvky s rovnakým kľúčom).

"Príslušné" "polia" sú druhá dimenzia "(prvky druhej dimenzie), ktoré majú kľúč, ktorý sa rovná jednému z prvkov prijatých" identifikátorov ".

Funkcia ArrayUniqueByMultiPleedifiers (Array $ Table, Array $ Identifikátory, reťazec $ Imlodseparator \u003d NULL) ($ ArrayformerSuniqueByRewer \u003d $ RemoveAreraycolumns ($ tabuľky, $ Identifikátory, TRUE); $ ArrayuniqueByReReparator); $ ArrayUniqueByMultiPleeDestifikátory ($ stola, $ ArrayuniqueByRing); RETURN $ ARRAYUNIQUEBYMULTIPLEITTIFEENTIFIKÁCIE;) Funkcia RemiseArRaycolumns (Array $ tabuľka, Array $ Columnnams, Bool $ iswhitelist \u003d FALSE) (FOREACH ($ tabuľka ako $ Rowkey \u003d\u003e $ Row) (IF (IS_ARAY ($ ROWEY \u003d\u003e $ Row) )) (Foreach ($ Row ako $ FieldName \u003d\u003e $ FieldValue) (ak (! In_Array ($ FieldName, $ COMMITNAMES)) (Unset ($ tabuľka [$ Rowkey] [$ FieldoweName]);)))) inak (Foreach ( $ ROW AS $ FIELDNAME \u003d\u003e $ FOLDVALUEUE) (ak (in_array ($ fieldname, $ stonky)) (Unset ($ tabuľka [$ Rowkey] [$ fieldName]);));)