<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>&#60;?blog &#187; metody magiczne</title>
	<atom:link href="http://blog.visionsoftware.pl/tag/metody-magiczne/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.visionsoftware.pl</link>
	<description>...nie tylko o programowaniu</description>
	<lastBuildDate>Sun, 23 Mar 2014 19:23:43 +0000</lastBuildDate>
	<language>pl-PL</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	
	<item>
		<title>Metody magiczne w PHP &#8211; część trzecia i ostatnia</title>
		<link>http://blog.visionsoftware.pl/programowanie-php/metody-magiczne-w-php-czesc-trzecia-i-ostatnia.html</link>
		<comments>http://blog.visionsoftware.pl/programowanie-php/metody-magiczne-w-php-czesc-trzecia-i-ostatnia.html#comments</comments>
		<pubDate>Tue, 28 Feb 2012 21:52:04 +0000</pubDate>
		<dc:creator><![CDATA[Marcin Fliszta]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[metody magiczne]]></category>
		<category><![CDATA[__callStatic()]]></category>
		<category><![CDATA[__invoke()]]></category>
		<category><![CDATA[__isset()]]></category>
		<category><![CDATA[__set_state()]]></category>
		<category><![CDATA[__unset()]]></category>

		<guid isPermaLink="false">http://blog.visionsoftware.pl/?p=504</guid>
		<description><![CDATA[Nadszedł czas na ostatnią część cyklu opisującego metody magiczne w PHP. W części pierwszej oraz drugiej omówiłem wiele z nich: konstruktor i destruktor, settery, gettery, metody zwiększające możliwości serializacji obiektów oraz klonowania. W niniejszym tekście przedstawię pozostałe metody magiczne: __callStatic(), __isset(), __unset(), __invoke() oraz __set_state(). Metoda __callStatic() Metoda ta pojawiła się stosunkowo niedawno, bo dopiero w PHP 5.3. Jest bardzo podobna do omawianej w poprzedniej części zestawienia metody __call(). Tak jak ona jest używania w [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Nadszedł czas na ostatnią część cyklu opisującego metody magiczne w PHP. W części <a href="http://blog.visionsoftware.pl/programowanie-php/metody-magiczne-w-php-czesc-pierwsza.html" title="Metody magiczne w PHP">pierwszej</a> oraz <a href="http://blog.visionsoftware.pl/programowanie-php/metody-magiczne-w-php-czesc-druga.html" title="Metody magiczne w PHP">drugiej</a> omówiłem wiele z nich: konstruktor i destruktor, settery, gettery, metody zwiększające możliwości serializacji obiektów oraz klonowania. W niniejszym tekście przedstawię pozostałe metody magiczne: <code>__callStatic()</code>, <code>__isset()</code>, <code>__unset()</code>, <code>__invoke()</code> oraz <code>__set_state()</code>.<span id="more-504"></span></p>
<h3>Metoda <code>__callStatic()</code></h3>
<p>Metoda ta pojawiła się stosunkowo niedawno, bo dopiero w PHP 5.3. Jest bardzo podobna do omawianej w poprzedniej części zestawienia metody <code>__call()</code>. Tak jak ona jest używania w momencie wywołania nieistniejącej metody, jednak tylko w przypadku, gdy nastąpiło to w sposób statyczny (tak też musi być sama zdefiniowana). Jako parametry <code>__callStatic()</code> przyjmuje kolejno nazwę wywołanej metody oraz tablicę zawierającą przekazane do niej parametry. Na poniższym przykładzie widać porównanie obu metod:</p>
<pre class="brush: php; title: ; notranslate">
class TestCall
{
	public function __call($nazwa, $argumenty)
	{
		echo &quot;Wywołano metodę $nazwa z parametrami: &quot; . implode(',', $argumenty) . PHP_EOL;
	}

	public static function __callStatic($nazwa, $argumenty)
	{
		echo &quot;Wywołano statycznie metodę $nazwa z parametrami: &quot; . implode(',', $argumenty) . PHP_EOL;
	}
}
$obj = new TestCall();
$obj-&gt;nieistniejacaMetoda('normalne wywołanie');
TestCall::nieistniejacaMetoda('statyczne wywołanie');
</pre>
<p>Wynik działania powyższego skryptu będzie następujący:</p>
<pre class="brush: xml; light: true; title: ; notranslate">
Wywołano metodę nieistniejacaMetoda z parametrami: normalne wywołanie 
Wywołano statycznie metodę nieistniejacaMetoda z parametrami: statyczne wywołanie 
</pre>
<h3>Metody <code>__isset()</code> oraz <code>__unset()</code></h3>
<p>Pierwsza jest wywoływana w momencie, gdy pojawia się próba dostępu do nieistniejącej właściwości obiektu poprzez funkcję <code>isset()</code> lub <code>empty()</code>. Metoda <code>__unset()</code> jest natomiast wywoływana podczas  wykonywania funkcji <code>unset()</code> na nieistniejącej właściwości. Obie przyjmują jako parametr nazwę wywołanej właściwości. Poniższy przykład obrazuje sposób działania opisanych metod:</p>
<pre class="brush: php; title: ; notranslate">
class TestowaKlasa
{
   public function __unset($nazwa)
   {
      echo &quot;Nie można usunąć '$nazwa', zmienna nie isnieje!&quot; . PHP_EOL;
   }

   public function __isset($nazwa){
      echo &quot;Właściwość '$nazwa' nie istnieje!&quot; . PHP_EOL;
   }
}

$obj = new TestowaKlasa();

unset($obj-&gt;nieistniejacaWlasciwosc);
isset($obj-&gt;nieistniejacaWlasciwosc);
</pre>
<p>Efekt działania będzie następujący:</p>
<pre class="brush: xml; light: true; title: ; notranslate">
Nie można usunąć 'nieistniejacaWlasciwosc', zmienna nie isnieje!
Właściwość 'nieistniejacaWlasciwosc' nie istnieje!
</pre>
<h3>Metoda <code>__invoke()</code></h3>
<p>Została wprowadzona w PHP 5.3 i jest wywołana w momencie, gdy następuje próba użycia obiektu w sposób przeznaczony dla funkcji. Poszczególne parametry odpowiadają tym użytym w wywołaniu obiektu. Warto pamiętać, że gdy klasa posiada zdefiniowaną metodę <code>__invoke()</code>, zastosowanie na jej obiekcie funkcji <code>is_callable()</code> zwróci w rezultacie <code>true</code>.</p>
<pre class="brush: php; title: ; notranslate">
class MojaKlasa 
{
   public function __invoke($parametr1, $parametr2)
   {
      var_dump($parametr1, $parametr2);		
   }	
}

$obj = new MojaKlasa();
$obj('abc', 123);
var_dump(is_callable($obj));
</pre>
<p>Wynik działania powyższego skryptu będzie następujący:</p>
<pre class="brush: xml; light: true; title: ; notranslate">
string(3) &quot;abc&quot;
int(123)
bool(true)
</pre>
<h3>Metoda <code>__set_state()</code></h3>
<p>Jest to metoda statyczna, która jest wywoływana w momencie użycia na klasie funkcji <code>var_export()</code>. Przyjmuje jeden parametr, zawierający eksportowane właściwości w formacie: <code>array('wlasciwosc1' => wartosc, 'wlasciwosc2' => wartosc, …)</code>. Obrazuje to przykład zaczerpnięty z dokumentacji:</p>
<pre class="brush: php; title: ; notranslate">
class MojaKlasa
{
    public $w1;
    public $w2;

    public static function __set_state($tab)
    {
        $obj = new MojaKlasa();
        $obj-&gt;w1 = $tab['w1'];
        $obj-&gt;w2 = $tab['w2'];
        return $obj;
    }
}

$obj = new MojaKlasa();
$obj-&gt;w1 = 123;
$obj-&gt;w2 = 'abc';

eval('$b = ' . var_export($obj, true) . ';'); 
var_dump($b);
</pre>
<pre class="brush: xml; light: true; title: ; notranslate">
object(MojaKlasa)#2 (2) {
  [&quot;w1&quot;]=&gt;
  int(123)
  [&quot;w2&quot;]=&gt;
  string(3) &quot;abc&quot;
}
</pre>
<h3>Podsumowanie</h3>
<p>To była ostatnia część z cyklu &#8222;Metody magiczne w PHP&#8221;. W poszczególnych artykułach omówiłem wszystkie, jakie występują w PHP 5.3. Mam nadzieję, że wyjaśniły one mechanizmy, które mogą być bardzo przydatne w programowaniu obiektowym.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.visionsoftware.pl/programowanie-php/metody-magiczne-w-php-czesc-trzecia-i-ostatnia.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Metody magiczne w PHP, część druga</title>
		<link>http://blog.visionsoftware.pl/programowanie-php/metody-magiczne-w-php-czesc-druga.html</link>
		<comments>http://blog.visionsoftware.pl/programowanie-php/metody-magiczne-w-php-czesc-druga.html#comments</comments>
		<pubDate>Tue, 20 Dec 2011 21:25:04 +0000</pubDate>
		<dc:creator><![CDATA[Marcin Fliszta]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[metody magiczne]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[__clone()]]></category>
		<category><![CDATA[__sleep()]]></category>
		<category><![CDATA[__toStrnig()]]></category>
		<category><![CDATA[__wakeup().]]></category>

		<guid isPermaLink="false">http://blog.visionsoftware.pl/?p=455</guid>
		<description><![CDATA[Jakiś czas temu przedstawiłem pierwszą część z serii artykułów opisujących metody magiczne w PHP. Dzięki ich zastosowaniu możemy uzyskać wiele dodatkowych możliwości podczas korzystania z obiektów. Dziś kolej na opisanie następnych z nich: __toStrnig(), __clone(), __sleep() oraz __wakeup(). Metoda __toString Niniejsza metoda zwraca tekstową reprezentację obiektu i zostanie wywołana w momencie, gdy będziemy chcieli go wyświetlić, na przykład przy pomocy instrukcji echo lub print. Gdy nie zdefiniujemy __toString(), efektem takiego działania będzie błąd i zatrzymanie [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Jakiś czas temu przedstawiłem <a href="http://blog.visionsoftware.pl/programowanie-php/metody-magiczne-w-php-czesc-pierwsza.html" title="Metody magiczne PHP">pierwszą część</a> z serii artykułów opisujących metody magiczne w PHP. Dzięki ich zastosowaniu możemy uzyskać wiele dodatkowych możliwości podczas korzystania z obiektów. Dziś kolej na opisanie następnych z nich: <code>__toStrnig()</code>, <code>__clone()</code>, <code>__sleep()</code> oraz <code>__wakeup()</code>.<span id="more-455"></span></p>
<h3>Metoda <code>__toString</code></h3>
<p>Niniejsza metoda zwraca tekstową reprezentację obiektu i zostanie wywołana w momencie, gdy będziemy chcieli go wyświetlić, na przykład przy pomocy instrukcji <code>echo</code> lub <code>print</code>. Gdy nie zdefiniujemy <code>__toString()</code>, efektem takiego działania będzie błąd i zatrzymanie skryptu:</p>
<pre class="brush: php; light: true; title: ; notranslate">
Catchable fatal error: Object of class MyClass could not be converted to string in /sciezka/do/skryptu/skrypt.php on line 13
</pre>
<p>Ważną rzeczą jest, że metoda musi na koniec działania zwracać wartość tekstową. Jeśli będzie to liczba, tablica lub obiekt, wygenerowany zostanie błąd. Można w takim przypadku skorzystać z konwersji typów (rzutowania). Na poniższym skrypcie przedstawiono zastosowanie omawianej metody:</p>
<pre class="brush: php; title: ; notranslate">
class MyClass
{
	private $variable;
	
	public function __construct($parametr)
	{
		$this-&gt;variable = $parametr;
	}
	
	public function __toString()
	{
		return $this-&gt;variable;		
	}
}

$object = new MyClass(&quot;abc&quot;);
echo $object;
</pre>
<p>Efektem działania skryptu będzie po prostu wyświetlenie zawartości właściwości <code>$variable</code>, czyli <code>abc</code>.</p>
<h3>Metoda <code>__clone()</code></h3>
<p>W PHP5 w odróżnieniu od wersji 4 wszystkie obiekty reprezentowane są przez referencję. Nie jest więc możliwe bezpośrednie tworzenie kopii obiektów. Poniższy kod spowoduje przypisanie pod  <code>$anotherObject</code> referencji do <code>$object</code>:</p>
<pre class="brush: php; light: true; title: ; notranslate">
$object = new MyClass();
$anotherObject = $object;
</pre>
<p>W takim przypadku zmiana jednego z obiektów spowoduje więc jednoczesną zmianę drugiego.</p>
<p>Aby utworzyć kopię, musimy skorzystać z instrukcji <code>clone</code>:</p>
<pre class="brush: php; light: true; title: ; notranslate">
$object = new MyClass();
$anotherObject = clone $object;
</pre>
<p>Utworzenie obiektu w powyższy sposób spowoduje, że w przypadku jakiejkolwiek modyfikacji, zmieniamy tylko jeden z nich.</p>
<p>Metoda <code>__clone()</code> jest wywoływana właśnie podczas klonowania obiektu. Dzięki temu możemy wprowadzić w nim określone zmiany. Przedstawiono to na poniższym przykładzie:</p>
<pre class="brush: php; title: ; notranslate">
class MyClass
{
	private $id;
	
	private $variable;
		
	public function __construct($variable)
	{
		$this-&gt;id = md5(rand());
		$this-&gt;variable = $variable;
	}
	
	public function __clone()
	{
		$this-&gt;id = md5(rand());				
	}
}

$object = new MyClass(&quot;abc&quot;);
$object = clone $object;

var_dump($object);
var_dump($object);
</pre>
<p>Wynik działania skryptu będzie następujący:</p>
<pre class="brush: php; light: true; title: ; notranslate">
object(MyClass)#2 (2) {
  [&quot;id&quot;:&quot;MyClass&quot;:private]=&gt;
  string(32) &quot;d204e0411e7921f0b468ddb52ea87fc7&quot;
  [&quot;variable&quot;:&quot;MyClass&quot;:private]=&gt;
  string(3) &quot;abc&quot;
}
object(MyClass)#2 (2) {
  [&quot;id&quot;:&quot;MyClass&quot;:private]=&gt;
  string(32) &quot;d204e0411e7921f0b468ddb52ea87fc7&quot;
  [&quot;variable&quot;:&quot;MyClass&quot;:private]=&gt;
  string(3) &quot;abc&quot;
}
</pre>
<p>Po utworzeniu obiektu <code>$object</code> z podaniem jednego parametru, następuje jego sklonowanie. Konstruktor klasy przypisuje przekazany parametr do odpowiedniej właściwości oraz dodatkowo generuje unikalny identyfikator. Jak jednak widać metoda <code>__clone()</code> wywoływana podczas kopiowania obiektu generuje nowy identyfikator. Widać to wyraźnie po wyświetleniu zawartości obiektów: oba mają tę samą wartość zmiennej <code>$variable</code>, jednak różne <code>$id</code>.</p>
<h3>Metody <code>__sleep()</code> i <code>__wakeup()</code></h3>
<p>Kolejne dwie metody magiczne wywoływane są w przypadku serializacji obiektów. Polega ona (tak samo jak w przypadku tablic), na przekształceniu struktury danych na postać łańcucha znaków, możliwego do ponownego przekształcenia w obiekt. Wykorzystuje się do tego celu funkcje <code>serialize()</code> oraz <code>unserialize()</code>.</p>
<p>Dzięki metodom <code>__sleep()</code> oraz <code>__wakeup()</code> możemy dokonać modyfikacji obiektu oraz wybrać właściwości, które będą poddane serializacji. Metody te nie przyjmują żadnych parametrów, ale <code>__sleep()</code> powinna zwracać indeksowaną tablicę zawierającą nazwy właściwości, jakie poddane zostaną operacji.</p>
<p>Na poniższym przykładzie przedstawiono działanie metod:</p>
<pre class="brush: php; title: ; notranslate">
class MyClass
{
	private $id;
	private $variable1;
	private $variable2;
		
	public function __construct($variable1, $variable2)
	{
		$this-&gt;id = md5(rand());
		$this-&gt;variable1 = $variable1;
		$this-&gt;variable2 = $variable2;
	}
	
	public function __sleep()
	{
		return array(&quot;variable1&quot;);		
	}
	
	public function __wakeup()
	{
		$this-&gt;id = md5(rand());				
	}
}

$object = new MyClass(123, &quot;abc&quot;);
$object_s = serialize($object);
$object_u = unserialize($object_s);

echo &quot;Obiekt:&quot;;
var_dump($object);

echo &quot;Obiekt po serialize():&quot;;
var_dump($object_s);

echo &quot;Obiekt po unserialize():&quot;;
var_dump($object_u);
</pre>
<p>Efekt działania skryptu będzie następujący:</p>
<pre class="brush: php; light: true; title: ; notranslate">
Obiekt:object(MyClass)#1 (3) {
  [&quot;id&quot;:&quot;MyClass&quot;:private]=&gt;
  string(32) &quot;c57ec22b3055e619b765e52dbe9dc5f1&quot;
  [&quot;variable1&quot;:&quot;MyClass&quot;:private]=&gt;
  int(123)
  [&quot;variable2&quot;:&quot;MyClass&quot;:private]=&gt;
  string(3) &quot;abc&quot;
}

Obiekt po serialize():string(50) &quot;O:7:&quot;MyClass&quot;:1:{s:18:&quot;MyClassvariable1&quot;;i:123;}&quot;

Obiekt po unserialize():object(MyClass)#2 (3) {
  [&quot;id&quot;:&quot;MyClass&quot;:private]=&gt;
  string(32) &quot;857590827074cb64b4c0df198ecdc431&quot;
  [&quot;variable1&quot;:&quot;MyClass&quot;:private]=&gt;
  int(123)
  [&quot;variable2&quot;:&quot;MyClass&quot;:private]=&gt;
  NULL
}

</pre>
<p>Na początku tworzony jest obiekt, którego konstruktor przypisuje do dwóch właściwości przekazane parametry, oraz dodatkowo ustala pseudolosowy identyfikator. Następuje później serializacja obiektu, która zmienia jego postać na łańcuch znaków. W tym momencie wywoływana jest metoda <code>__sleep()</code>, która wybiera tylko jedną z właściwości do przechowania. W kolejnym kroku wykonywana jest czynność przywrócenia obiektu, w wyniku której uruchomiona zostaje <code>__wakeup()</code>. Dzięki temu <code>$variable1</code> zostaje odzyskana, jednak druga właściwość <code>$variable2</code> już nie (została pominięta w <code>__sleep()</code>). Dodatkowo wylosowany zostaje nowy identyfikator.</p>
<p><strong>Ciąg dalszy nastąpi&#8230;</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.visionsoftware.pl/programowanie-php/metody-magiczne-w-php-czesc-druga.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Metody magiczne w PHP, część pierwsza</title>
		<link>http://blog.visionsoftware.pl/programowanie-php/metody-magiczne-w-php-czesc-pierwsza.html</link>
		<comments>http://blog.visionsoftware.pl/programowanie-php/metody-magiczne-w-php-czesc-pierwsza.html#comments</comments>
		<pubDate>Wed, 30 Nov 2011 21:22:07 +0000</pubDate>
		<dc:creator><![CDATA[Marcin Fliszta]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[destruktor]]></category>
		<category><![CDATA[konstruktor]]></category>
		<category><![CDATA[metody magiczne]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[__call().]]></category>
		<category><![CDATA[__construct()]]></category>
		<category><![CDATA[__destruct()]]></category>
		<category><![CDATA[__get()]]></category>
		<category><![CDATA[__set()]]></category>

		<guid isPermaLink="false">http://blog.visionsoftware.pl/?p=430</guid>
		<description><![CDATA[Programując obiektowo w PHP, możemy skorzystać z kilku specjalnych metod, zwanych magicznymi, które mogą zostać użyte wewnątrz klas. Dzięki nim uzyskamy wiele dodatkowych możliwości podczas korzystania z obiektów. W niniejszej, pierwszej części z serii artykułów opisującej te zagadnienia, przedstawię konstruktor, destruktor oraz metody __set(), __get()  i __call(). Konstruktor i destruktor Są to dwie podstawowe metody, których wywołanie następuje odpowiednio podczas tworzenia nowego obiektu oraz przy jego usuwaniu. Konstruktor służy do zainicjowania obiektu, przypisania właściwości oraz [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Programując obiektowo w PHP, możemy skorzystać z kilku specjalnych metod, zwanych magicznymi, które mogą zostać użyte wewnątrz klas. Dzięki nim uzyskamy wiele dodatkowych możliwości podczas korzystania z obiektów. W niniejszej, pierwszej części z serii artykułów opisującej te zagadnienia, przedstawię konstruktor, destruktor oraz metody <code>__set()</code>, <code>__get()</code>  i <code>__call()</code>.<span id="more-430"></span></p>
<h3>Konstruktor i destruktor</h3>
<p>Są to dwie podstawowe metody, których wywołanie następuje odpowiednio podczas tworzenia nowego obiektu oraz przy jego usuwaniu. Konstruktor służy do zainicjowania obiektu, przypisania właściwości oraz wykonania podstawowych operacji podczas jego tworzenia.</p>
<p>Destruktor jest wywoływany automatycznie w momencie usuwania obiektu. Bardzo ważne jest to, że samodzielne wywołanie tej metody nie usuwa obiektu. W przypadku takiego działania zostanie po prostu wykonany zdefiniowany w destruktorze kod, jednak obiekt będzie istniał dalej. Jeśli chcemy sami go usunąć , możemy skorzystać z jednej z następujących możliwości:</p>
<pre class="brush: php; light: true; title: ; notranslate">

unset($object);
$object = null;

</pre>
<p>Nie mamy obowiązku definiowania konstruktora i destruktora, domyślnie są one puste.</p>
<p>Na poniższym przykładzie przedstawiono działanie konstruktora i destruktora:</p>
<pre class="brush: php; title: ; notranslate">

class MyClass
{
   public $variable;
   public function __construct($variable)
   {
      $this-&gt;variable = $variable;
      echo &quot;Obiekt został utworzony&quot;;
   }

   public function __destruct()
   {
      echo &quot;Obiekt został zniszczony&quot;;
   }
}

$object = new MyClass(123);
$object-&gt;__destruct();
var_dump($object);

</pre>
<p>Wynik działania skryptu będzie następujący:</p>
<pre class="brush: php; light: true; title: ; notranslate">

Obiekt został utworzony
Obiekt został zniszczony
object(MyClass)#1 (1) {
   [&quot;variable&quot;]=&gt;
   int(123)
}
Obiekt został zniszczony

</pre>
<p>Jak  można zauważyć obiekt został utworzony, w wyniku czego nastąpiło wywołanie konstruktora, który przypisał odpowiednią właściwość. W kolejnym kroku wywołano destruktor, co jak widać w dalszej części nie usunęło obiektu, a jedynie wykonało jego kod (wyświetlenie komunikatu). Można to zaobserwować w wyniku funkcji <code>var_dump()</code>. Ostatecznie obiekt został usunięty w momencie zakończenia skryptu &#8211; destruktor został wywołany ponownie, tym razem automatycznie.</p>
<h3>Metody <code>__get()</code> oraz <code>__set()</code></h3>
<p>Są to metody wywoływane w momencie, gdy następuje próba dostępu do nieistniejącej właściwości obiektu. Metoda <code>__get()</code> zostanie wykonana, gdy będziemy pobierali taką właściwość. Posiada ona jeden parametr, do którego zostaje przypisana nazwa wywoływanej właściwości.</p>
<p>Analogicznie metoda <code>__set()</code> wywoła się, gdy będziemy chcieli ustawić nieistniejącą właściwość obiektu. Przyjmuje ona dwa parametry, kolejno: nazwa oraz wartość.</p>
<p>Należy pamiętać, że gdy nie zdefiniujemy powyższych metod, to w przypadku odczytu nieistniejącej właściwości otrzymamy <code>null</code>, natomiast gdy będziemy chcieli do takiej przypisać wartość, zostanie ona w tym momencie utworzona.</p>
<p>Można to zobaczyć analizując działanie następującego skryptu:</p>
<pre class="brush: php; title: ; notranslate">

class MyClass
{
   /* ... */
}

$object = new MyClass();
$object-&gt;undefinedVariable = 123;

var_dump($object);
var_dump($object-&gt;anotherUndefinedVariable);

</pre>
<p>Efekt jego działania będzie następujący:</p>
<pre class="brush: php; light: true; title: ; notranslate">
object(MyClass)#1 (1) {
   [&quot;undefinedVariable&quot;]=&gt;
   int(123)
}
NULL

</pre>
<p>Na poniższym przykładzie przedstawiono zasadę działania metod <code>__get()</code> oraz <code>__set()</code>:</p>
<pre class="brush: php; title: ; notranslate">

class MyClass
{
   public function __construct()
   {
      echo $this-&gt;undefinedVariable;
   }

   public function __get($name)
   {
      echo &quot;Obiekt nie posiada właściwości $name&quot;;
   }

   public function __set($name,  $value)
   {
      echo &quot;Obiekt nie posiada właściwości $name, nie można więc przypisać 
wartości $value&quot;;
   }
}

$object = new MyClass();
$object-&gt;anotherUndefinedVariable = 678;

</pre>
<p>Wynikiem działania skryptu będzie:</p>
<pre class="brush: php; light: true; title: ; notranslate">

Obiekt nie posiada właściwości undefinedVariable
Obiekt nie posiada właściwości anotherUndefinedVariable, nie można więc 
przypisać wartości 678

</pre>
<p>W momencie tworzenia obiektu poprzez konstruktor nastąpiła próba odczytania zmiennej  <code>undefinedVariable</code>, co spowodowało wywołanie metody <code>__get()</code>. Gdy wykonano przypisanie do nieistniejącej właściwości <code>anotherUndefinedVariable</code>, aktywowana została metoda <code>__set()</code>;</p>
<h3>Metoda <code>__call()</code></h3>
<p>Metoda ta działa analogicznie do poprzednio omówionych, dotyczy jednak metod obiektu. W przypadku, gdy nie zdefiniujemy <code>__cal()</code> i wywołujemy nieistniejącą metodę, zostanie wyświetlony odpowiedni błąd, a działanie skryptu zatrzymane:</p>
<pre class="brush: php; light: true; title: ; notranslate">

Fatal error:  Call to undefined method MyClass::undefinedMethod() 
in /sciezka/do/pliku/skrypt.php on line 13

</pre>
<p>Po zdefiniowaniu w klasie metody <code>__call()</code>, w takim przypadku błąd nie wystąpi i zostanie wykonany zawarty w niej kod. Przyjmuje ona dwa parametry: nazwę wywołanej metody oraz tablicę zawierającą przekazane zmienne. Przykładowe zastosowanie może być nastepujące:</p>
<pre class="brush: php; title: ; notranslate">

class MyClass
{
   public function __call($name, $params)
   {
      echo &quot;Metoda $name nie istnieje. Przekazane parametry:&quot;;
      print_r($params);
   }
}

$object = new MyClass();
$object-&gt;undefinedMethod(12, &quot;a&quot;, &quot;b&quot;);

</pre>
<p>Wynik działania powyższego skryptu będzie następujący:</p>
<pre class="brush: php; light: true; title: ; notranslate">

Metoda undefinedMethod nie istnieje. Przekazane parametry:

Array
(
   [0] =&gt; 12
   [1] =&gt; a
   [2] =&gt; b
}

</pre>
<h3>Ciąg dalszy nastąpi&#8230;</h3>
]]></content:encoded>
			<wfw:commentRss>http://blog.visionsoftware.pl/programowanie-php/metody-magiczne-w-php-czesc-pierwsza.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
