Witaj, Gościu O nas | Kontakt | Mapa
Wortal Forum PHPEdia.pl Planeta Kubek IRC Przetestuj się!

Programowanie obiektowe dla początkujących

Modyfikatory dostępu

W przykładzie pojawiło się słowo "public", do czego ono służy? Jest to modyfikator dostępu. Oznacza on, że atrybut lub metoda która jest poprzedzona takim modyfikatorem, jest widoczna zarówno ze środka klasy, klas pochodnych oraz z zewnątrz klasy. Przykład dla wyjaśnienia kwestii:

class Dog{
	//ciach – definicja atrybutu name i konstruktora pominięta, taka sama jak wyżej
	public function roar(){
		echo 'chał chał';
	}
	//ciach
}

$reksio = new Dog('Reksio');
echo $reksio->name; //atrybut "name" publiczny, więc wyświetlone zostanie 'Reksio'
$reksio->roar(); //metoda roar() publiczna, więc wyświetlone zostanie 'chał chał'

Modyfikator public jest domyślnym modyfikatorem, więc jeśli przed definicją metody nie napiszemy żadnego modyfikatora dostępu, to domyślnie będzie ona publiczna. Są jeszcze dwa inne modyfikatory: protected (chroniony) i private (prywatny). Zmodyfikujmy powyższy przykład:

class Dog{
	private $name;
	public function __construct($name){
		$this->name = $name;
	}
	
	public function getName(){
		return $name;
	}
}

$reksio = new Dog('Reksio');
echo $reksio->name;//Oops, Fatal Error
//ciach
		protected $name;
//ciach

$reksio = new Dog('Reksio');
echo $reksio->name;//Oops, znów błąd!

Teraz również otrzymamy podobny komunikat błędu, czyli kolejny wniosek jest taki, że chronione atrybuty oraz metody nie mogą być wywołane z poza wnętrza definicji klasy. A więc jaka jest różnica pomiędzy modyfikatorem private, a protected? Różnica jest taka, że składowe i metody prywatne są widoczne tylko i wyłącznie z wnętrza klasy, zawierającej deklarację tej składowej lub definicje tej metody. No dobra, ale czy klasa może mieć jakąś metodę której się jawnie nie definiuje w jej ciele? Odpowiedź brzmi tak, poprzez dziedziczenie.

Powyższy przykład możemy rozbudować następująco:

class Dog{
	private $name;
	public function __construct($name){
		$this->name = $name;
	}

	public function roar(){
		echo 'chał chał';
	}

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

	public function setName($name){
		$this->name = $name;
	}
}

class Basset extends Dog{
	public function hound(){
		//metoda tropienia :P
	}

	public function addPrefixToName($prefix){
		$this->name = $prefix.' '.$prefix;
	}
}

$reksio = new Basset('Reksio');
$reksio->roar();//metoda zdefiniowana w klasie Dog widoczna w podklasie
$reksio->addPrefixToName('Jamnik');
$reksio->getName();//metoda z nadklasy. Wyświetla 'Reksio' , a nie 'Jamnik Reksio'

Powyższy kod zachował się tak, jakby składowa "name" w ogóle nie istniała w klasie Basset. I tak w zasadzie jest, modyfikator private sprawia że atrybuty oraz metody nim poprzedzone nie są dostępne dla klas pochodnych (tych które dziedziczą po klasach z prywatnymi składowymi lub metodami). Ciekawostką jest to, że jeśli w klasie Dog usuniemy składową "name" (np. poprzez zakomentowanie tej składowej) to kod będzie działał. Nie jest to zbyt pożądane, ale php tak naprawdę nie wymaga deklaracji składowych publicznych, jednak należy bezwzględnie to robić, bo w przeciwnym razie w kodzie zrobi się niezły bałagan.

Co jeśli chcemy aby składowa lub metoda była widoczna w podklasach, ale nie była widoczna z poza definicji klasy? Stosujemy modyfikator protected. Metody i składowe poprzedzone tym modyfikatorem, są widoczne w podklasach (klasach pochodnych), ale nie są widoczne z poza ciała klas z tej rodziny. Powyższy przykład będzie działał, jeśli naniesiemy następującą poprawkę w klasie Dog:

//ciach
	protected $name;
//ciach
Informacje na podobny temat:
Wasze opinie
Wszystkie opinie użytkowników: (3)
Błąd w przykładowym kodzie
Wtorek 16 Luty 2010 2:33:32 pm - mateo84 <mateo84_at_o2.pl>

Witam, próbowałem się zaznajomić z projektowaniem obiektowym w php i pozytywnie odbieram fakt, że komuś chce się pisać te wszystkie poradniki i tutoriale, tak jak ten. Ale niestety mam uwagę. 3. Modyfikacja dostępu w kodzie 4 (licząc od góry) metoda getName() nie wyświetla ani Reksio ani też Jamnik Reksio. Zapewne dlatego że gdzieś wypadałoby wpisać "echo". Jeżeli jest to zależne od konfiguracji serwera to przepraszam ja, ale jeżeli autor nie przetestował działania skryptu to coś tu jest nie "helloł".
Pozdrawiam :)

Za malo o istocie OOP
Niedziela 29 Marzec 2009 7:22:56 pm - seth

Brakuje mi w tym artykule opisu filozofii pisania obiektowego. To co w nim jest to tylko opis narzedzi ktore udostepnia PHP 5, a przeciez programowanie obiektowe to cos wiecej niz uzywanie slowek class, extend itp.

Jako, ze jest to tekst dla poczatkujacych brak wprowadzenia w istote OOP jest dla mnie bardzo duzym minusem.

Jezeli juz kogos chcemy uczyc obiektowki to zadbajmy o to aby wiedzial po co mu to do szczescia i jakie problemy rozwiazuje. W przeciwnym razie osoba taka dostaje do reki mlotek z instrukcja obslugi ale nie wie po co w ogole ma wbijac te gwozdzie.

Nie dla początkujących
Piątek 27 Marzec 2009 9:36:11 pm - orglee

Panie Piotrze posługuje się Pan bardzo hermetycznym językiem, opisując podstawy obiektówki. Nie wiem czy będąc początkującym zrozumiałbym więcej niż połowę z tego artykułu. Oprócz tego czasami wyprzedza Pana, Pańskie myślenie. Przykładem może być, użycie słów opisujących proces dziedziczenia, przed wytłumaczeniem istoty tego zagadnienia.

Mentax.pl    NQ.pl- serwery z dodatkiem świętego spokoju...   
O nas | Kontakt | Mapa serwisu
Copyright (c) 2003-2017 php.pl    Wszystkie prawa zastrzeżone    Powered by eZ publish Content Management System eZ publish Content Management System