W poście postaram się przedstawić metody, dzięki którym dostęp do właściwości obiektu, będzie identyczny jak w przypadku tablic.

Na początku załóżmy że mamy prostą klasę.

class Iterujemy {

	public $a;

	public function __construct () {

		$this->a = 1;

	}

}

W tym przypadku aby zmienić właściwość $a, musimy użyć następującego zapisu:

$obj = new Iterujemy();

$obj->a = 5;

A co powiecie, abyśmy umożliwili sobie dostęp do właściwości w ten sposób:

$obj = new Iterujemy();

$obj['a'] = 5;

Interfejs ArrayAccess

Wszystko co nam potrzebne do szczęścia to zaimplementowanie interfejsu ArrayAcces dla naszej klasy Iterujemy. Posiada on 4 funkcje:

  • offsetExists ($name)
  • offsetSet ($name,$value)
  • offsetGet ($name)
  • offsetUnset ($name)

Przykład użycia:

class Iterujemy implements ArrayAccess {

	public $a = 6;

	public function __construct () {
	}

	public function offsetExists ($name) {

		if (isset($this->$name))
			return TRUE;
		else
			return FALSE;

	}

	public function offsetUnset ($name) {

		unset($this->$name);

	}

	public function offsetGet($name) {

		return $this->$name;

	}

	public function offsetSet($name,$value) {

		$this->$name = $value;

	}

}

 

Wyjaśnijmy sobie działanie poszczególnych funkcji:

public function offsetExists ($name) – sprawdza czy istnieje właściwość $name.
public function offsetUnset ($name) – usuwa właściwość $name.
public function offsetGet ($name) – zwraca wartość właściwości $name.
public function offsetSet ($name,$value) – ustawia wartość właściwości $name na $value.

I w ten prosty sposób mamy dostęp do własciwości obiektu klasy, jak do tablicy.Należy pamiętać, że jest to możliwe tylko dla modyfikatora public.

4 Odpowiedzi : “obiekty jak tablice w PHP cz. 1”

  1. Jesteś pewny, że w tych funkcjach ma być $this->$name ? Przecież odwołujesz się do parametru funkcji, a nie do składnika klasy, bo takiego składnika tam zresztą nie ma :P

  2. admin napisał:

    W PHP można dynamicznie dla obiektu klasy tworzyć jego właściwości. Cytowany zapis szuka właściwości o nazwie zawartej w zmiennej $name. Przykład TUTAJ. Mam nadzieje, że wyjaśni. Czekam na ewentualne pytania.

  3. KrzyHu napisał:

    Piszesz

    „Należy pamiętać, że jest to możliwe tylko dla modyfikatora public.”

    Nie do końca jest to prawda
    gdyż w zapisie $obj['b'] = 5; nasz dostęp do pol typu protected, privet

    Sprawdzone PHP 5.3.5

  4. Ralf napisał:

    Zdecydowanie moje przeoczenie. Dzięki!

Pozostaw Odpowiedź