# Sztuczki PHP - nie koniecznie magiczne

Dodany dnia 04.06.2009 przez waXain

Tym razem chciałbym zaprezentować 10 wybranych "sztuczek" w PHP, które czasami naprawdę mogą ułatwić nam życie a nawet spowodować szybsze działanie naszego kodu. O niektórych warto pamiętać, inne mogą posłużyć jako ciekawostka. Niemniej warto się z nimi zapoznać. Jeśli znacie jakieś inne ciekawe - zapraszam do wpisywania ich w komentarzach! :)

1. Tworzenie tablicy x elementowej

$a = range(0,15);

Wiele osób często zapomina o tej naprawdę przydatnej funkcji, dzięki której w prosty (i szybki) sposób możemy utworzyć tablicę x elementową wypełniając ją kolejnymi wartościami numerycznymi (z możliwością ustawienia parametru "step"). Nie trzeba pisać pętli tworzącej tablicę, co przy tworzeniu większych tablic jest sporo wydajniejsze.

2. Separator katalogów: DIRECTORY_SEPARATOR

Stała, oznaczająca separator katalogów - bardzo przydatna, szczególnie jeśli nasza aplikacja ma działać na serwerach z różnymi systemami operacyjnymi. Ponieważ jej nazwa jest dość długa i niewygodna przy budowaniu ścieżek, można ją skrócić do postaci:

define('DS',DIRECTORY_SEPARATOR);


3. Bezbłędny warunek

if($a == 1) vs if(1 == $a)

Działa teoretycznie tak samo. Różnica jest taka iż, w drugim sposobie (1 == $a) w przypadku gdy popełnimy błąd składniowy pisząc o jeden znak "równa się" za mało (1 = $a) PHP zgłosi nam błąd składni, w pierwszym przypadku błąd nie zostanie zgłoszony. Czasami może nam to zaoszczędzić cenny czas poszukiwań błędu w kodzie...

4. Alternatywny warunek

$x = ($v > 1) ? true : false;

Alternatywny sposób zapisania warunku (tu z jednoczesnym przypisaniem do zmiennej). Fajna rzecz, szczególnie przy prostych warunkach. Należy jednak nie przesadzać z nadużywaniem tego sposobu gdyż raz, że jest nieco wolniejszy od zwykłego "if" a dwa, przy kolejnych zagnieżdżeniach, kod jest naprawdę nieczytelny...

5. Zmienne zmienne

$a = 'variable';

$$a = 'hello';

echo $variable;

Co otrzymamy? Oczywiście 'hello'. Tworzenie zmiennych zmiennych czasami może się przydać (np. tworzenie zmiennych na podstawie kluczy tablicy asocjacyjnej). Jednak nie ma co ukrywać - jest to bardziej "zabawka" niż coś co będziemy w codziennym programowaniu wykorzystywali.

6. strlen vs isset

$test = 'abcd';

if (strlen($test) < 5) {
	echo "ciag jest za krotki";
}

// vs

if (!isset($test{5})) {
	echo "ciag jest za krotki";
}

Ponieważ isset w przeciwieństwie do strlen nie jest funkcją a konstrukcją językową PHP jest on znacznie szybszy, co przy częstym wykorzystaniu w kodzie może dać zauważalne przyspieszenie działania skryptu.

7. ctype_digit vs wyrażenia regularne

$test = '123';

Gdybyśmy chcieli sprawdzić czy w zmiennej $test (string) są same liczby, możnaby to zrobić na 3 sposoby:
z wykorzystaniem wyrazeń regularnych:

preg_match("![0-9]+!", $test);

// lub

ereg('^[0-9]+',$test)

z wykorzystaniem funkcji z rodziny ctype:

ctype_digit($test);

Po przeprowadzeniu testów (na 1000 iteracji) okazuje się, że preg_match jest około 7-8 krotnie wolniejszy od ctype_digit natomiast ereg 3-4 razy.Od PHP >= 4.2.0 funkcje ctype są domyślnie włączone, więc naprawdę warto z nich korzystac :)

8. Szybki return.

if ($a == 5) {
  return true;
}

// lepiej:

return ($a == 5);

Często na koniec działania metody / funkcji dokonujemy osobnego sprawdzania warunku lub jakiś decydujących obliczeń które tak naprawde można sprawdzić/wykonać bezpośrednio przy "return".

9. Szybkie wyszukiwanie elementów w tablicy


$keys = array("js", "php", "ajax", "jquery");
if (in_array('jquery', $keys)) {}

// vs

$keys = array("js" => 1, "php" => 1, "ajax" => 1, "jquery" => 1);
if (isset($keys['jquery'])) {}


Czasami warto zamiast zwykłej tablicy numerycznej tworzyć tablicę asocjacyjną przypisując jej kluczom jakąś wartość. Dzięki takiemu podejściu bedziemy mogli użyć isset() zamiast funkcji in_array() przy wyszukiwaniu/sprawdzaniu, co znacznie przyspieszy tą operację (szczególnie jeśli mamy dużo elementów w tablicy).

10. Rozszerzona pętla for

for($i=0,$ile=count($tablica); $i<$ile; $i++){}

Choć zapis ten jest nie jest jakąś nowością, to jednak z moich doświadczeń wiem, że niewiele osób z niego korzysta, posiłkując się starym sposobem zapisu, czyli:

for($i=0; $i<count($tablica); $i++){} 

który jest znacznie wolniejszy (przy 1000 iteracji około 5 razy wolniejszy).

That's all. Życze owocnego programowania :)

Tagi: tips tricks sztuczki php wydajność składnia

# komentarze

Dodany dnia 05.07.2009 przez: waxain | www: http://www.waxain.pl

W punkcie 10 jest właśnie pokazane jak dokonać tylko raz niezbędnęgo obliczenia (count). Oczywiście można to zrobić przed pętlą i zadziała to dokładnie tak samo - czyli wykona się tylko raz :)

Dodany dnia 05.07.2009 przez: Pawos | www: http://www.woszkowski.com

Mały tip z AS3 (ciekawe czy zadziała też w php). Zamiast w każdej iteracji pętli obliczać $ile = count($tablica), wyrzucamy całe to wyrażenie przed pętlę, czyli:
$ile = count($tablica);
for($i=0; $i<$ile; $i++){}

Dodany dnia 04.07.2009 przez: waXain | www: http://www.waxain.pl

Faktycznie używanie plusa w emailu nie zadziała - zendowy walidator na to nie pozwoli. Przyczyną jest kwestia odpowiedniego skonfigurowania MTA (Mail Transfer Agent) na serwerze - tu niestety nie akceptują plusów :( Oczywiście można to ominąć i wyrzucić z walidacji e-maili co postaram się niebawem uczynić :) Co do preinkrementacji - zgadza się - jest ona nieco szybsza :)

Dodany dnia 04.07.2009 przez: Paweł

Tak na szybko jedna ciekawostka mi się nasuwa: preinkrementacja jest szybsza od postinkrementacji, ale to nic czego nie wiedziałbyś wcześniej ;-)

btw: czemu walidator nie przepuszcza plusów w emailu?
 

x
  •  
* - pola wymagane