När vi fortsätter vår diskussion om objektorienterad programmering i WordPress, måste vi börja prata om tanken om omfattning. Kort sagt, det här hänvisar till idén om att klasser kan styra hur deras attribut och funktioner är åtkomliga (eller huruvida de inte ens kan nås).
Detta är ännu en kärnidé av objektorienterad programmering, varefter vi borde vara i god form för att börja arbeta med en verklig WordPress-plugin.
Innan du går framåt, var vänlig och observera att varje artikel i den här serien bygger på den innan den, så om du bara går med oss, var god och kolla in de tidigare artiklarna i serien:
När vi är alla fångade, låt oss fortsätta vår diskussion om den sista delen av paradigmet som är nödvändigt för att vi ska förstå innan vi går in i praktisk tillämpning av objektorienterad programmering inom WordPress.
Enligt Wikipedia är den första definitionen av omfattningen följande:
I dataprogrammering är omfattningen av ett namn bindande - en association av ett namn till en enhet, såsom en variabel - den del av ett datorprogram där bindningen är giltig: där namnet kan användas för att hänvisa till enheten. I andra delar av programmet kan namnet referera till en annan enhet (det kan ha en annan bindning), eller alls ingenting (det kan vara obundet).
Om du inte är en erfaren programmerare är det lite förvirrande, eller hur? Faktum är att det kanske kan läsa som lite jargong.
Men det är okej eftersom syftet med denna artikel är att tillhandahålla en arbetsdefinition av räckvidd samt några praktiska exempel på hur det ser ut inom ramen för ett program.
Så, innan vi tittar på de tre olika aspekterna av räckvidd i objektorienterad programmering, låt oss formulera en renare definition.
Kortfattat refererar räckvidd till hur variabler och funktioner kan vara åtkomst från tredje parts objekt eller barnobjekt inom programmet.
Till exempel, säg att du har en inlägg
objekt och an Författare
objekt. Låt oss nu säga att författaren har attribut för förnamn
och efternamn
och den inlägg
vill komma åt dem för att exempelvis visa dem på skärmen.
Kanske skulle en illustration på hög nivå hjälpa till:
I det här inlägget, the inlägg
begär namninformation från Författare
klass. Observera att i klassen ovan är klassnamnet i den första bloggen, attributen i det andra blocket, och sedan är de tomma tredje blocken vanligtvis reserverade för funktioner.
Men det är bortom, hm, omfattning av denna artikel.
Kom ihåg: Klasser representerar vanligtvis substantiv, attribut representerar adjektiv och funktioner representerar verb eller handling som objektet kan ta. För detta ändamål inkapslas klasserna normalt sin information på strategiska sätt så att på vilket sätt de jobbar hålls gömda och Vad de kan göra är demonstrerad av deras offentligt tillgängliga funktioner.
För att göra detta måste variabler och funktioner ges ett visst räckvidd som ger andra objekt tillgång till deras information. Dessa typer av objekt inkluderar objekt från tredje part som vill utnyttja data som representeras av en klass och en annan typ av objekt representerar ett objekt som ärver information från den klassen.
Arv är bortom vad vi kommer att täcka i den här artikeln; Vi kommer dock att täcka detta lite senare i serien för dem som är helt nya till objektorienterad programmering.
Så med det sagt är vi redo att ta en titt på ett praktiskt exempel på omfattning, inklusive hur vi har använt det hittills i serien och hur det påverkar designbeslut som går framåt.
Primeren ovan borde ha förklarat, åtminstone en hög nivå, vilket omfattning är och hur det är viktigt, men om inte, kanske kommer följande avsnitt att.
Närmare bestämt ska vi titta på var och en av de typer av omfattning som variabler och funktioner kan ha, vi ska förklara vad varje betyder, och då kommer vi att förklara när du vill använda varje.
Innan vi går framåt, notera att offentlig
, skyddad
, och privat
nyckelord kan användas för att omfatta båda attributen och funktioner. Det här är viktigt eftersom de regler som gäller attribut är också tillämpliga på funktioner.
Med det sagt, låt oss ta en titt på vart och ett av sökorden.
Enkelt uttryckt, offentlig
attribut och funktioner är tillgängliga för varje typ av objekt som försöker komma åt variabeln eller funktionen.
Till exempel:
first_name = $ name; allmän funktion set_last_name ($ name) $ this-> last_name = $ name; allmän funktion get_first_name () returnera $ this-> first_name; allmän funktion get_last_name () returnera $ this-> last_name; // Övriga klassuppgifter ...
Med den här inställningen kan något objekt som kräver en förekomst av det här objektet inte bara komma åt $ first_name
och $ last_name
attribut, men kan också Byta dem. På samma sätt kan varje objekt som kallar en förekomst av objekt få åtkomst till funktionerna för att hämta namnet och ändra namnet.
Så det ställer frågan: Vad är meningen med att ha dessa funktioner om attributet blir offentligt? Jag menar att det är överflödigt eller inte? Ja. Och vi kommer att svara på det senare i artikeln när vi pratar om privat
nyckelord.
Nästa, skyddad
attribut och funktioner är tillgängliga inom ramen för den klass där de definieras, men inte för objekt från tredje part. Som sagt, de kan kallas från sin egen klass, men inte från externa klasser.
first_name = $ name; skyddad funktion set_last_name ($ name) $ this-> last_name = $ name; skyddad funktion get_first_name () returnera $ this-> first_name; skyddad funktion get_last_name () returnera $ this-> last_name; // Övriga klassuppgifter ...
Men det finns ett undantag: underklasser.
Låt oss till exempel säga att du definierar en klass som heter bidragsgivare
vilket är en underklass av Författare
, det betyder att bidragsgivare
har tillgång till Allt av skyddad
(och offentlig
) attribut och funktioner i sin föräldraklass.
Med koden ovan betyder det att du kan ringa metoder som
get_first_name ()
inifrånFörfattare
klass eller inombidragsgivare
klass men inte från alla externa klasser.Visst har underklasser mer att göra med arv vilket är något vi talar om mer senare i serien. Jag tar dock upp detta för att ge en viktig förtydligande mellan
offentlig
attribut och funktioner ochprivat
attribut och funktioner.Privat
kortfattat,
privat
attribut och funktioner låser attribut och funktioner i den klass där de definieras. Det betyder att inget externt objekt eller underklasser kan komma åt några av informationen.Det är uppenbart att det här är den strängaste omfattningen, men det ska inte läsas som om det är en dålig sak (eller en bra sak). Istället är det meningen att det är möjligt att ge en viss information för att vara dold (eller abstraherad) inom ramen för den klass där den definieras.
Gå tillbaka till vårt första exempel, låt oss ta en titt på hur vi kan refactor klassen så att den ger maximal mängd verktyg för både externa klasser och underklasser.
first_name = $ name; privat funktion set_last_name ($ name) $ this-> last_name = $ name; privat funktion get_first_name () returnera $ this-> first_name; privat funktion get_last_name () returnera $ this-> last_name; // Övriga klassuppgifter ...För det första visar detta exempel dålig användning av
privat
nyckelord.I det här exemplet är inte bara attributen otillgängliga, men funktionerna är inte heller åtkomliga. Med andra ord, för andra föremål i "omvärlden" verkar denna klass inte ha något tillgängligt. Ännu värre, inte ens underklasser kan komma åt någon av dessa uppgifter.
Kort sagt, koden är inte riktigt meningsfull.
Så, låt oss refactor detta lite men mer så att attributet förblir gömt (och därmed otillgängligt för tredje parts objekt), och vi anger ett sätt för tredje parts objekt att hämta namnen men kommer att endast tillåta den faktiska klassen och dess underklasser att ändra dem:
förnamn; allmän funktion get_last_name () returnera $ this-> last_name; // Övriga klassuppgifter ...Det är förstås bara ett exempel. Självklart lämnar vi några av implementeringsdetaljerna så att vi inte gör det vet vad detaljer kan kräva, säg namn som ska uppdateras.
Men det spelar ingen roll: Det här visar ett komplett exempel på hur
privat
,skyddad
, ochoffentlig
scoped aspekter av en klass kan fungera i samverkan med varandra för att ge en säker, strategisk väg att få tillgång till information.Abstraktion och informationsglidning
Vad gäller räckvidd kan du göra argumentet att det hela kommer till abstraktion och information att dölja.
Det vill säga att klasser (som är ritningar för objekt, om du kommer ihåg från våra tidigare artiklar) borde strategiskt organisera sin information så att:
privat
Faktum är att jag går ett steg längre och säger att du inte kommer att se faktiskt många attribut märkta som offentlig
. Istället är du mer sannolikt att se attributen markerade som skyddad
- för delklassificering - eller privat
, så att deras data kan hanteras av funktioner som är avsedda på lämpligt sätt.
Ursprungligen låter det relativt enkelt, eller hur? Och begreppet i sig är inte särskilt komplicerat, men när det gäller byggsystem som bygger på ett antal olika objekt som alla arbetar tillsammans för att ge solid abstraktion, rena gränssnitt genom vilka tredjepartsklasser och underklasser kan interagera med det och effektiva sätt att organisera information, det kan bli mer utmanande - det finns många rörliga delar att överväga.
Med det sagt är detta ett av de saker som skriver kod, interagerar med andra utvecklare, och läsningskoden kan uppfostra upplevelsen.
För vad det än är värt, är jag inte rädd för att erkänna att det fortfarande är strategier som jag inte kämpar för eftersom jag inte förstår koncepten, men för att försöka ge den renaste klassens genomförande som möjligt kan vara svårt, särskilt i ett system det kan ändras.
Men det är innehåll för ett annat inlägg.
Naturligtvis, om du har frågor eller kommentarer om något angående ämnesområdet, tveka inte att lämna dem i kommentarerna.
Från och med nästa artikel kommer vi att börja infoga en del av denna information till en praktisk tillämpning av att bygga ett WordPress-plugin.
Så för de av er som har väntat på att se hur denna serie fungerar tillsammans med WordPress, borde nästa artikel börja föra samman alla koncept som vi fortsätter serien med vårt eget WordPress-plugin med hjälp av begreppet objektorienterad programmering.