Enkapsulacja (inaczej hermetyzacja) polega na ukrywaniu widoczności funkcji i właściwości klas przed obiektami, które nie mają mieć do nich dostępu. Pozwolenie mogą mieć jedynie klasy powiązane ze sobą, na przykład poprzez dziedziczenie.
PHP udostępnia trzy modyfikatory dostępu:
- public (publiczny) – dostęp do funkcji i właściwości danej klasy ma każdy obiekt,
- private (prywatny) – najbardziej restrykcyjny modyfikator i działa tylko w obrębie danej klasy, dla jej wewnętrznych potrzeb; aby uzyskać dostęp do prywatnych elementów klasy stosuje się publiczne metody setName($value) i getName() – tzw. settery i gettery,
- protected (chroniony) – działa podobnie jak private, ale zapewnia widoczność elementów również klasom dziedziczonym.
PUBLIC
Jeśli chodzi o modyfikator public, to nie wymaga on szczegółowych analiz. Jeśli nie stosujesz enkapsulacji (czego nie zalecam!), to domyślnie każda funkcja i zmienna w programie ma tenże modyfikator, np:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php // Example.php class Example { public $value = 4; public function tester($value) { return $value; } } $example = new Example(); echo $example->value; echo $example->tester('you'); ?> |
PRIVATE
Dostęp do prywatnych elementów klasy uzyskuje się poprzez publiczne metody setName($value) i getName(). Pierwsza ustawia wartość zmiennej, a druga zwraca tą wartość. Nic skomplikowanego 🙂
Przykład:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<?php // Car.php class Car { private $brand_car; private $model_car; // ustawia nazwę marki samochodu public function setBrand($brand) { $this->brand_car = $brand; } // zwraca markę samochodu public function getBrand() { return $this->brand_car; } // ustawia model samochodu public function setModel($model) { $this->model_car = $model; } // zwraca model samochodu public function getModel() { return $this->model_car; } } // użycie klasy $car = new Car(); $car->setBrand('Citroen'); $car->setModel('C-Zero'); echo $car->getBrand().' '.$car->getModel(); // Wyświetli: Citroen C-Zero ?> |
Spróbuj teraz odczytać np: zmienną $brand_car a przekonasz się, że nie będzie to możliwe:
1 2 |
$car = new Car(); $car->brand_car; |
Otrzymasz błąd:
Fatal error: Uncaught Error: Cannot access private property Car::$brand_car in …
Tak więc modyfikator dostępu private działa bez zarzutu 🙂
PROTECTED
Dostęp do funkcji i właściwości chronionych musi być zainicjowany w publicznym konstruktorze. Konstruktor to metoda wykonywana automatycznie w chwili tworzenia obiektu.
1 2 3 4 |
function __construct() { // ... } |
Przykład:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php // Random.php class Random { function __construct() { $this->randNumber(); } protected function randNumber() { echo '<p>'.rand(1, 100).'</p>'; } } $random = new Random(); ?> |
Jak już wiemy, dostęp protected dotyczy również klas dziedziczonych.
Przykład:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php // Random.php class Random { protected function randNumber() { echo '<p>'.rand(1, 100).'</p>'; } } ?> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php // Number.php require_once('Random.php'); class Number extends Random { protected $value; function __construct() { $this->randNumber(); $this->decimal(3.5); } protected function decimal($value) { echo '<p>'.$value.'</p>'; } } $number = new Number(); ?> |
Czytaj dalej: PRZESTRZENIE NAZW →