<?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; konstruktor</title>
	<atom:link href="http://blog.visionsoftware.pl/tag/konstruktor/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, 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>
