Programmazione orientata agli oggetti in WordPress ambito

Nel continuare la nostra discussione sulla programmazione orientata agli oggetti in WordPress, dobbiamo iniziare a parlare dell'idea di ambito. In breve, ciò si riferisce all'idea che le classi possano controllare il modo in cui i loro attributi e funzioni sono accessibili (o se possono anche essere accessibili).

Questa è un'altra idea di base della programmazione orientata agli oggetti, dopo la quale dovremmo essere in buona forma per iniziare a lavorare su un vero plugin WordPress.

Prima di andare avanti, tieni presente che ogni articolo di questa serie si basa su quello precedente, quindi se ti unisci a noi, assicurati di controllare i precedenti articoli della serie:

  1. Un introduzione
  2. Classi
  3. tipi
  4. Strutture di controllo: dichiarazioni condizionali
  5. Strutture di controllo: cicli
  6. Funzioni e attributi

Una volta che siete tutti coinvolti, continuiamo la nostra discussione sull'ultimo pezzo del paradigma necessario per comprendere prima di entrare nell'applicazione pratica della programmazione orientata agli oggetti all'interno di WordPress.

Definizione dell'ambito

Secondo Wikipedia, la prima definizione di ambito è la seguente:

Nella programmazione per computer, lo scopo di un binding di nomi - un'associazione di un nome a un'entità, come una variabile - è la parte di un programma per computer in cui è valida l'associazione: dove il nome può essere usato per riferirsi all'entità. In altre parti del programma il nome può fare riferimento a un'entità diversa (potrebbe avere un'associazione diversa) o a nulla (potrebbe non essere associato).

A meno che tu non sia un programmatore esperto, questo è un po 'confuso, non è vero? In effetti, potrebbe anche leggere come un po 'di gergo.

Ma va bene perché lo scopo di questo articolo è quello di fornire una definizione operativa dell'ambito e alcuni esempi pratici di come appare nel contesto di un programma.

Quindi, prima di esaminare i tre diversi aspetti dell'ambito della programmazione orientata agli oggetti, formuliamo una definizione più chiara. 

In breve, scope si riferisce a come le variabili e le funzioni possono essere accessibili da oggetti di terze parti o oggetti figlio all'interno del programma. 

Ad esempio, dì che hai un Post sul blog oggetto e un Autore oggetto. Quindi, diciamo che l'Autore ha attributi per nome di battesimo e cognome e il Post sul blog vuole accedervi per poterli visualizzare sullo schermo.

Forse un'illustrazione di alto livello potrebbe aiutare:

In questo post, il Post sul blog sta richiedendo informazioni sul nome da Autore classe. Si noti che nel diagramma sopra, il nome della classe si trova nel primo blog, gli attributi nel secondo blocco e quindi i terzi blocchi vuoti sono solitamente riservati per le funzioni.

Ma questo è oltre il, ahem, scopo di questo articolo.

Ricorda: le classi rappresentano in genere i nomi, gli attributi rappresentano gli aggettivi e le funzioni rappresentano i verbi o l'azione che l'oggetto può intraprendere. A tal fine, le classi normalmente incapsulano le loro informazioni in modi strategici tali Come funzionano è tenuto nascosto e che cosa possono fare è dimostrato dalle loro funzioni pubblicamente disponibili.

Per fare ciò, le variabili e le funzioni devono avere un determinato ambito che consente ad altri oggetti di accedere alle loro informazioni. Questi tipi di oggetti includono oggetti di terze parti che desiderano sfruttare i dati rappresentati da una classe e un altro tipo di oggetto rappresenta un oggetto che eredita informazioni da quella classe.

L'ereditarietà è al di là di ciò che stiamo andando a coprire in questo particolare articolo; tuttavia, lo illustreremo un po 'più avanti nella serie per coloro che sono nuovi alla programmazione orientata agli oggetti.

Quindi, con ciò detto, siamo pronti a dare un'occhiata ad un esempio pratico di ambito, compreso il modo in cui lo abbiamo usato finora nella serie e come influisce sulle decisioni di progettazione che vanno avanti.

Tutto su pubblico, privato e protetto

Il primer di cui sopra dovrebbe aver spiegato, almeno un alto livello, quale ambito è e come è importante, ma se no, allora forse le seguenti sezioni.

In particolare, daremo un'occhiata a ciascuno dei tipi di scope che possono avere variabili e funzioni, spiegheremo cosa significa ognuno, e poi spiegheremo quando vorrete usare ognuno di loro.

Prima di andare avanti, nota che il pubblico, protetta, e privato le parole chiave possono essere utilizzate per valutare entrambi gli attributi e funzioni. Ciò è importante perché le regole che si applicano agli attributi sono applicabili anche alle funzioni.

Detto questo, diamo un'occhiata a ciascuna delle parole chiave.

Pubblico

In poche parole, pubblico attributi e funzioni sono disponibili per ogni tipo di oggetto che sta tentando di accedere alla variabile o alla funzione.

Per esempio:

first_name = $ nome;  public function set_last_name ($ name) $ this-> last_name = $ name;  public function get_first_name () return $ this-> first_name;  public function get_last_name () return $ this-> last_name;  // Altri dettagli di classe ...

Data questa configurazione, qualsiasi oggetto che richiami un'istanza di questo oggetto non può solo accedere a $ first_name e $ last_name attributi, ma può anche modificare loro. Allo stesso modo, qualsiasi oggetto che chiama un'istanza di oggetto, può accedere alle funzioni per recuperare il nome e cambiare il nome.

Quindi solleva la domanda: qual è il punto di avere queste funzioni se l'attributo è reso pubblico? Voglio dire, è ridondante, non è vero? Sì. E lo risponderemo più tardi nell'articolo una volta che ne parliamo privato parola chiave.

protetta

Il prossimo, protetta attributi e funzioni sono disponibili nel contesto della classe in cui sono definiti, ma non per oggetti di terze parti. Detto questo, loro può essere chiamato all'interno della propria classe, ma non da classi esterne.

first_name = $ nome;  funzione protetta set_last_name ($ name) $ this-> last_name = $ nome;  funzione protetta get_first_name () return $ this-> first_name;  funzione protetta get_last_name () return $ this-> last_name;  // Altri dettagli di classe ...

Ma c'è un'eccezione: sottoclassi. 

Ad esempio, supponiamo che tu definisca una classe chiamata Collaboratore che è una sottoclasse di Autore, questo significa che il Collaboratore ha accesso a tutti del protetta (e pubblico) attributi e funzioni della sua classe genitore.

Dato il codice sopra, questo significa che puoi chiamare metodi come get_first_name () dall'interno del Autore classe o all'interno del Collaboratore classe ma non da qualsiasi classe esterna.

Certo, le sottoclassi hanno più a che fare con l'ereditarietà, di cui parleremo più avanti nella serie; tuttavia, propongo questo per fornire un chiarimento importante tra pubblico attributi e funzioni e privato attributi e funzioni.

Privato

in breve, privato attributi e funzioni bloccano gli attributi e le funzioni nella classe in cui sono definiti. Ciò significa che nessun oggetto esterno o sottoclassi possono accedere qualunque delle informazioni.

Chiaramente, questa è la forma più rigida di scopo ma non deve essere letta come se fosse una cosa negativa (o una buona cosa). Invece, ha lo scopo di fornire un modo affinché determinate informazioni rimangano nascoste (o astratte) nel contesto della classe in cui è definita.

Tornando al nostro primo esempio, diamo un'occhiata a come possiamo rifattorizzare la classe in modo tale da fornire la massima quantità di utilità sia per le classi esterne che per le sottoclassi.

first_name = $ nome;  funzione privata set_last_name ($ name) $ this-> last_name = $ name;  funzione privata get_first_name () return $ this-> first_name;  funzione privata get_last_name () return $ this-> last_name;  // Altri dettagli di classe ...

Innanzitutto, questo esempio dimostra un uso inadeguato del privato parola chiave. 

In questo esempio, non solo gli attributi sono inaccessibili, ma anche le funzioni non sono accessibili. In altre parole, per altri oggetti nel "mondo esterno", questa classe sembra non avere nulla a disposizione. Ancora peggio, nemmeno le sottoclassi possono accedere a queste informazioni.

In breve, il codice non ha molto senso.

Quindi, facciamo un refactoring un po 'ma più tale che l'attributo rimane nascosto (e quindi inaccessibile agli oggetti di terze parti), e specificheremo un modo per gli oggetti di terze parti per recuperare i nomi, ma solo consenti alla classe attuale e alle sue sottoclassi di cambiarle:

nome di battesimo;  public function get_last_name () return $ this-> last_name;  // Altri dettagli di classe ...

Naturalmente, questo è solo un esempio. Ovviamente, stiamo tralasciando alcuni dei dettagli di implementazione che non è così sapere quali dettagli possono richiedere, ad esempio, i nomi da aggiornare. 

Ma non importa: questo mostra un esempio completo di come privato, protetta, e pubblico Gli aspetti dell'ambito di una classe possono funzionare in congiunzione l'uno con l'altro per fornire un modo sicuro e strategico per accedere alle informazioni.

Astrazione e nascondimento delle informazioni

Per quanto riguarda lo scope, puoi argomentare che tutto si riduce all'astrazione e all'occultamento delle informazioni. 

Vale a dire che le classi (che sono progetti per oggetti, se ricordate dai nostri articoli precedenti) dovrebbero organizzare strategicamente le loro informazioni in modo tale che:

  • informazioni che dovrebbero solo essere accessibile e pertinente dovrebbe rimanere privato
  • le informazioni che dovrebbero essere accessibili da sole e le sue sottoclassi dovrebbero essere protette
  • le informazioni che dovrebbero essere accessibili da oggetti di terze parti dovrebbero essere pubbliche

In effetti, farò un ulteriore passo avanti e dirò che non è probabile che vedrete effettivamente molti attributi contrassegnati come pubblico. Invece, è più probabile che tu veda gli attributi contrassegnati come protetta - ai fini della sottoclasse - o privato, in modo che i loro dati possano essere gestiti da funzioni che vengono esaminate in modo appropriato. 

Inizialmente, questo sembra relativamente semplice, giusto? E il concetto in sé non è terribilmente complicato, ma quando si tratta di costruire sistemi che fanno affidamento su una serie di oggetti diversi che lavorano insieme per fornire una solida astrazione, interfacce pulite grazie alle quali classi e sottoclassi di terze parti possono interagire con esso, e modi efficienti di organizzare le informazioni, può diventare più difficile - ci sono molte parti in movimento da considerare.

Detto questo, questa è una di quelle cose che scrivere codice, interagire con altri sviluppatori e leggere codice può generare esperienza. 

Per quanto valga la pena, non ho paura di ammettere che queste sono ancora strategie con le quali non mi sforzo perché non capisco i concetti, ma perché cercare di fornire l'implementazione di classe più pulita possibile può essere difficile, specialmente in un sistema è adatto a cambiare.

Ma questo è il contenuto di un altro post.

Naturalmente, se hai domande o commenti su qualsiasi argomento riguardante l'argomento, non esitare a lasciarli nei commenti.

Qual'è il prossimo?

A partire dal prossimo articolo, inizieremo ad incorporare alcune di queste informazioni in un'applicazione pratica di creazione di un plug-in WordPress.

Quindi per quelli di voi che sono stati in attesa di vedere come funziona questa serie in collaborazione con WordPress, il prossimo articolo dovrebbe iniziare a riunire tutti i concetti mentre continuiamo la serie con il nostro plugin per WordPress usando il concetto di programmazione orientata agli oggetti.