<?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>Code42 &#187; PHP</title>
	<atom:link href="http://code42.pl/kategoria/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://code42.pl</link>
	<description>Wielkie Pytanie o Życie, Kod i całą resztę</description>
	<lastBuildDate>Wed, 25 Jan 2012 14:16:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>PHP: Statyczne zmienne funkcji — do czego mogą się przydać?</title>
		<link>http://code42.pl/2011/09/24/php-statyczne-zmienne-funkcji-%e2%80%94-do-czego-moga-sie-przydac/</link>
		<comments>http://code42.pl/2011/09/24/php-statyczne-zmienne-funkcji-%e2%80%94-do-czego-moga-sie-przydac/#comments</comments>
		<pubDate>Sat, 24 Sep 2011 09:47:44 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[static]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=974</guid>
		<description><![CDATA[Jak statyczne zmienne działają? Wielu z nas jest przyzwyczajonych do tego, że elementy oznaczone jako statyczne to coś co występuje tylko w klasach. Jednak słówka static można również użyć w zwykłej funkcji do oznaczenia zmiennej. Czym się różni zwykła zmienna od statycznej? Wartość statycznej zmiennej jest inicjowana za pierwszym wywołaniem funkcji i zapamiętywana pomiędzy jej [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2011/08/20/co-lepiej-wiedziec-o-javascriptcie-cz-2-hoisting-deklaracje-funkcji-i-wyrazenia-funkcyjne/' rel='bookmark' title='Co lepiej wiedzieć o JavaScriptcie cz.2.: hoisting, deklaracje funkcji i wyrażenia funkcyjne'>Co lepiej wiedzieć o JavaScriptcie cz.2.: hoisting, deklaracje funkcji i wyrażenia funkcyjne</a></li>
<li><a href='http://code42.pl/2009/02/23/sortowanie-obiektow-po-dacie-utworzenia/' rel='bookmark' title='PHP: Sortowanie obiektów po dacie utworzenia'>PHP: Sortowanie obiektów po dacie utworzenia</a></li>
<li><a href='http://code42.pl/2010/03/03/php-prawie-jak-parametry-nazwane/' rel='bookmark' title='PHP: prawie jak parametry nazwane'>PHP: prawie jak parametry nazwane</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<h2><img class="aligncenter size-full wp-image-1214" title="static" src="http://code42.pl/wp-content/uploads/static.jpg" alt="" width="536" height="86" /><span></span></h2>
<h2>Jak statyczne zmienne działają?</h2>
<p>Wielu z nas jest przyzwyczajonych do tego, że elementy oznaczone jako statyczne to coś co występuje tylko w klasach. Jednak słówka <code>static</code> można również użyć w zwykłej funkcji do oznaczenia zmiennej. Czym się różni zwykła zmienna od statycznej?</p>
<p>Wartość statycznej zmiennej jest inicjowana za pierwszym wywołaniem funkcji i <strong>zapamiętywana</strong> pomiędzy jej kolejnymi wywołaniami. Czyli zachowuje się zupełnie podobnie do klasowych zmiennych statycznych, tyle że nie za bardzo jest do niej dostęp z zewnątrz.</p>
<h2>Gdzie to się może przydać?</h2>
<h3>1. Licznik wywołań funkcji.</h3>
<p>Sztandarowym przykładem wykorzystania statycznych zmiennych w funkcji jest licznik jej wywołań, raczej rzadko wykorzystywany w praktyce.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> say_hello_and_count_yourself<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    static <span style="color: #000088;">$counter</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Hello! I've already said this &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$counter</span><span style="color: #339933;">++.</span><span style="color: #0000ff;">&quot; time(s).&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><span id="more-974"></span></p>
<h3>2. Licznik elementów na stronicowanej liście</h3>
<p>Tu już przykład z życia wzięty. Mamy do wyświetlenia listę elementów podzieloną na strony i chcemy wyświetlić liczby porządkowe przy każdym z nich. Do funkcji jako parametr podajemy nr strony i za każdym jej wywołaniem dostajemy liczbę większą o jeden (oczywiście z uwzględnieniem strony na której aktualnie jesteśmy):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> calculate_order_num <span style="color: #009900;">&#40;</span><span style="color: #000088;">$page</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	static <span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span>PER_PAGE <span style="color: #339933;">*</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$page</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #339933;">++</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>3. Odróżnianie parzystych i nieparzystych wierzy</h3>
<p>Dość często zachodzi potrzeba pokolorowowania co drugiego wiersza w tabeli w inny sposób. Wykorzystując statyczne zmienne, możemy sobie napisać zwięzłą i możliwą do wykorzynia wiele razy funkcję:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> calculate_parity <span style="color: #009900;">&#40;</span><span style="color: #000088;">$word1</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'odd'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$word2</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'even'</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	static <span style="color: #000088;">$current</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$current</span> <span style="color: #339933;">=</span> <span style="color: #339933;">!</span><span style="color: #000088;">$current</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$current</span> ? <span style="color: #000088;">$word1</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$word2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Wywołując tę funkcję wiele razy będziemy otrzymywać podane wartości naprzemiennie. Przykładowo:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&lt;tr class=&quot;<span style="color: #000000; font-weight: bold;">&lt;?=</span> calculate_parity<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;…
&lt;tr class=&quot;<span style="color: #000000; font-weight: bold;">&lt;?=</span> calculate_parity<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;…
&lt;tr class=&quot;<span style="color: #000000; font-weight: bold;">&lt;?=</span> calculate_parity<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;…</pre></div></div>

<p>Da nam:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;tr class=&quot;odd&quot;&gt;…
&lt;tr class=&quot;even&quot;&gt;…
&lt;tr class=&quot;odd&quot;&gt;…</pre></div></div>

<h2>Prędkość działania</h2>
<p>Miałem podejrzenia, że przechowywanie wartości w zmiennej statycznej może działać nieco szybciej niż w standardowy sposób jednak okazało się inaczej, przynajmniej w jednym prostym teście. Na (pozbawionym sensu) przykładzie sumowania kolejnych liczb:</p>
<p>1) Sumę trzymamy w „globalu” a funkcja do aktualnej sumy dodaje składnik:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> sum_up <span style="color: #009900;">&#40;</span><span style="color: #000088;">$sum</span><span style="color: #339933;">,</span> <span style="color: #000088;">$addend</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$sum</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$addend</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$sum</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;=</span> <span style="color: #cc66cc;">40000000</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$sum</span> <span style="color: #339933;">=</span> sum_up <span style="color: #009900;">&#40;</span><span style="color: #000088;">$sum</span><span style="color: #339933;">,</span> <span style="color: #000088;">$i</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$sum</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Średni czas wykonania: 13-14s.</p>
<p>2) Sumę inicjujemy w funkcji i tam ją trzymamy:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> sum_up <span style="color: #009900;">&#40;</span><span style="color: #000088;">$addend</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	static <span style="color: #000088;">$sum</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$sum</span> <span style="color: #339933;">+=</span> <span style="color: #000088;">$addend</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;=</span> <span style="color: #cc66cc;">40000000</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$s</span> <span style="color: #339933;">=</span> sum_up <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$s</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Średni czas wykonania: 15-16s.</p>
<p>Także jak widać, ze zmiennymi statycznym jest wolniej. Do tego, pierwszy przykład można zoptymalizować, przekazując zmienną przez referencję, ale tego już nie robiłem, żeby zachować odzwierciedlenie działania możliwie dobrze (i mam nadzieje, że nic nie pomieszałem).</p>
<h2>Podsumowanie</h2>
<p>Podsumowując: bardzo wielu zastosowań dla zmiennych statycznych w funkcji nie widać, jednak w kilku przypadkach mogą one nam całkiem fajnie skrócić i uprościć kod. Jednocześnie trzeba się liczyć z tym, że ich wykorzystanie może nie być najszybszym rozwiązaniem, jednak są to różnice, które dla 99.9% projektów są raczej pomijalne.</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2011/08/20/co-lepiej-wiedziec-o-javascriptcie-cz-2-hoisting-deklaracje-funkcji-i-wyrazenia-funkcyjne/' rel='bookmark' title='Co lepiej wiedzieć o JavaScriptcie cz.2.: hoisting, deklaracje funkcji i wyrażenia funkcyjne'>Co lepiej wiedzieć o JavaScriptcie cz.2.: hoisting, deklaracje funkcji i wyrażenia funkcyjne</a></li>
<li><a href='http://code42.pl/2009/02/23/sortowanie-obiektow-po-dacie-utworzenia/' rel='bookmark' title='PHP: Sortowanie obiektów po dacie utworzenia'>PHP: Sortowanie obiektów po dacie utworzenia</a></li>
<li><a href='http://code42.pl/2010/03/03/php-prawie-jak-parametry-nazwane/' rel='bookmark' title='PHP: prawie jak parametry nazwane'>PHP: prawie jak parametry nazwane</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2011/09/24/php-statyczne-zmienne-funkcji-%e2%80%94-do-czego-moga-sie-przydac/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Bardzo ciężki quiz PHP — edycja II</title>
		<link>http://code42.pl/2011/01/22/bardzo-ciezki-quiz-php-%e2%80%94-edycja-ii/</link>
		<comments>http://code42.pl/2011/01/22/bardzo-ciezki-quiz-php-%e2%80%94-edycja-ii/#comments</comments>
		<pubDate>Sat, 22 Jan 2011 11:47:48 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[quiz]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=853</guid>
		<description><![CDATA[Sprawdź swoją wiedzę na temat magicznego zachowania PHP-owej funkcji count().


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/04/02/bardzo-ciezki-quiz-php/' rel='bookmark' title='Bardzo ciężki quiz PHP'>Bardzo ciężki quiz PHP</a></li>
<li><a href='http://code42.pl/2009/01/26/vim-edycja-plikow-php/' rel='bookmark' title='Krótko: Vim i powolna edycja plików PHP'>Krótko: Vim i powolna edycja plików PHP</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/hela-waaat1.jpg" alt="" title="hela-waaat" width="220" height="185" class="alignright size-full wp-image-859" /></p>
<p>W <a href='http://code42.pl/2009/04/02/bardzo-ciezki-quiz-php/'>pierwszej edycji</a> „Bardzo ciężkiego quizu PHP” sprawdzaliśmy naszą wiedzę na temat porównań. Tym razem na ruszt poszła funkcja <code>count()</code>.</p>
<p>Na początek rzućmy krótko okiem do manuala, żeby sprawdzić co ona robi.</p>
<blockquote><p>count — Count all elements in an array, or properties in an object</p>
</blockquote>
<p>Ok, proste. Tak więc spróbujmy zgadnąć do się stanie gdy wywołamy ja na paru różnych rzeczach.</p>
<table>
<tr>
<th>Parametr do <code>count()</code></th>
<th>Reinmar</th>
<th>mcv</th>
<th>Odpowiedź prawidłowa</th>
</tr>
<tr>
<td><code>array(1)</code></td>
<td>1</td>
<td>1</td>
<td style='background: #fff; color: #fff'>1</td>
</tr>
<tr>
<td><code>array()</code></td>
<td>0</td>
<td>0</td>
<td style='background: #fff; color: #fff'>0</td>
</tr>
<tr>
<td><code>$undefined_var</code></td>
<td>error</td>
<td>0 + notice</td>
<td style='background: #fff; color: #fff'>0 + notice</td>
</tr>
<tr>
<td><code>new stdclass()</code></td>
<td>1</td>
<td>0</td>
<td style='background: #fff; color: #fff'>1</td>
</tr>
<tr>
<td><code>true</code></td>
<td>1</td>
<td>0 + notice</td>
<td style='background: #fff; color: #fff'>1</td>
</tr>
<tr>
<td><code>false</code></td>
<td>0</td>
<td>0 + notice</td>
<td style='background: #fff; color: #fff'>1</td>
</tr>
<tr>
<td><code>isset ($undefined_var)</code></td>
<td>0</td>
<td>0 + notice</td>
<td style='background: #fff; color: #fff'>1</td>
</tr>
<tr>
<td><code>null</code></td>
<td>0</td>
<td>notice</td>
<td style='background: #fff; color: #fff'>0</td>
</tr>
</table>
<p><em>Żeby zobaczyć prawidłową odpowiedź trzeba zaznaczyć sobie odpowiednią komórkę.</em></p>
<p>Jak Wam poszło?</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/04/02/bardzo-ciezki-quiz-php/' rel='bookmark' title='Bardzo ciężki quiz PHP'>Bardzo ciężki quiz PHP</a></li>
<li><a href='http://code42.pl/2009/01/26/vim-edycja-plikow-php/' rel='bookmark' title='Krótko: Vim i powolna edycja plików PHP'>Krótko: Vim i powolna edycja plików PHP</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2011/01/22/bardzo-ciezki-quiz-php-%e2%80%94-edycja-ii/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHP: łączenie tablic na dwa sposoby</title>
		<link>http://code42.pl/2010/12/29/php-laczenie-tablic-na-dwa-sposoby/</link>
		<comments>http://code42.pl/2010/12/29/php-laczenie-tablic-na-dwa-sposoby/#comments</comments>
		<pubDate>Wed, 29 Dec 2010 08:00:37 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[array_merge]]></category>
		<category><![CDATA[tablice w php]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=790</guid>
		<description><![CDATA[Połączenie wartości dwóch tablic w jedną nie jest w PHP tak intuicyjne jak można by oczekiwać. Powodem zamieszania są dwie funkcje do wykorzystania oraz dwa rodzaje tablic.


Podobne wpisy:<ol><li><a href='http://code42.pl/2008/12/22/epic-alert-w-php-i-niespodziewane-biale-ekrany-smierci/' rel='bookmark' title='Epic: ALERT w PHP i niespodziewane białe ekrany śmierci'>Epic: ALERT w PHP i niespodziewane białe ekrany śmierci</a></li>
<li><a href='http://code42.pl/2009/02/23/sortowanie-obiektow-po-dacie-utworzenia/' rel='bookmark' title='PHP: Sortowanie obiektów po dacie utworzenia'>PHP: Sortowanie obiektów po dacie utworzenia</a></li>
<li><a href='http://code42.pl/2009/04/02/bardzo-ciezki-quiz-php/' rel='bookmark' title='Bardzo ciężki quiz PHP'>Bardzo ciężki quiz PHP</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/geek-books-225x300.jpg" alt="" title="geek-books" width="225" height="300" class="alignright size-medium wp-image-804" /></p>
<p>PHP pozwala na połączenie tablic ze sobą za pomocą operatora <code>+</code> lub funkcji <code>array_merge</code>. Zależnie od przypadku mogą one zwracać różne wyniki.</p>
<h2>Łączenie za pomocą operatora +</h2>
<p>„Plus” to jedyny operator, którym można wykonywać jakieś operacje na tablicach. Pozostałe służą do porównań. Jego działanie polega na tym, że do tablicy po lewej stronie operatora dołączane są elementy z tablicy z prawej strony, z wyjątkiem sytuacji gdzie klucz się powtarza. Elementy z „prawej” tablicy o kluczu istniejącym już w „lewej” są pomijane. Do porównywania kluczy wykorzystywany jest niejawnie operator <code>===</code>.<br />
<span id="more-790"></span><br />
Przykładowo mając następujące tablice:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'1st'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'first'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'2nd'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'second'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'1st'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'zonk1'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'2nd'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'zonk2'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'3rd'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'zonk3'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'3rd'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'final3'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'4th'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'final4'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Wynik „dodawania” tablic (<code>$a + $b + $c</code>) będzie wyglądał tak:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;1st&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;first&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;2nd&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;second&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;3rd&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;zonk3&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;4th&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;final4&quot;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Jak można się już domyślać — mając tablice, w których kluczy jawnie nie podajemy (czyli są one liczbami naturalnym zaczynającymi się od zera), rezultat łączenia może nie być zgodny z oczekiwanym:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'php'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'html'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'js'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'symfony'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'css'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><code>$a + $b</code> daje nam:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;php&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;html&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;css&quot;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Jeżeli chcemy, żeby żadna wartość nie została pominięta, lepiej zainteresować się <code>array_merge</code>.</p>
<h2>Łączenie za pomocą array_merge</h2>
<p>Działanie <code>array_merge</code> może już być bardziej intuicyjne. Jednak trzeba wiedzieć, że łączenie wartości przebiega inaczej, zależnie od tego czy mamy do czynienia ze zwykłą tablicą (z kluczami 0, 1, 2…) czy tablicą asocjacyjną (zwaną również mapą lub <em>hashem</em>).</p>
<p>W przypadku zwykłych tablic do elementów pierwszej dołączane są elementy drugiej. Przykładowo:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'php'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'html'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'js'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'symfony'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'css'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Wynik <code>array_merge ($a, $b)</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;php&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;html&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;js&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">7</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;symfony&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;css&quot;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Takie dołączanie następuje również, gdy do <code>array_merge</code> podamy jedną tablicę zwykłą i jedną asocjacyjną. Żadna wartość wtedy nie przepadnie.</p>
<p>Natomiast w przypadku samych tablic asocjacyjnych klucze zaczynają mieć znaczenie. Wartość z tablicy drugiej (lub kolejnej, bo można łączyć wiele tablic) nadpisze wartość z tablicy poprzedzającej, jeśli posiadała ona taki sam klucz. Przykładowo dla tablic:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'1st'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'first'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'2nd'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'second'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'1st'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'zonk1'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'2nd'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'zonk2'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'3rd'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'zonk3'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'3rd'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'final3'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'4th'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'final4'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Wynik <code>array_merge ($a, $b, $c)</code> będzie następujący:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;1st&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;zonk1&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;2nd&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;zonk2&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;3rd&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;final3&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;4th&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;final4&quot;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>



<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2008/12/22/epic-alert-w-php-i-niespodziewane-biale-ekrany-smierci/' rel='bookmark' title='Epic: ALERT w PHP i niespodziewane białe ekrany śmierci'>Epic: ALERT w PHP i niespodziewane białe ekrany śmierci</a></li>
<li><a href='http://code42.pl/2009/02/23/sortowanie-obiektow-po-dacie-utworzenia/' rel='bookmark' title='PHP: Sortowanie obiektów po dacie utworzenia'>PHP: Sortowanie obiektów po dacie utworzenia</a></li>
<li><a href='http://code42.pl/2009/04/02/bardzo-ciezki-quiz-php/' rel='bookmark' title='Bardzo ciężki quiz PHP'>Bardzo ciężki quiz PHP</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2010/12/29/php-laczenie-tablic-na-dwa-sposoby/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>PHP: prawie jak parametry nazwane</title>
		<link>http://code42.pl/2010/03/03/php-prawie-jak-parametry-nazwane/</link>
		<comments>http://code42.pl/2010/03/03/php-prawie-jak-parametry-nazwane/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 09:23:37 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[ciekawostki]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=512</guid>
		<description><![CDATA[W PHP nie ma czegoś takiego jak parametry nazwane z działania, ale jest taka rzecz z …wyglądu. O co chodzi? Mając funkcję: function foo &#40;$a = 1, $b = 22&#41; &#123; echo $a.' ~ '.$b; &#125; Normalnie ją wywołujemy na takie sposoby: foo&#40;&#41; // → '1 ~ 22' foo &#40;6&#41; // → '6 ~ 22' [...]


Brak podobnych wposów.]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/crazy-horse-536x250.jpg" alt="" title="crazy-horse" width="536" height="250" class="aligncenter size-medium wp-image-730" /></p>
<p>W PHP nie ma czegoś takiego jak parametry nazwane z działania, ale jest taka rzecz z …wyglądu. O co chodzi? Mając funkcję:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> foo <span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">22</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$a</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' ~ '</span><span style="color: #339933;">.</span><span style="color: #000088;">$b</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Normalnie ją wywołujemy na takie sposoby:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// → '1 ~ 22'</span>
foo <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// → '6 ~ 22'</span>
foo <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// → '3 ~ 4'</span></pre></div></div>

<p>Jednak możemy sobie funkcję wywołać dodając etykiety parametrom:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">foo <span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">33</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// → '2 ~ 33'</span></pre></div></div>

<p>Możemy to zrobić również „niepoprawnie”:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">foo <span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">7</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// → '7 ~ 3'</span></pre></div></div>

<p>Jak widać PHP <strong>nie bierze</strong> pod uwagę tych nazw parametrów, jedynie kolejność. Nazwy mogą być dowolne, użyte zostaną i tak te z deklaracji funkcji. Powstaje więc pytanie — po co tego w ogóle używać? Otóż — dla <strong>przejrzystości kodu</strong>, co powinien dobrze zobrazować poniższy przykład:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">render_last_posts <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'desc'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// → że jakie te posty mają być?</span>
&nbsp;
render_last_posts <span style="color: #009900;">&#40;</span><span style="color: #000088;">$limit</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span> <span style="color: #000088;">$sort</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'desc'</span><span style="color: #339933;">,</span>
    <span style="color: #000088;">$only_published</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #000088;">$by_user</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// aaa, takie!</span></pre></div></div>

<p class="warning"><strong>Uwaga</strong>. Takie przypisania ustawiają wartości zmiennych w danym zakresie, co czasami może doprowadzić do błędów (nadpisanie wcześniej zdefiniowanej zmiennej) lub być sytuacją pożądaną (przypisanie wartości do późniejszego wykorzystania).</p>


<p>Brak podobnych wposów.</p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2010/03/03/php-prawie-jak-parametry-nazwane/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Podstawy: osadzanie kodu PHP w pliku</title>
		<link>http://code42.pl/2010/02/12/podstawy-osadzanie-kodu-php-w-pliku/</link>
		<comments>http://code42.pl/2010/02/12/podstawy-osadzanie-kodu-php-w-pliku/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 19:51:51 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[kurs php]]></category>
		<category><![CDATA[php.ini]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=459</guid>
		<description><![CDATA[Żeby nie zanudzać tym, co już zostało wiele razy napisane, napiszę szybko, że istnieją 4 sposoby osadzania kodu PHP w pliku, z czego 2 najpopularniejsze wyglądają tak: &#60;?php $tutaj_kod // sposób standardowy ?&#62; &#60;? $tutaj_kod // sposób skrócony ?&#62; O pozostałych dwóch (tag &#60;script language='php'&#62;… i znany z ASP &#60;% … %&#62;) najlepiej od razu [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/06/30/zapamietywanie-hasla-dla-postgresql-w-pliku/' rel='bookmark' title='Zapamiętywanie hasła dla PostgreSQL w pliku'>Zapamiętywanie hasła dla PostgreSQL w pliku</a></li>
<li><a href='http://code42.pl/2009/07/21/logowanie-do-pliku-wszystkich-zapytan-w-postgresql/' rel='bookmark' title='Logowanie do pliku wszystkich zapytań w PostgreSQL'>Logowanie do pliku wszystkich zapytań w PostgreSQL</a></li>
<li><a href='http://code42.pl/2009/04/25/adobe-air-podstaw-podstawy/' rel='bookmark' title='Adobe AIR podstaw podstawy'>Adobe AIR podstaw podstawy</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/girl-sitting-and-talking-536x229.jpg" alt="" title="girl-sitting-and-talking" width="536" height="229" class="aligncenter size-medium wp-image-726" /></p>
<p>Żeby nie zanudzać tym, co już zostało wiele razy napisane, napiszę szybko, że istnieją 4 sposoby osadzania kodu PHP w pliku, z czego 2 najpopularniejsze wyglądają tak:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000088;">$tutaj_kod</span> <span style="color: #666666; font-style: italic;">// sposób standardowy ?&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;?</span> <span style="color: #000088;">$tutaj_kod</span> <span style="color: #666666; font-style: italic;">// sposób skrócony ?&gt;</span></pre></div></div>

<p>O pozostałych dwóch (tag <code>&lt;script language='php'&gt;…</code> i znany z ASP <code>&lt;% … %&gt;</code>) najlepiej od razu zapomnieć, chociażby z tego powodu, że nikt ich nie używa, a pierwszy z nich dodatkowo jest długi, brzydki i nie da się go mieszać z HTML-em.</p>
<h2>Więc który sposób jest lepszy?</h2>
<p>Jeśli tworzysz oprogramowanie, które ma być możliwie kompatybilne z wszelkimi serwerami i ich konfiguracjami (np. gdy tworzysz framework lub jakąś bibliotekę) właściwie musisz stosować zapis standardowy. Oszczędzi to zapewne wiele frustracji użytkownikom, bo jest to sposób, który zawsze działa. Jeśli jednak opisywany przypadek Cię nie dotyczy to warto stosować zapis skrócony (my go właśnie stosujemy bezproblemowo od dłuższego czasu). Wymaga on co prawda włączenia dyrektywy <code>short_open_tag = On</code> w pliku <code>php.ini</code>, jednak tworzony kod zyskuje sporo na czytelności. Do trybu PHP wskakujemy wtedy umieszczając tylko 2 znaki zamiast 5, natomiast zapis <code>&lt;?php echo  'Cześć' ?&gt;</code> można skrócić się aż o 7 znaków do <code>&lt;?= 'Cześć' ?&gt;</code>. A skoro można coś zapisać krócej, to czemu tego nie zrobić?</p>
<p><a href="http://code42.pl/wp-content/uploads/x.png"><img src="http://code42.pl/wp-content/uploads/x.png" alt="" title="Porównanie zapisu standardowego i skrótowego na przykładzie" width="570" height="387" class="aligncenter size-full wp-image-489" /></a></p>
<h2>Co warto wiedzieć o wychodzeniu z „trybu PHP”</h2>
<p>PHP wymaga kończenia  instrukcji średnikiem. Jak jednak widać w poprzednim akapicie, tego średnika nie ma. Jest to dopuszczalne, ponieważ wyjście z „trybu PHP” (?&gt;)  samo wstawia brakujący średnik. Warto to wykorzystać i nie zaciemniać kodu niepotrzebnymi znakami, szczególnie w przypadku gdy „wchodzimy” i „wychodzimy” do PHP w tej samej linii.</p>
<p>Inną sprawą jest fakt, że pliki zawierające w całości kod PHP, nie muszą i właściwie nie powinny mieć zakończenia „trybu PHP” (wtedy jednak nie wolno pominąć średnika w ostatniej instrukcji). Chroni nas to przed specyficzną sytuacją, gdy omyłkowo pozostawione puste linie w plikach ładowanych za pomocą funkcji <code>include</code> lub <code>require</code> spowodują rozpoczęcie wysyłania odpowiedzi (PHP od razu wysyła treść, która nie jest buforowana, ani nie jest kodem PHP), czego typowym następstwem jest komunikat:</p>
<pre> […] headers already sent by […]</pre>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/06/30/zapamietywanie-hasla-dla-postgresql-w-pliku/' rel='bookmark' title='Zapamiętywanie hasła dla PostgreSQL w pliku'>Zapamiętywanie hasła dla PostgreSQL w pliku</a></li>
<li><a href='http://code42.pl/2009/07/21/logowanie-do-pliku-wszystkich-zapytan-w-postgresql/' rel='bookmark' title='Logowanie do pliku wszystkich zapytań w PostgreSQL'>Logowanie do pliku wszystkich zapytań w PostgreSQL</a></li>
<li><a href='http://code42.pl/2009/04/25/adobe-air-podstaw-podstawy/' rel='bookmark' title='Adobe AIR podstaw podstawy'>Adobe AIR podstaw podstawy</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2010/02/12/podstawy-osadzanie-kodu-php-w-pliku/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Profilowanie aplikacji w PHP z wykorzystaniem Xdebug</title>
		<link>http://code42.pl/2009/06/02/profilowanie-aplikacji-w%c2%a0symfony-z%c2%a0wykorzystaniem-xdebug/</link>
		<comments>http://code42.pl/2009/06/02/profilowanie-aplikacji-w%c2%a0symfony-z%c2%a0wykorzystaniem-xdebug/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 13:36:03 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[optymalizacja]]></category>
		<category><![CDATA[profilowanie]]></category>
		<category><![CDATA[xdebug]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=388</guid>
		<description><![CDATA[Xdebug to rozszerzenie do PHP umożliwiające m.in debugowanie i profilowanie aplikacji napisanych właśnie w tym języku. O samej jego instalacji nie ma się co rozpisywać (użytkownikom Arch Linuksa tylko podpowiem, że znajduje się on w AUR), gdyż każda większa dystrybucja powinna mieć Xdebuga wśród swoich pakietów. Po zainstalowaniu, jeśli nasz system tego nie zrobi za nas, trzeba [...]


Brak podobnych wposów.]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/bootstrap-chart-536x80.jpg" alt="" title="bootstrap-chart" width="536" height="80" class="aligncenter size-medium wp-image-712" /></p>
<p>Xdebug to rozszerzenie do PHP umożliwiające m.in debugowanie i profilowanie aplikacji napisanych właśnie w tym języku. O samej jego instalacji nie ma się co rozpisywać (użytkownikom Arch Linuksa tylko podpowiem, że znajduje się on w <a href='http://aur.archlinux.org/packages.php?ID=26301'>AUR</a>), gdyż każda większa dystrybucja powinna mieć Xdebuga wśród swoich pakietów.</p>
<p>Po zainstalowaniu, jeśli nasz system tego nie zrobi za nas, trzeba rozszerzenie wstępnie skonfigurować. Na przykładzie wspomnianego Archa zostaniemy dokładnie poinstruowani co trzeba zrobić:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"> <span style="color: #000066; font-weight:bold;">==</span>&gt; Please add the following lines to your /etc/php/conf.d/xdebug.ini
&nbsp;
 <span style="color: #000099;">zend_extension</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">/usr/lib/php/xdebug.so</span>
 xdebug.remote_enable<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">on</span>
 xdebug.remote_host<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">&lt;ip address&gt;</span>
 xdebug.remote_port<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">&lt;port&gt;</span>
 xdebug.remote_handler<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">dbgp</span></pre></div></div>

<p>Jednakże dla nas ważna jest tylko pierwsza linia tych ustawień, ponieważ pozostałe służą do komunikacji z osobnym klientem. Dlatego też można te linie zakomentować, bądź usunąć. Interesuje nas natomiast włączenie profilowania, co można uskutecznić poprzez dopisanie następujących linii do pliku konfiguracyjnego:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">xdebug.profiler_enable<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">1</span>
xdebug.profiler_output_dir<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">/tmp</span></pre></div></div>

<p>Katalog docelowy jest domyślnie ustawiony na <code>/tmp</code>, więc ta linia tak naprawdę nic nie wnosi, poza tym, żeby było jasno widać jak można ten katalog zmienić.</p>
<p>Następnie restartujemy lokalny serwer http i odpalamy stronę www, której działanie chcemy przeanalizować. W katalogu docelowym (<code>/tmp</code>) powinny znajdować się już raporty o nazwach w rodzaju: cachegrind.out.<PID>.</p>
<p>Raporty takie można otworzyć za pomocą programów <a href="http://kcachegrind.sf.net">KCacheGrind</a>, <a href="http://sourceforge.net/projects/wincachegrind">WinCacheGrind</a> czy <a href="http://www.maccallgrind.com/">MacCallGrind</a> i wyglądają mniej więcej tak:</p>
<p><a href="http://code42.pl/wp-content/uploads/2009/06/kcachegrind.png"><img src="http://code42.pl/wp-content/uploads/2009/06/kcachegrind-300x158.png" alt="kcachegrind" title="kcachegrind" width="300" height="158" class="aligncenter size-medium wp-image-396" /></a></p>
<p>Na koniec ostateczny wygląd <code>xdebug.ini</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"><span style="color: #000099;">zend_extension</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">/usr/lib/php/xdebug.so</span>
xdebug.profiler_enable<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">1</span>
xdebug.profiler_output_dir<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">/tmp</span></pre></div></div>



<p>Brak podobnych wposów.</p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2009/06/02/profilowanie-aplikacji-w%c2%a0symfony-z%c2%a0wykorzystaniem-xdebug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bardzo ciężki quiz PHP</title>
		<link>http://code42.pl/2009/04/02/bardzo-ciezki-quiz-php/</link>
		<comments>http://code42.pl/2009/04/02/bardzo-ciezki-quiz-php/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 14:10:07 +0000</pubDate>
		<dc:creator>Mistrz Wu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[fail]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=319</guid>
		<description><![CDATA[W ramach rozluźniania się zrobiliśmy sobie test wiedzy na temat PHP. Test może wydawać się trudny, ale na doświadczonym pisarzu PHP nie zrobi wrażenia. Taką tabelkę sobie uknuliśmy. Należy odpowiedzieć na pytanie: jaką wartość zwrócą poszczególne wyrażenia z tabeli? Obok nasze typowania i&#160;ukryta odpowiedź prawidłowa (zaznacz tabelę/tekst, aby zobaczyć, co tam się kryje). Wyrażenie Reinmar [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2011/01/22/bardzo-ciezki-quiz-php-%e2%80%94-edycja-ii/' rel='bookmark' title='Bardzo ciężki quiz PHP — edycja II'>Bardzo ciężki quiz PHP — edycja II</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>W ramach rozluźniania się zrobiliśmy sobie test wiedzy na temat <abbr>PHP</abbr>. Test może wydawać się trudny, ale na doświadczonym pisarzu <abbr>PHP</abbr> nie zrobi wrażenia.</p>
<p>Taką tabelkę sobie uknuliśmy. Należy odpowiedzieć na pytanie: jaką wartość zwrócą poszczególne wyrażenia z tabeli? Obok nasze typowania i&nbsp;ukryta odpowiedź prawidłowa (zaznacz tabelę/tekst, aby zobaczyć, co tam się kryje).</p>
<table>
<tr>
<th>Wyrażenie</th>
<th>Reinmar</th>
<th>Mr. Z</th>
<th>mcv</th>
<th>Odpowiedź prawidłowa</th>
</tr>
<tr>
<td><code>0 == 'abc'</code></td>
<td>T</td>
<td>F</td>
<td>T</td>
<td style='background: #fff; color: #fff'>T</td>
</tr>
<tr>
<td><code>'0' == 'abc'</code></td>
<td>F</td>
<td>F</td>
<td>T</td>
<td style='background: #fff; color: #fff'>F</td>
</tr>
<tr>
<td><code>'0' == '0000'</code></td>
<td>T</td>
<td>F</td>
<td>T</td>
<td style='background: #fff; color: #fff'>T</td>
</tr>
<tr>
<td><code>'000' == 'abc'</code></td>
<td>F</td>
<td>F</td>
<td>F</td>
<td style='background: #fff; color: #fff'>F</td>
</tr>
<tr>
<td><code>'000' == '00000'</code></td>
<td>F</td>
<td>F</td>
<td>F</td>
<td style='background: #fff; color: #fff'>T</td>
</tr>
<tr>
<td><code>false != null</code></td>
<td>F</td>
<td>F</td>
<td>F</td>
<td style='background: #fff; color: #fff'>F</td>
</tr>
</table>
<p>Tak więc przypominamy o&nbsp;istnieniu operatora <code>===</code>. Niech się koduje!</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2011/01/22/bardzo-ciezki-quiz-php-%e2%80%94-edycja-ii/' rel='bookmark' title='Bardzo ciężki quiz PHP — edycja II'>Bardzo ciężki quiz PHP — edycja II</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2009/04/02/bardzo-ciezki-quiz-php/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHP: Sortowanie obiektów po dacie utworzenia</title>
		<link>http://code42.pl/2009/02/23/sortowanie-obiektow-po-dacie-utworzenia/</link>
		<comments>http://code42.pl/2009/02/23/sortowanie-obiektow-po-dacie-utworzenia/#comments</comments>
		<pubDate>Mon, 23 Feb 2009 09:41:05 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=239</guid>
		<description><![CDATA[Czasami istnieje potrzeba posortowania obiektów wg własnych kryteriów — dajmy na to w przypadku, gdy w jednej tablicy mamy obiekty różnych typów. Aby jednak sortowanie mogło mieć sens, potrzebne jest jakieś wspólne pole. W tym przykładzie chcemy sortować po dacie utworzenia, więc z założenia wynika, że obiekty będą miały pole created_at. Do sortowania można wykorzystać funkcję usort: bool usort [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2010/12/29/php-laczenie-tablic-na-dwa-sposoby/' rel='bookmark' title='PHP: łączenie tablic na dwa sposoby'>PHP: łączenie tablic na dwa sposoby</a></li>
<li><a href='http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/' rel='bookmark' title='Symfony+Propel: domyślne sortowanie'>Symfony+Propel: domyślne sortowanie</a></li>
<li><a href='http://code42.pl/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/' rel='bookmark' title='Symfony: Paginacja przy własnych/nietypowych warunkach SQL'>Symfony: Paginacja przy własnych/nietypowych warunkach SQL</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/calnedar-536x235.jpg" alt="" title="calendar" width="536" height="235" class="aligncenter size-medium wp-image-701" /></p>
<p>Czasami istnieje potrzeba posortowania obiektów wg własnych kryteriów — dajmy na to w przypadku, gdy w jednej tablicy mamy obiekty różnych typów. Aby jednak sortowanie mogło mieć sens, potrzebne jest jakieś wspólne pole. W tym przykładzie chcemy sortować po dacie utworzenia, więc z założenia wynika, że obiekty będą miały pole <code>created_at</code>.</p>
<p>Do sortowania można wykorzystać funkcję <code>usort</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">bool <span style="color: #990000;">usort</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">array</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$array</span> <span style="color: #339933;">,</span> callback <span style="color: #000088;">$cmp_function</span> <span style="color: #009900;">&#41;</span></pre></div></div>

<p>Jako argumenty przyjmuje ona tablicę i funkcję do porównywania (tzw. <em>callback</em>).</p>
<p>Funkcja porównująca przyjmuje za argumenty wartości do porównania (tutaj: obiekty) i zwraca -1, 0 lub 1 aby określić czy pierwsza wartość jest odpowiednio mniejsza, równa czy większa. W naszym przypadku znaki są zamienione by posortować „od najnowszego” oraz, dla uproszczenia, pomijamy zwracanie zera, ponieważ jego wystąpienie i tak jest mało prawdopodobne. Poza tym nie istnieje kolejne kryterium porównania, więc w przypadku takiej samej daty, kolejność dwóch obiektów jest dowolna:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> compare_by_date <span style="color: #009900;">&#40;</span><span style="color: #000088;">$o1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$o2</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$o1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCreatedAt</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'U'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$o2</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCreatedAt</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'U'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span> <span style="color: #339933;">:</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Metoda korzysta z dość typowego w aplikacjach Symfony (opartych na Propelu) gettera <code>getCreatedAt</code>, który przyjmuje format daty w takiej samej postaci jak funkcja PHP <a href='http://pl.php.net/manual/en/function.date.php' title='Dokumentacja funkcji PHP date'>date</a>. W tym przypadku jest to tzw. <a href='http://pl.wikipedia.org/wiki/Czas_uniksowy'>Unix epoch</a> oznaczający liczbę sekund od początku roku 1970. A sekundy (czytaj: liczby całkowite) porównuje się już bez problemu.</p>
<p>Mając gotową taką funkcję (tutaj jako metoda klasy <code>std</code>) możemy posortować tablicę obiektów poprzez wykonanie:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">usort</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$images_and_videos</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'std'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'compare_by_date'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>To dziwne wywołanie tablicowe jest konieczne, gdy korzystamy podać metodę jakiejś klasy. Zwykłą funkcję podajemy po prostu jako ciąg znaków.</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2010/12/29/php-laczenie-tablic-na-dwa-sposoby/' rel='bookmark' title='PHP: łączenie tablic na dwa sposoby'>PHP: łączenie tablic na dwa sposoby</a></li>
<li><a href='http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/' rel='bookmark' title='Symfony+Propel: domyślne sortowanie'>Symfony+Propel: domyślne sortowanie</a></li>
<li><a href='http://code42.pl/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/' rel='bookmark' title='Symfony: Paginacja przy własnych/nietypowych warunkach SQL'>Symfony: Paginacja przy własnych/nietypowych warunkach SQL</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2009/02/23/sortowanie-obiektow-po-dacie-utworzenia/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Epic: ALERT w PHP i niespodziewane białe ekrany śmierci</title>
		<link>http://code42.pl/2008/12/22/epic-alert-w-php-i-niespodziewane-biale-ekrany-smierci/</link>
		<comments>http://code42.pl/2008/12/22/epic-alert-w-php-i-niespodziewane-biale-ekrany-smierci/#comments</comments>
		<pubDate>Mon, 22 Dec 2008 18:05:03 +0000</pubDate>
		<dc:creator>Mistrz Wu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[alert]]></category>
		<category><![CDATA[suhosin]]></category>
		<category><![CDATA[wtf]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=18</guid>
		<description><![CDATA[Zacznę od tego, że problemu nie zdołałem rozwiązać, gdyż zwyczajnie brakowało mi czasu i&#160;nerwów. Zamiast tego, zrobiłem obejścia, które… no, działają. A&#160;dlaczego? Nie wiem. Może jakiś doświadczony czytelnik zostawi odpowiedź w komentarzu… Tak więc onegdaj, podczas wesołej pracy z PHP, zdarzyło się kilka razy, że przy prostej i&#160;klarownej operacji na dobrze określonych wartościach, PHP rzucał [...]


Brak podobnych wposów.]]></description>
			<content:encoded><![CDATA[<p>Zacznę od tego, że problemu nie zdołałem rozwiązać, gdyż zwyczajnie brakowało mi czasu i&nbsp;nerwów. Zamiast tego, zrobiłem obejścia, które… no, działają. A&nbsp;dlaczego? Nie wiem. Może jakiś doświadczony czytelnik zostawi odpowiedź w komentarzu…</p>
<p>Tak więc onegdaj, podczas wesołej pracy z <abbr>PHP</abbr>, zdarzyło się kilka razy, że przy prostej i&nbsp;klarownej operacji na dobrze określonych wartościach, PHP rzucał białym ekranem śmierci, a w logach pojawiało się niejasne:</p>
<pre><code>ALERT - canary mismatch on efree() - heap overflow detected (attacker '127.0.0.1', file '/home/mcv/htdocs/cośtam/dispatch.php')</code></pre>
<p>Czasami tylko zamiast <code>efree</code> było <code>erealloc</code>.</p>
<p>Chwila kombinowania wykazała, że taki efekt daje następująca linia:</p>
<pre><code>$ids = array_merge ($this->f1(), $this->f2(), $this->f3());</code></pre>
<p>Nazwy metod zostały zmienione dla większej czytelności. Wartości zwracane przez metody były najzwyklejszymi, <abbr>PHP<abbr>-owymi tablicami zawierającymi jedynie liczby całkowite. Liczba? Na pewno nie większa niż około 5800 w sumie. 5800 intów to dużo czy jak?</p>
<p>Po straceniu stosownej ilości nerwów, wpadłem na to, żeby trochę <abbr>PHP</abbr>-a oszukać. Dodałem zmienne pomocniczne:</p>
<pre><code>$a = $this->f1();
$b = $this->f2();
$c = $this->f3();
$ids = array_merge ($a, $b, $c);</code></pre>
<p>Magia! Wszystko zaczęło działać. Czy <abbr>PHP</abbr> znowu coś przede mną ukrywa?</p>
<p>W międzyczasie Pan Google pomógł skojarzyć dziwne wpisy w logach z „utwardzaczem” <abbr>PHP</abbr>, tj. <a rel='external' href='http://www.hardened-php.net/suhosin/'>Suhosinem</a>, który ma za zadanie uodparniać dziurawego PHP na różne ataki włamywaczy. I niestety tylko tyle. Trop się urwał, a ja nie wnikałem, skoro obejście zadziałało. Pewnie coś z parserem PHP nie tak (jak zwykle), albo Suhosin narobił jakiegoś bałaganu. Łorewer.</p>
<p>Kilka dni później, po dodaniu nowego argumentu do zupełnie innej metody:</p>
<pre><code>ALERT - canary mismatch on efree() - heap overflow detected (attacker '127.0.0.1', file '/home/mcv/htdocs/cośtam/dispatch.php')</code></pre>
<p>Co? Że jak? Niniejszy kod:</p>
<pre><code>public function render ($partial_name, array $locals = array())
{ … }</code></pre>
<p>zastąpiłem nastepującym:</p>
<pre><code>public function render ($partial_name, array $locals = array(), array $options = array())
{ … }</pre>
<p></code></p>
<p>Od tej pory biały ekran śmierci (+wpis w logu) powodowały wszelkie możliwe rodzaje wywołań:</p>
<pre><code>$this->render ('xyz');
$this->render ('xyz', array ('var' => 'value'));
$this->render ('xyz', array ('var' => 'value'), array());
# itp.</code></pre>
<p>Znów zacząłem tracić czas i nerwy, aż w końcu dobra dusza Zergu zasugerował, żebym zrobił to samo co ostatnio. Chwila szukania w pamięci dała poniższy efekt.</p>
<pre><code>function render ($partial_name, array $locals = array(), array $options = array())
{
    $this->render_old ($partial_name, $locals, $options);
}

function render_old ($partial_name, array $locals = array(), array $options = array())
{ … }</code></pre>
<p>Magia, proszę Państwa! Działa! Nigdy nie lekceważcie potęgi nic-nie-robiącej funkcji opakowującej. Ani niepotrzebnych zmiennych tymczasowych. Bo mogą jednak okazać się potrzebne. A&nbsp;może ktoś zna wytłumaczenie dla tego bezsensownego zachowania <abbr>PHP</abbr>? Bo ja tego zupełnie nie rozumiem. Ale wiem już, że gdy zobaczę czyjś kod podobny do powyższego, to wcale nie z programisty będę się śmiał, a z czego innego… :^)</p>
<p>Dobranoc państwu i&nbsp;Wesołych Świąt.</p>


<p>Brak podobnych wposów.</p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2008/12/22/epic-alert-w-php-i-niespodziewane-biale-ekrany-smierci/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Aktualizacja oprogramowania a wydajność</title>
		<link>http://code42.pl/2008/12/19/aktualizacja-oprogramowania-a-wydajnosc/</link>
		<comments>http://code42.pl/2008/12/19/aktualizacja-oprogramowania-a-wydajnosc/#comments</comments>
		<pubDate>Fri, 19 Dec 2008 11:54:35 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Bazy danych]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[apache benchmark]]></category>
		<category><![CDATA[optymalizacja]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=79</guid>
		<description><![CDATA[Krótkie spostrzeżenie na temat wydajności aplikacji (praktycznie nie wypełnionej danymi) po następujących aktualizacjach: Symfony 1.1 → Symfony 1.2 Propel 1.2 → Propel 1.3 PHP 5.2.0 → PHP 5.2.6 PostgreSQL 8.1 → PostgreSQL 8.3 Prosty test został wykonany za pomocą ApacheBenchmarka: ab -c 5 -n 300 -H 'Connection: close'. Jak widać symulacja bazowała na 300 użytkownikach, przy czym [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2008/12/15/migracja-mysql%c2%a0%e2%86%92-postgresql-aplikacji-w-symfony-11/' rel='bookmark' title='Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1'>Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1</a></li>
<li><a href='http://code42.pl/2009/01/14/czas-zycia-krotki-w-postgresie/' rel='bookmark' title='PostgreSQL: obliczanie odstępów czasu'>PostgreSQL: obliczanie odstępów czasu</a></li>
<li><a href='http://code42.pl/2009/03/31/walidacja-jednego-pola-formularza-w-symfony/' rel='bookmark' title='Walidacja jednego pola formularza w symfony'>Walidacja jednego pola formularza w symfony</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/speedometer-536x282.jpg" alt="" title="speedometer" width="536" height="282" class="aligncenter size-medium wp-image-676" /></p>
<p>Krótkie spostrzeżenie na temat wydajności aplikacji (praktycznie nie wypełnionej danymi) po następujących aktualizacjach:</p>
<ul>
<li>Symfony 1.1 → Symfony 1.2</li>
<li>Propel 1.2 → Propel 1.3</li>
<li>PHP 5.2.0 → PHP 5.2.6</li>
<li>PostgreSQL 8.1 → PostgreSQL 8.3</li>
</ul>
<p>Prosty test został wykonany za pomocą <a href='http://code42.pl/?p=93' title='Connection: close + Apache Benchmark'>ApacheBenchmarka</a>:<br />
<code>ab -c 5 -n 300 -H 'Connection: close'</code>. Jak widać symulacja bazowała na 300 użytkownikach, przy czym do 5 na raz wchodziło na stronę.</p>
<h2>Przed aktualizacją</h2>
<p>Próba 1:</p>
<pre>
Requests per second:    4.34 [#/sec] (mean)
Time per request:       1152.770 [ms] (mean)
Time per request:       230.554 [ms] (mean, across all concurrent requests)
</pre>
<p>Próba 2:</p>
<pre>
Requests per second:    4.79 [#/sec] (mean)
Time per request:       1043.581 [ms] (mean)
Time per request:       208.716 [ms] (mean, across all concurrent requests)
</pre>
<h2>Po aktualizacji</h2>
<p>Próba 1:</p>
<pre>
Requests per second:    5.33 [#/sec] (mean)
Time per request:       937.318 [ms] (mean)
Time per request:       187.464 [ms] (mean, across all concurrent requests)
</pre>
<p>Próba 2:</p>
<pre>
Requests per second:    5.39 [#/sec] (mean)
Time per request:       927.979 [ms] (mean)
Time per request:       185.596 [ms] (mean, across all concurrent requests)
</pre>
<p>Oczywiście z uwagi na brak testów pomiędzy poszczególnymi zmianami ciężko jest powiedzieć coś więcej, niż tyle że warto aktualizować, choćby o tego jednego requesta na sekundę ;). Ot, taka ciekawostka.</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2008/12/15/migracja-mysql%c2%a0%e2%86%92-postgresql-aplikacji-w-symfony-11/' rel='bookmark' title='Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1'>Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1</a></li>
<li><a href='http://code42.pl/2009/01/14/czas-zycia-krotki-w-postgresie/' rel='bookmark' title='PostgreSQL: obliczanie odstępów czasu'>PostgreSQL: obliczanie odstępów czasu</a></li>
<li><a href='http://code42.pl/2009/03/31/walidacja-jednego-pola-formularza-w-symfony/' rel='bookmark' title='Walidacja jednego pola formularza w symfony'>Walidacja jednego pola formularza w symfony</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2008/12/19/aktualizacja-oprogramowania-a-wydajnosc/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

