<?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; __invoke()</title>
	<atom:link href="http://blog.visionsoftware.pl/tag/__invoke/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>
	</channel>
</rss>
