refleksioner i folkesundhedsprogrammet,,,,, 5,,,,,,,,, 49,,,,,,, det cyber - mandag envato tuts + kurser vil blive reduceret til $3.- og' t miss.,, afspejler generelt er defineret som et program, er i stand til at kontrollere og ændre sin logik på henrettelse.i mindre tekniske termer, overvejelse anmoder et objekt til at fortælle dig om dets egenskaber og metoder, og at disse medlemmer (private).i denne lektie, vi skal grave i, hvordan det er fuldført, og når det kan vise sig nyttige.,,,, en lille historie, i begyndelsen af en alder af programmeringen, der var forsamlingen sprog.et program, skrevet i forsamlingen er bosat på den fysiske registre i computeren.dets sammensætning, metoder og værdier kan kontrolleres på et hvilket som helst tidspunkt ved læsning af registre.endnu mere, du kan ændre programmet, mens det var ikke blot ved at ændre sådanne registre.det krævede en indgående viden om det løbende program, men det var naturligt reflekterende., som med et sejt legetøj, overvejelser, men ikke misbruge det.,, som højere programmeringssprog (f.eks. c) kom denne reflektivitet falmet og forsvandt.det blev senere introduceret med samt programmering. i dag mest programmeringssprog kan bruge refleksion.statisk skrevet sprog som f.eks. kaffe, har lidt problemer med overvejelser.hvad jeg finder interessant, er imidlertid, at enhver dynamisk skrevet sprog (som php eller ruby) er stærkt baseret på overvejelser.uden begrebet refleksion, and maskinskrivning sandsynligvis ville være umulige at gennemføre.når du sender en genstand til en anden (en parameter, f.eks.), skal den modtagende objekt har ingen garanti for, at strukturen og arten af den pågældende genstand.alt, hvad det kan gøre, er at bruge overvejelser for at identificere, hvilke metoder der kan og ikke kan sendes på de modtagne objekt.,, med et enkelt eksempel, overvejelser er fremherskende i folkesundhedsprogrammet.der er faktisk flere situationer, hvor du kan bruge det uden at vide det.for eksempel: //nettuts.php require_once redaktøren. folkesundhedsprogrammet "klasse nettuts {funktion publishnextarticle() {$redaktør = nye redaktør ('john doe) $redaktør - > setnextarticle ('135523) $redaktør - > publish();}} og: //editor.php klasse redaktør (private $navn; offentlige $articleid; funktion __construct ($navn) ($- > navn = $navn} offentlig funktion setnextarticle ($articleid) ($- > articleid = $articleid;} offentlig funktion publish() (//offentliggøre logik her vender rigtigt;}}, i denne kode, vi har en direkte opfordring til lokalt brug variabel med en kendt type.at skabe de ansvarshavende, publishnextarticle(), gør det klart, at de $redaktør, variabel er af typen, redaktør.ikke noget, der er brug for her, men lad os indføre en ny klasse, der hedder, manager: //manager.php require_once. /redaktør på "; require_once. /nettuts. folkesundhedsprogrammet" klasse manager (funktion dojobfor (datetime $dato) (hvis (nye datetime()) - > gettimestamp() > $dato - > gettimestamp()) ($redaktør = nye redaktør ('john doe) $nettuts = nye nettuts(). $nettuts - > publishnextarticle ($redaktør)}}}, næste, ændre, nettuts, som så: //nettuts.php klasse nettuts {funktion publishnextarticle ($redaktør) ($redaktør - > setnextarticle ('135523) $redaktør - > publish();}}, nu, nettuts, absolut ikke har nogen relation til, redaktør, klasse.det omfatter ikke sagen, ikke aktivere sin klasse, og det ikke engang ved, den eksisterer.jeg kunne sende en genstand af type i, publishnextarticle(), metode og koden ville fungere.,,,,, så du kan se fra denne klasse billede, nettuts, kun har et direkte forhold til, chef.bestyrer, skaber det, og derfor er manager, afhænger af, nettuts,.men nettuts, ikke længere har nogen forbindelse til, redaktør, klasse og redaktør, kun er relateret til bestyrer,., runtime, nettuts, anvender en redaktør, genstand, således at den < < bruger > > og spørgsmålstegn.på runtime, folkesundhedsprogrammet inspicerer modtaget objekt, og kontrollerer, at de gennemfører, setnextarticle(), og publish(), metoder, objekt medlem oplysninger, vi kan gøre på skærm detaljerne i et objekt.lad os skabe en phpunit prøve at hjælpe os at udøve vores kode: //reflectiontest.php require_once '.. /redaktør på "; require_once'.. /nettuts. folkesundhedsprogrammet" klasse reflectiontest udvider phpunit_framework_testcase {funktion testitcanreflect() {$redaktør = nye redaktør ('john doe) $tuts = nye nettuts(). $tuts - > publishnextarticle ($redaktør)}}, tilføje, var_dump(), til nettuts: //nettuts.php klasse nettuts {funktion publishnextarticle ($redaktør) ($redaktør - > setnextarticle ('135523) $redaktør - > publish(); var_dump (nye reflectionclass ($redaktør)}}, afprøve og se magien ske i produktion, phpunit 3.6.11 af sebastian bergmann.objekt (reflectionclass)Å (1) (["navn"] = > string (6) "redaktør"}: 10 sekunder, hukommelse: 2.25mb ok (1 - 0 påstande), vores overvejelser klasse har et navn, fast ejendom, der er fastsat i den oprindelige form af $redaktør variabel:, redaktør,, men det er ikke mange oplysninger.hvad med, redaktør, metoder?//nettuts.php klasse nettuts {funktion publishnextarticle ($redaktør) ($redaktør - > setnextarticle ('135523) $redaktør - > publish(). $reflektor = nye reflectionclass ($redaktør); var_dump ($reflektor - > getmethods())}}, i denne kode, vi tildeler overvejelserne klasse instans til $reflektor, variable, så vi nu kan udløse sine metoder., reflectionclass, afslører en lang række af de metoder, som de kan bruge til at opnå et objekt er information.en af disse metoder, er, getmethods(),, og der kommer et system, der indeholder hver metode er information. phpunit 3.6.11, af sebastian bergmann.- system (3) ([0] = > & objekt (reflectionmethod)Ä (2) (["navn"] = > string (11) "__construct" ["klasse"] = > string (6) "redaktør"} [1] = > & objekt (reflectionmethod)Ã (2) (["navn"] = > string (14) "setnextarticle" ["klasse"] = > string (6) "redaktør"} [2] = > & objekt (reflectionmethod)Â (2) (["navn"] = > string (7) "udgivelse" ["klasse"] = > string (6) "redaktør"}}: 10 sekunder, hukommelse: 2.25mb ok (1 - 0 påstande), en metode, getproperties(), har egenskaber (private ejendomme.af målet:, phpunit 3.6.11 af sebastian bergmann..array(2) { [0]=> &object(ReflectionProperty)#196 (2) { ["name"]=> string(4) "name" ["class"]=> string(6) "Editor" } [1]=> &object(ReflectionProperty)#195 (2) { ["name"]=> string(9) "articleId" ["class"]=> string(6) "Editor" } } Time: 0 seconds, Memory: 2.25Mb OK (1 test, 0 assertions),The elements in the arrays returned from ,getMethod(), and ,getProperties(), are of type ,ReflectionMethod, and ,ReflectionProperty,, respectively; these objects are quite useful:, //Nettuts.php class Nettuts { \tfunction publishNextArticle($editor) { \t\t$editor->setNextArticle('135523'); \t\t$editor->publish(); //first call to publish() \t\t$reflector = nye reflectionclass ($redaktør); $publishmethod = $reflektor - > getmethod ('publish. $publishmethod - > påberåbe sig ($redaktør); //anden indkaldelse til publish()}}, her, vi bruger, getmethod(), for at finde en fælles metode med navnet "offentliggøre"; der er et resultat af, reflectionmethod, objekt.så kalder vi det, invoke(), metode, der passerer det, $redaktør, formål, med henblik på at gennemføre redaktør, publish(), metode, en anden gang. denne proces var enkel i vores sag, fordi vi allerede havde en redaktør, imod, at gå til, invoke(),.vi har måske flere, redaktør, genstande, i nogle tilfælde, giver os den luksus at vælge som formål at anvende.i andre tilfælde, har vi ingen objekter til at arbejde med, i hvilket tilfælde, ville vi være nødt til at opnå en fra, reflectionclass,. lad os ændre, redaktør, er, publish(), en metode til at påvise den anden opringning: //editor.php klasse redaktør ([...] offentlig funktion publish() (//offentliggøre logik her echo ("), n"); tilbage.}), og den nye produktion, phpunit 3.6.11 af sebastian bergmann.. her: 10 sekunder, hukommelse: 2.25mb ok (1 - 0 påstande), manipulere instans data, kan vi også ændre den kode på henrettelse.hvad med at ændre et privat variabel, der er ingen offentlige setter?lad os tilføje en metode til redaktør, der har redaktør navn: //editor.php klasse redaktør (private $navn; offentlige $articleid; funktion __construct ($navn) ($- > navn = $navn} [...] funktion geteditorname() {tilbage $- > navn}}, denne nye metode, geteditorname(), og blot vender værdien fra den private, $navn, variabel.de $navn, variable er fastsat til oprettelse, og vi har ingen offentlige metoder, så lad os ændre det.men vi kan få adgang til denne variabel ved hjælp af refleksion.du kan forsøge mere tydelig strategi: //nettuts.php klasse nettuts {funktion publishnextarticle ($redaktør) (var_dump ($redaktør - > geteditorname()); $reflektor = nye reflectionclass ($redaktør); $editorname = $reflektor - > getproperty ('name. $editorname - > getvalue ($redaktør)), selv om dette output værdi på, var_dump(), linje, det er en fejl, når de forsøger at hente værdi med overvejelser:, phpunit 3.6.11 af sebastian bergmann.estring (8) "john doe": 10 sekunder, hukommelse: 2.50mb var der 1 fejl: 1) reflectiontest: testitcanreflect reflectionexception: ikke har adgang til andre medlemsstater redaktør: navn [...] /refleksion i folkesundhedsprogrammet /kilde /nettuts. php: 13 [...] /refleksion i folkesundhedsprogrammet /kilde /test /reflectiontest. php: 13 /bar /bin /phpunit: 46 fiaskoer!test: 1, påstande: 0, fejl: 1. med henblik på at løse dette problem, er vi nødt til at spørge, reflectionproperty, formål, til at give os adgang til private variabler og metoder: //nettuts.php klasse nettuts {funktion publishnextarticle ($redaktør) (var_dump ($redaktør - > geteditorname()) og $reflektor = nye reflectionclass ($redaktør); $editorname = $reflektor - > getproperty ('name. $editorname - > setaccessible (korrekt). var_dump ($editorname - > getvalue ($redaktør)), hvori der setaccessible() og passerer, rigtigt, gør, phpunit 3.6.11 af sebastian bergmann.. string (8) "john doe" string (8) "john doe": 10 sekunder, hukommelse: 2.25mb ok (1 - 0 påstande), som du kan se, har vi formået at læse privat variabel.den første linje af produktionen fra objektet er, geteditorname(), metode, og det andet kommer fra overvejelser.men hvad med at ændre en privat variabel værdi?brug den, setvalue(), metode: //nettuts.php klasse nettuts {funktion publishnextarticle ($redaktør) (var_dump ($redaktør - > geteditorname()); $reflektor = nye reflectionclass ($redaktør); $editorname = $reflektor - > getproperty ('name. $editorname - > setaccessible (korrekt); $editorname - > setvalue ($redaktør, mark twain '); var_dump ($editorname - > getvalue ($redaktør)), og det er det.denne kode ændringer "john doe" til "mark twain.", phpunit 3.6.11 af sebastian bergmann.. string (8) "ukendt". (10) "mark twain": 10 sekunder, hukommelse: 2.25mb ok (1 - 0 påstande), indirekte refleksion, nogle af folkesundhedsprogrammet er indbyggede funktioner indirekte bruger overvejelse er, call_user_func(), funktion. den callback call_user_func(),,, funktion, accepterer et system: det første element, der fører til en genstand, og den anden metode er navn.du kan levere et valgfrit parameter, som er givet til "metode.for eksempel: //nettuts.php klasse nettuts {funktion publishnextarticle ($redaktør) (var_dump ($redaktør - > geteditorname()); $reflektor = nye reflectionclass ($redaktør); $editorname = $reflektor - > getproperty ('name. $editorname - > setaccessible (korrekt). $editorname - > setvalue ($redaktør, mark twain '); var_dump ($editorname - > getvalue ($redaktør)); var_dump (call_user_func (array ($redaktør, geteditorname)))), følgende output viser, at kodeksen har korrekt værdi:, phpunit 3.6.11 af sebastian bergmann.. string (8) "ukendt". (10) "mark twain" string (10) "mark twain": 10 sekunder, hukommelse: 2.25mb ok (1 - 0 påstande), ved hjælp af en variabel værdi, et eksempel på indirekte refleksion kalder en metode med den værdi, der er indeholdt i en variabel i modsætning til direkte at kalde det.for eksempel: //nettuts.php klasse nettuts {funktion publishnextarticle ($redaktør) (var_dump ($redaktør - > geteditorname()); $reflektor = nye reflectionclass ($redaktør); $editorname = $reflektor - > getproperty ('name. $editorname - > setaccessible (korrekt). $editorname - > setvalue ($redaktør, mark twain '); var_dump ($editorname - > getvalue ($redaktør) $methodname = geteditorname; var_dump ($redaktør - > $methodname())}} denne kode producerer samme effekt som den foregående..php blot erstatter den variable med snoren, det repræsenterer, og opfordrer den metode.det virker, når man ønsker at skabe objekter ved hjælp af variabler for klasse navne.,, når skal vi bruge spejlbillede?nu, hvor vi har lagt de tekniske detaljer, bag os, hvornår skal vi udnytte spejlbillede?her er nogle scenarier:,, dynamisk maskinskrivning, sandsynligvis er umuligt uden overvejelse.,, aspekt resultatorienteret programmering, lytter fra metode kræver, og de steder, hvor kode omkring metoder, udført med refleksioner.,, phpunit, afhængig af overvejelser, som har andre håner rammer.,, web rammer i almindelig brug udtryk for forskellige formål.nogle bruger det til at aktivere modeller af genstande, synspunkter og mere.laravel får omfattende brug af overvejelser at injicere afhængighed, metaprogramming, som vores sidste eksempel er skjult overvejelser.,, kode analyse rammer, brug overvejelser at forstå din kode.,, sidste tanker, som med et sejt legetøj, overvejelser, men ikke misbruger den.overvejelser er dyrt, når du ser mange ting, og det har potentialet til at komplicere deres projekt, arkitektur og design.jeg anbefaler, at du bruger det kun, når det giver dig en fordel, eller når du har ingen anden mulighed. jeg har kun brugt overvejelser i nogle tilfælde hyppigst ved anvendelse af tredjemand, moduler, der mangler dokumentation.jeg finder mig selv ofte under kode svarende til det sidste eksempel.det er let at kalde den korrekte metode, når din mvc svarer med en variabel, der indeholder "tilføjes" eller "fjerne" værdier. tak for det!,
overvejelser i folkesundhedsprogrammet
Previous:stik af blive inden for wordpress