Synlighet i PHP klasser Objektorientert programmering i PHP - Del 6 Innledning Dette er del 6 av min serie, objektorientert programmering i PHP. Søkeordene, offentlig, beskyttet og privat kan betraktes som tilgangsbransjen i PHP klasser. I PHP, kommer tilgang Specifier under emnet, synlighet. I denne delen av serien jeg forklare synlighet i PHP klasser. Vi har sett en av adkomst beskrivende: public. I denne delen av serien skal vi se betydningen av alle tre, og deres applikasjoner.
Merk: Hvis du ikke kan se koden, eller hvis du tror noe mangler (ødelagt kobling, bilde fraværende), bare kontakte meg på [email protected]. Det er, kontakt meg for den minste problemet du har om hva du leser. Klasse Struktur Strukturen i en klasse er som følger: class classname {accessspecifier eiendom; ... Accessspecifier metoden {} ...} En tilgangs Specifier er nøkkelordet, offentlig eller beskyttet eller privat. Hvert medlem (egenskapen eller metoden) bør innledes med en tilgang Specifier.
Hvis ingen tilgang specifier er der (skrevet) for en metode, deretter standard tilgangs specifier, antok for metoden er offentlig. Hva får tilgang til klassens medlemmer? Medlemmer av en klasse kan få tilgang til andre medlemmer (egenskaper og metoder) av samme klasse beskrivelse. Funksjoner, operatører, uttalelser og andre klasser (objekter) utenfor klassen beskrivelse av en bestemt klasse får også tilgang til medlemmer av den klassen, når klassen er et objekt.
En tilgangs Specifier avgjør hvorvidt en funksjon eller operatør eller klasse, i eller utenfor klassen beskrivelse kan få tilgang til medlem den styrer inne i sin klasse. Medlemmet en tilgang Specifier styrer er medlem skrevet ved siden av den i klassen beskrivelse. Jeg vil bruke uttalelser, funksjoner og klasser i illustrasjonene av tilgang til klassen. Jeg vil ikke bruke operatører for illustrasjonene. Jeg skal bruke uttrykket "ekstern funksjon". Dette refererer til en funksjon eller klasse metode som ikke er medlem av klassen beskrivelsen i spørsmålet.
Jeg vil også bruke uttrykket "ekstern statement" av samme grunn. Når jeg sier en ekstern funksjon kan få tilgang til et klassemedlem, jeg mener den eksterne funksjonen kan bruke navnet (variabel av eiendom eller navn på metode) av medlem som sitt argument eller som en variabel inne i sin definisjon. Den offentlige Tilgang Specifier Med offentlig tilgang Specifier, kan en ekstern funksjon på de offisielle medlemmer av klassen.
Følgende kode illustrerer dette (les forklaring nedenfor): class Kalkulator {public $ num1; offentlig $ num2; offentlig funksjon add () {$ sum = $ this-> num1 + $ this-> num2; returnere $ sum; }} Funksjon myFn ($ pari) {return $ pari; } $ Obj = new Kalkulator (); $ obj-> num1 = 2; $ obj-> num2 = 3; $ resultere = $ obj-> legge til (); echo $ resultat. "$ MyVar = myFn ($ obj-> num1); echo $ myVar;> Det er en funksjon i koden:? MyFn () Du har også uttalelser som ikke er i noen funksjon Den første linjen blant de gratis uttalelser instantiates.. klassen objekt kalt, obj.
Lines to og tre av de frie uttalelser bruke egenskapene til den klassen som variabler. Fordi klassemedlemmene er offentlige, kan de frie uttalelser tilgang til medlemmer av klassen. Vi har sett ting som dette før, men nå, jeg bruker dem til å forklare Specifier, offentlig. Linje 4 av de frie uttalelser viser også dette. I tråd seks av de frie uttalelser, funksjon, myFn () bruker eiendommen num1 av klassen som sitt argument. Det kunne gjøre det fordi medlemmet er offentlig i klassen num1.
Den private Tilgang Specifier Med privat tilgang spesifiserendes en ekstern funksjon eller en ekstern uttalelse kan ikke få tilgang til de private medlemmer av klassen. Med private spesifiserendes bare et medlem av en klasse beskrivelse kan få tilgang til den private medlem av klassen beskrivelse. Følgende kode viser hvordan bare et medlem av en klasse får tilgang til en privat medlem av klassen (les forklaring nedenfor): class Kalkulator {private $ num1; Privat $ num2; offentlig funksjon add () {$ this-> num1 = 2; $ this-> num2 = 3; $ sum = $ this-> num1 + $ this-> num2; returnere $ sum; }} $ Obj = new Kalkulator (); $ resultere = $ obj-> legge til (); echo $ resultat; ?> Klassen har to private medlemmer (egenskaper) og en offentlig medlem (metode).
I klassen beskrivelse, bruker add () metodedefinisjon navnene på de private medlemmer som variabler (f.eks $ this-> num1). Så add () metoden, har et medlem av klassen beskrivelse vist de private medlemmer av klassen beskrivelse. Den andre linjen i de frie uttalelser utenfor klassen beskrivelse har vært i stand til å få tilgang til add () metoden i klassen fordi add () metoden er offentlig (den har en offentlig tilgang Specifier).
Følgende kode vil ikke kompilere fordi andre gratis uttalelse forsøker å få tilgang til (bruk som variabel) en privat medlem av klassen: class Kalkulator {private $ num1; Privat $ num2; offentlig funksjon add () {$ this-> num1; $ this-> num2 = 3; $ sum = $ this-> num1 + $ this-> num2; returnere $ sum; }} $ Obj = new Kalkulator (); $ obj-> num1 = 2; $ resultere = $ obj-> legge til (); echo $ resultat; ?> Den andre linjen blant de gratis uttalelser er galt fordi den prøver å få tilgang til (bruk som variabel) den private medlem, num1.
Den beskyttede Tilgang Specifier Dersom et medlem av en klasse er offentlig, kan den nås av en ekstern funksjon og ekstern uttalelse, og også en avledet klasse beskrivelse. Dersom et medlem av en klasse er privat, kan det ikke nås av en ekstern funksjon eller ekstern uttalelse; enda en avledet klasse får ikke tilgang til den. Spørsmålet er, bør en avledet klasse egentlig ikke være i stand til å få tilgang til en privat medlem av sin base klasse (siden utledet klasse og base klassen er relatert)? Vel, for å løse dette problemet du har en annen tilgang specifier kalt, beskyttet.
Dersom et medlem av en klasse er beskyttet, kan det bli åpnet av en avledet klasse, men det kan ikke nås av en ekstern funksjon eller ekstern uttalelse. Det kan også nås av medlemmer innenfor klassen beskrivelse (base klasse). Følgende kode viser hvordan en avledet klasse kan få tilgang til en beskyttet medlem av en base klasse: class Kalkulator {beskyttet $ num1; beskyttet $ num2; } Class ChildCalculator strekker Kalkulator {offentlig funksjon add () {$ this-> num1 = 2; $ this-> num2 = 3; $ sum = $ this-> num1 + $ this-> num2; returnere $ sum; }} $ ChObj = new ChildCalculator (); $ resultere = $ chObj-> legge til (); echo $ resultat; ?> Basen klassen har bare to egenskaper og ingen metode; disse egenskapene er beskyttet.
Utledet klasse har en metode og ingen eiendom. Inne i avledet klasse, er de beskyttede egenskapene til basisklassen som brukes som variabler. Vanligvis, når et avledet klasse er ved hjelp av et medlem av en base klasse, er det en fremgangsmåte av den avledede klassen som ved hjelp av elementet, som i dette eksempelet. Koden ovenfor er OK.
Følgende kode vil ikke kompilere, fordi linje 2 blant de gratis uttalelser forsøker å få tilgang til en beskyttet medlem av en klasse (base klasse): class Kalkulator {beskyttet $ num1; beskyttet $ num2; } Class ChildCalculator strekker Kalkulator {offentlig funksjon add () {$ this-> num1; $ this-> num2 = 3; $ sum = $ this-> num1 + $ this-> num2; returnere $ sum; }} $ Obj = new Kalkulator (); $ obj-> num1 = 2; $ chObj = new ChildCalculator (); $ resultere = $ chObj-> legge til (); echo $ resultat; ?>