⊗ppOpMgROP 89 of 107 menu

Skrivebeskyttede egenskaber i OOP i PHP

Lad os se på en klasse, hvor alle egenskaber er private:

<?php class Test { private $prop1 = 1; private $prop2 = 2; } ?>

Lad os nu gøre sådan, at disse egenskaber i den eksterne verden kun er tilgængelige for læsning. Tidligere har vi allerede gjort dette ved at oprette gettere for hver egenskab og ikke oprette settere.

Lad os nu bruge den magiske metode __get til at løse denne opgave. Vi vil returnere værdien af den anmodede egenskab i den. Hvordan man gør dette: navnet på den anmodede egenskab kommer i parameteren for metoden __get, i vores tilfælde $property.

Det betyder, at vi kan læse egenskaben, hvis navn er gemt i en variabel, sådan her: $this->$property (navnet på egenskaben vil være en variabel, det vil sige med dollar-tegn i starten, vi har gennemgået dette i tidligere lektioner).

Lad os lave den beskrevne metode __get:

<?php class Test { private $prop1 = 1; private $prop2 = 2; public function __get($property) { return $this->$property; } } ?>

Lad os bruge den til at læse egenskaber:

<?php $test = new Test; echo $test->prop1; // vil udskrive 1 echo $test->prop2; // vil udskrive 2 ?>

Et forsøg på at skrive noget til egenskaben vil føre til en fejl:

<?php $test = new Test; $test->prop1 = 2; // vil give en fejl ?>

Det er præcis, hvad vi har brug for: egenskaben kan læses, men ikke skrives til.

Et forsøg på at læse en ikke-eksisterende egenskab vil give en fejl:

<?php $test = new Test; echo $test->prop3; // vil give en fejl ?>

Vær også opmærksom på følgende nuance: da vi lavede skrivebeskyttede egenskaber på den gamle måde, brugte vi en getter-metode for at læse egenskaben.

I den nye metode vil vi henvise specifikt til egenskaber, som om de var offentlige. Men vi kan ikke skrive til dem, som om de var private.

Antag, at der er givet en sådan klasse User, hvis egenskaber kun er tilgængelige for læsning ved hjælp af gettere:

<?php class User { private $name; private $age; public function __construct($name, $age) { $this->name = $name; $this->age = $age; } public function getName() { return $this->name; } public function getAge() { return $this->age; } } ?>

Omdan koden for denne klasse, så den magiske metode __get bruges i stedet for gettere.

ruazencses