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.