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

Programowanie obiektowe dla początkujących

Metody i składowe statyczne

Do tej pory definiowaliśmy takie klasy, które trzeba było konkretyzować, czyli tworzyć jej obiekt aby można było mieć dostęp do jej składowych i metod. Niekiedy jest taka potrzeba, aby wszystkie obiekty danej klasy (lub hierarchii) miały składową, której zmiana w jednym obiekcie będzie widoczna we wszystkich obiektach tej klasy (lub hierarchii klas). Oto prosty przykład:

abstract class Dog{
	private static $nextId = 0;
	/* Identyfikator, który znajduje się na obroży, każdy pies powinien mieć unikalne id */
	private $id;
	private $name;

	public function __construct($name){
		$this->name = $name;
		$this->setId();//ustawienie identifikatora
	}

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

	public function getId(){
		Return $this->id;
	}
	
	private function setId(){
		$this->id = self::$nextId++;
	}

	public static function getNextId(){
		return self::$nextId;
	}
}

class Basset extends Dog{
	//jakieś metody specjalizujące
}

$reksio = new Basset ('Reksio');
echo $reksio->getId();//wyświetla "0"
$edek = new Basset ('Edek');
echo $edek->getId();//wyświetla "1"
echo Dog::getNextId();//wyświetla "2"

Atrybuty i metody statyczne nie wymagają tego, aby istniał jakiś obiekt danej klasy, gdyż należą one do klasy, a nie do konkretnego obiektu. Operator "self" dla klasy, jest tym co atrybut "$this" dla obiektu. Aby mieć dostęp do metody lub składowej statycznej wewnątrz klasy możemy wykorzystać atrybut "self" lub też nazwę klasy. Od php 5.3 wprowadzony zostanie atrybut "static", będzie on działał bardzo podobnie do "self", ale z jedną różnicą - będzie on się odnosił do klasy z której został on wywołany, nawet w przypadku gdy odwołujemy się do odziedziczonej metody (składowej).

class A{
	protected static function method(){
		echo __CLASS__;
	}
}

class B extends A{
	public static function staticTest(){
		static::method();
	}

	public static function selfTest(){
		self::method();
	}
}

B::staticTest();//wyświetli "B"
B::selfTest();//wyświetli "A"

Z poza ciała klasy możemy jedynie korzystać z nazwy klasy (nie zmiennej, która posiada referencję obiektu!). Ogólny schemat wygląda tak:

NazwaKlasy::nazwaMetody();//dla metod
NazwaKlasy::$nazwaSkładowej;//dla składowych

Dwukropek oznacza, że chcemy dostać się do statycznej metody lub składowej (w przeciwieństwie do strzałki "->", która oznacza że chcemy dostać się do metody lub składowej konkretnego obiektu). Jako że można wywołać metodę statyczną klasy, której obiekt nie został utworzony, nie można w definicji metod statycznych używać argumentu "$this".

Metody statyczne mają nieco inny charakter i sposób wykorzystania niż składowe, można napisać klasę tylko i wyłącznie z zestawem statycznych metod. Klasa ta będzie wtedy kontenerem dla zwyczajnych funkcji, dzięki czemu będzie można uniknąć konfliktu nazw z zwykłymi funkcjami które zostały już zdefiniowane (predefiniowane), np.

class Math{
	public static function add($x, $y){
		return $x + $y;
        }
}
echo Math::add(2, 5);

Metody statyczne można również wykorzystać na wiele różnych sposobów, zainteresowanym podaję hasła pod którymi powinni szukać aby poszerzyć swoją wiedzę na ten temat: wzorzec Registry (rejestr - klasyczny przykład wykorzystania metod i składowych statycznych), wzorzec Abstract Factory (fabryka abstrakcyjna - można ten wzorzec zaimplementować również bez metod statycznych), (anty)wzorzec Singleton.

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