Ten blog nie jest już rozwijany. Wraz ze wszystkimi artykułami zostały przeniesiony pod adres wmroczkowski.pl

Czy chcesz przejść pod nowy adres?

sobota, 25 lipca 2009

Programowanie obiektowe (cz. 8) - ochrona dostępu do zmiennych składowych

W ostatnim poście przypisywaliśmy wartości właściwości. Łatwo można było zauważyć, że do zmiennej zadeklarowanej za pomocą public $name mogliśmy przypisać dowolną wartość (również taką, która kompletnie nie ma żadnego sensu). Taki sposób przypisywania wartości do właściwości uniemożliwia jakąkolwiek weryfikacje poprawności danych ani zaktualizowania jakichkolwiek innych wartości w chwili ustawiania wartości właściwości name.
Można w łatwy sposób obejść tą niedogodność. Wystarczy zawsze implementować właściwości jako funkcje (metody) o nazwach np. getNazwaWlasciwosci(wartosc) lub setNazwaWlasciwosci(wartosc). Tego rodzaju funkcje znane są jako metody dostępowe.
Żeby lepiej poznać ich działanie zróbmy mały przykład:

Tak jak w poprzednim przykładach tworzymy plik class.First.php i wprowadzamy poniższy kod:

<?php
class First {

private $_name;

public function sayWelcome() {
echo "Witaj {$this->getName()}!";
}

public function getName() {
return $this->_name;
}

public function setName($name) {
if (!is_string($name) || strlen($name) == 0) {
throw new Exception("Wartość zmiennej jest niepoprawna");
}
else {
$this->_name = $name;
}
}

}
?>


Następnie tak jak ostatnio w pliku testfirst.php umieszczamy następujący kod:

<?php

require_once('class.First.php');

$objFirst = new First();
$objFirst->setName('Wojtek');
$objFirst->sayWelcome();

//a teraz spróbujemy wygenerować błąd

$objFirst->setName(108);
?>

W tym przykładzie zmieniliśmy status zmiennej public na private, a do nazwy dodaliśmy podkreślenie. Oczywiście podkreślenie nie jest wymagane, jest jednak zalecaną konwencją nazewniczą zmiennych prywatnych i funkcji składowych. Za pomocą słowa kluczowego private blokujemy dostęp do tej zmiennej spoza klasy lub egzemplarza tej klasy (obiektu). Natomiast mają do niej dostęp metody dostępowe, które z kolei są dostępne z zewnątrz obiektu. Metody te są poprzedzone słowem kluczowym public. Chodzi o metody setName() oraz getName() za pomocą których klasa będzie mogła sprawdzić prawidłowość wartości, przed jej przypisaniem. Jeżeli przesłana wartość nie będzie stringiem lub będzie pusta zostanie wygenerowany wyjątek. Warto też podkreślić, że domyślny poziom dostępności dla każdej funkcji lub zmiennej składowej to poziom publiczny, więc niekonieczne było podawanie słowa kluczowego public przed funkcjami. Jest to jednak dobry nawyk.

Jeżeli chodzi o poziomy dostępności zmiennych składowych to mogą one mieć trzy różne poziomy dostępności: publiczny, prywatny i chroniony. Poznaliśmy już publiczne i prywatne. Wiemy, że zmienne składowe publiczne są dostępne z dowolnego miejsca poza obiektem oraz w obiekcie. Natomiast składowe prywatne są dostępne tylko z poziomu klasy lub egzemplarza klasy. Zmienne składowe chronione to elementy o zastosowaniu wewnętrznym, takie jak uchwyt połączenia z bazą danych lub dane konfiguracyjne. Są one dostępne dla własnej klasy oraz dla klas jej potomnych, czyli w tych które odziedziczyły ich właściwości i metody.

Stosowanie metod dostępowych powinno być w aplikacji standardem nawet w przypadku gdy nie planujemy weryfikować danych. Pamiętajmy aby stosować te metody używając funkcji get i set. Utrzymamy wtedy swoją aplikację w pewnych umownych standardach. Poza tym o ile to tylko możliwe powinno się weryfikować wszelkie wprowadzane dane. Zapobiega to włamaniom oraz próbom hackowania naszej aplikacji. Poza tym można o wiele łatwiej i szybciej dodać testowanie w klasie. Przeniesie się ono na wszystkie obiekty utworzone na podstawie tej klasy.

Brak komentarzy: