<?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; array dereferencing</title>
	<atom:link href="http://blog.visionsoftware.pl/tag/array-dereferencing/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>PHP 5.4 w wersji finalnej wydane!</title>
		<link>http://blog.visionsoftware.pl/programowanie-php/php-5-4-w-wersji-finalnej-wydane.html</link>
		<comments>http://blog.visionsoftware.pl/programowanie-php/php-5-4-w-wersji-finalnej-wydane.html#comments</comments>
		<pubDate>Fri, 02 Mar 2012 22:23:05 +0000</pubDate>
		<dc:creator><![CDATA[Marcin Fliszta]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[array dereferencing]]></category>
		<category><![CDATA[callable]]></category>
		<category><![CDATA[closures]]></category>
		<category><![CDATA[indirect method call]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[PHP 5.4]]></category>
		<category><![CDATA[traits]]></category>

		<guid isPermaLink="false">http://blog.visionsoftware.pl/?p=527</guid>
		<description><![CDATA[1 marca 2012, po ośmiu kolejnych wydaniach kandydujących i wielu miesiącach pracy, PHP 5.4 zostało wydane w finalnej wersji. Lista dokonanych zmian jest bardzo długa, wprowadzonych zostało sporo nowych elementów, poprawiono wydajność oraz ponad 100 bugów. O większości z tych rzeczy rozpisywano się już nie raz, dlatego postaram się tylko w skrócie podsumować najciekawsze zmiany w PHP 5.4. Większa wydajność Według opinii zamieszczonych w sieci, PHP 5.4 jest nawet o połowę szybsze i zużywa o  [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>1 marca 2012, po ośmiu kolejnych wydaniach kandydujących i wielu miesiącach pracy, PHP 5.4 zostało wydane w finalnej wersji. Lista dokonanych zmian jest bardzo długa, wprowadzonych zostało sporo nowych elementów, poprawiono wydajność oraz ponad 100 bugów. O większości z tych rzeczy rozpisywano się już nie raz, dlatego postaram się tylko w skrócie podsumować najciekawsze zmiany w PHP 5.4.<span id="more-527"></span></p>
<h3>Większa wydajność</h3>
<p>Według opinii zamieszczonych w sieci, PHP 5.4 jest nawet o połowę szybsze i zużywa o  połowę mniej pamięci w stosunku do wersji 5.3.</p>
<h3>Wbudowany serwer WWW</h3>
<p>Do PHP 5.4 jest dołączany uproszczony web serwer, dostępny z poziomu linii komend. Został stworzony tylko do celów developerskich i nie powinien być wykorzystywany w środowisku produkcyjnym.</p>
<h3>Cechy (traits)</h3>
<p>Jedna z najbardziej komentowanych nowości w PHP 5.4, wprowadza możliwość dziedziczenia po wielu klasach. Cechy definiowane są analogicznie do normalnych klas, z wykorzystaniem słowa <code>trait</code>.</p>
<p>Klasy mogą korzystać z wielu cech, które są wymieniane po przecinkach po słowie <code>use</code>. Same cechy także mogą zawierać inne, tworząc ich zbiory. Aby uniknąć konfliktu nazw, możemy wykorzystać składnię <code>insteadof</code>, dzięki której okreslimy, która metoda jest ważniejsza. Oprócz tego możemy z wykorzystaniem słowa <code>use</code> tworzyć dla nich aliasy.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
trait A {
    public function smallTalk() {
        echo 'a';
    }
    public function bigTalk() {
        echo 'A';
    }
}

trait B {
    public function smallTalk() {
        echo 'b';
    }
    public function bigTalk() {
        echo 'B';
    }
}

class Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
    }
}

class Aliased_Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
        B::bigTalk as talk;
    }
}
?&gt;
</pre>
<p>Oprócz tego słowo <code>use</code> może być wykorzystane do zmiany widoczności metody w klasie. Widać to na poniższym przykładzie:</p>
<pre class="brush: php; title: ; notranslate">
public function sayHello() {
        echo 'Hello World!';
    }
}

class MyClass1 {
    use HelloWorld { sayHello as protected; }
}

class MyClass2 {
    use HelloWorld { sayHello as private myPrivateHello; }
}
</pre>
<p>W związku z traits, wprowadzono także nową funkcję <code>class_uses()</code>, która generuje tablicę z cechami, jakich używa dana klasa:</p>
<pre class="brush: php; title: ; notranslate">
trait foo{}
class bar{
use foo;
}
print_r(class_uses(new bar));
print_r(class_uses('bar'));
</pre>
<p>Możliwości traits są znacznie bardziej rozbudowane, przedstawiłem tu jedynie podstawowe informacje. Cechy są jedną z nowości, które wzbudzają dużo emocji. Są bardzo oczekiwanym elementem, który może znacznie poprawić możliwości PHP. Jednak z drugiej strony wiele osób przestrzega przed nadużywaniem cech, co może doprowadzić do pogorszenia jakości kodu.</p>
<h3>Skrócona składnia definiowania tablic</h3>
<p>Dodany został nowy sposób na definiowanie tablic, z zastosowaniem nawiasów kwadratowych:</p>
<pre class="brush: php; title: ; notranslate">
$array1 = [&quot;foo&quot; =&gt; &quot;bar&quot;, &quot;bar&quot; =&gt; &quot;foo&quot;];
$array2 = [1, 23, 34, &quot;foo&quot;];
$array3 = [1, 2, 3, [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;], &quot;x&quot; =&gt; [7, 8, 9]];
</pre>
<h3>Bezpośredni dostęp do elementu tablicy zwracanej przez funkcję (array dereferencing)</h3>
<p>Dotychczas, aby odwołać się do konkretnego elementu tablicy zwracanej przez funkcję, należało najpierw pobrać ją całą do zmiennej, a następnie wybrać ten, który nas interesuje. W PHP 5.4 można to zrobić od razu, wskazując element tablicy bezpośrednio w wywołaniu funkcji:</p>
<pre class="brush: php; title: ; notranslate">
function myFunction() {
   return array(1, 2, 3);
}

echo myFunction()[1];
</pre>
<h3>Wywoływanie metody klasy w zapisie tablicowym (indirect method call)</h3>
<p>Istnieje obecnie możliwość wywołania funkcji danej klasy, podając w tablicy nazwę klasy oraz metodę. Obrazuje to poniższy przykład:</p>
<pre class="brush: php; title: ; notranslate">
class MyClass {
    public function myFunction($name) {
        echo &quot;Witaj $name!&quot;;
    }
}

$fn = array('MyClass', 'myFunction');
$fn(&quot;Marcin&quot;);
</pre>
<h3>Podpowiadanie typów dla callbacków (callable typehint)</h3>
<p>W przypadku callbacków możemy teraz stosować określenie typu parametru za pomocą słowa <code>callable</code>. Na poniższym przykładzie pokazano, jak można w ten sposób wymagać określonego parametru przez zdefiniowana funkcję:</p>
<pre class="brush: php; title: ; notranslate">
function myFunction(callable $callback) {
   echo &quot;Wywołuję callback: &quot; . $callback();
}

myFunction(function() { return 'Witaj!'; });
</pre>
<p>W przypadku, gdy do funkcji zostanie przekazana zmienna innego typu, otrzymamy odpowiedni błąd:</p>
<p>Catchable fatal error: Argument 1 passed to myFunction() must be callable, integer given, called in &#8230;</p>
<h3>Możliwość użycia <code>$this</code> przy funkcjach anonimowych (closures)</h3>
<p>W przypadku stosowania closure i obiektów, nie było możliwe normalne korzystanie z konstrukcji <code>$this</code> (istnieją pewne obejścia tego problemu). Kończyło się to odpowiednim błędem:</p>
<p>Fatal error: Using $this when not in object context in …</p>
<p>Najnowsza wersja PHP rozwiązuje ten problem, wynikiem działania skryptu będzie wyświetlenie zawartości zmiennej <code>$value</code>.</p>
<pre class="brush: php; title: ; notranslate">
class MyClass 
{
  private $value = „PHP 5.4”;
  public function myFunction()
  {
    return function() { return $this-&gt;value; };
  }
}
 
$a = new MyClass;
$fn = $a-&gt;myFunction();
echo $fn();
</pre>
<h3>Notacja binarna dla liczb całkowitych</h3>
<p>Dotychczas możliwe było definiowanie liczb całkowitych w systemie dziesiętnym, ósemkowym oraz szesnastkowym, stosując odpowiednie przedrostki. PHP 5.4 wprowadza taką możliwość także dla liczb binarnych, z wykorzystaniem <code>0b</code>. Poniżej przedstawiono liczbę 28 w różnych notacjach, ostatnia jest możliwa tylko w najnowszej wersji PHP:</p>
<pre class="brush: php; title: ; notranslate">
$dec = 28;
$oct = 034;
$hex = 0x1c;
$bin = 0b11100;
</pre>
<h3>Śledzenie postępu uploadu</h3>
<p>W PHP wbudowano możliwość śledzenia postępu wysyłania danych poprzez formularze. Funkcjonalność jest domyślnie włączona, jej konfiguracja opiera się na grupie zmiennych <code>session.upload_progress.*</code> w <code>php.ini</code>. Dzięki niej możemy określić, jaka ilość danych została już wysłana.</p>
<h3>Inne nowości</h3>
<p>Na zakończenie kilka innych zmian, nie wymagających szczegółowego opisu:</p>
<ul>
<li>Instrukcje <code>break</code> i <code>continue</code> nie będą już przyjmować zmiennych, należy w tym celu stosować stałe</li>
<li>Konstrukcja <code>&lt;?=</code> jest obecnie dostępna niezależnie od ustawienia <code>short_open_tag</code> w <code>php.ini</code></li>
<li>Usunięcie opcji <code>register_globals</code> &#8211; definitywny koniec zmiennych globalnych, które zostały domyślnie wyłączone już PHP 4.2</li>
<li>Usunięcie opcji <code>register_long_arrays</code> z <code>php.ini</code> &#8211; całkowite zrezygnowanie ze starych tablic <code>$HTTP_*_VARS</code> na rzecz krótkiego zapisu (np. <code>$_GET</code> zamiast <code>$HTTP_GET_VARS</code>)</li>
<li>Konwersja tablicy na string powoduje Notice</li>
</ul>
<h3>Podsumowanie</h3>
<p>Jak już wcześniej wspomniałem, pełna <a title="PHP 5.4 Changelog" href="http://php.net/ChangeLog-5.php" target="_blank">lista zmian w PHP 5.4</a> jest niezwykle długa. Wszystkich zainteresowanych odsyłam do dokumentacji. Warto je testować, gdyż wiele z nich może być bardzo pomocna. Oczywiście jak w każdej dziedzinie należy także i tu stosować rozwagę. Pozostaje tylko pytanie, kiedy osoby korzystające z wirtualnych serwerów WWW będą mogly skorzystać z nowych funkcjonalności PHP. Biorąc pod uwagę zwiększenie wydajności nowej wersji (co podoba się hostingodawcom), miejmy nadzieję, że nie będą musiały czekać zbyt długo.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.visionsoftware.pl/programowanie-php/php-5-4-w-wersji-finalnej-wydane.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
