Tag PHP

Konwersja zapisu wykładniczego do liczby całkowitej w PHP

W jaki najprostszy sposób skonwertować liczbę zapisaną w formacie wykładniczym (naukowym), np.:

3.625e+8

do postaci liczby całkowitej? Tu, podobnie jak w starym dobrym języku C, przychodzi nam na pomoc funkcja sscanf(), która parsuje parametr wejściowy zgodnie z podanym formatem. Rozwiązanie dla naszego przypadku jest:


$number = '3.625e+8';
$result = sscanf($number, '%e');
print $result[0]; //wyświetla 362500000

Regexp: Wyszukiwanie i linkowanie adresów email

Jak w prosty sposób wyszukać w tekście i automatycznie podlinkować wszystkie adres email? Można to zrobić np. w ten sposób:

	$string = 'Wyszukaj wszystkie qifl@ufydsg "prawdziwie" adresy mail@zumba.pl email imejl.kobza@lolo.bolo.com i stwórz z nich HTMLowe linki.';
 
	$reg = '/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}/i';
 
	print preg_replace($reg, '<a href="mailto:${0}">${0}</a>', $string);

Co dalej z PHP

Rozwój PHP zatrzymał się w miejscu. Wersja 5 języka stanęła okrakiem między językami silnie typowanymi, a językami dynamicznymi, wprowadzając na dodatek kilka swoich udziwnień i ciągnąc bagaż wad z poprzednich wersji.

Wydawało by się, że skoro model języka wyraźnie bazuje na Javie (i C++), a Zend wydając wersję 5 powiedział “A”, to powinien powiedzieć “B”, i dokończyć kilka spraw:

  • Wprowadzić możliwość pełnego typowania parametrów – obecnie parametry mogą być typowane, tylko jeżeli typem jest klasa albo array.
  • Umożliwić tworzenie setterów i getterów – magiczne metody nie są wystarczającym rozwiązaniem, gdyż nie komunikują jasno jakie właściwości są obsługiwane.
  • Wprowadzić przeciążanie metod.

Poza tym należałoby się odciąć kreską od poprzednich wersji lub przynajmniej posprzątać, to co posprzątane nie zostało, a więc przede wszystkim:

  • niespójne nazewnictwo funkcji i sposób przekazywania parametrów
  • rozdzielić metody na przestrzenie nazw (podobno w PHP6)
  • wprowadzić pełną obsługę dla UTF

Niestety, PHP 6 nad którym prace podobno trwają od dwóch lat, przyniesie jedynie kosmetyczne poprawki. A więc język ten pozostanie językiem do niczego, cieszącym się popularnością jedynie z siły rozpędu.

Linki:

Lista “todo” dla PHP 6
Statystyki używalności PHP – od trzech lat popularność języka nie rośnie

Selektywne cachowanie w SMARTY

System szablonów Smarty posiada wbudowane cachowanie stron. Mechanizm ten znakomicie przyspiesza działanie serwisów, które muszą działać pod dużym obciążeniem. Dzięki możliwości sprawdzania, które fragmenty strony pozostają w pamięci podręcznej, można radykalnie zmniejszyć liczbę zapytań do bazy danych jak i odciążyć PHP od parsowania szablonów.

Problem może jedynie stworzyć sytuacja, w której chcemy aby fragment strony pozostawał nie cachowany – może to być np. aktualne notowania, dynamiczna reklama czy cokolwiek innego. Jeżeli chcielibyśmy taki fragment strony dołączać za pomocą funkcji {include}, to niestety i ona będzie podlegać cachowaniu.

Zamiast jednak używania {include}, możemy wykorzystać funkcję {insert}, która z poziomu szablonu wywoła wskazaną (w parametrze name) funkcję PHP i umieści w szablonie rezultat działania funkcji. Po szczegóły zapraszam do dokumentacji, a poniżej podaję przykład gotowego rozwiązania.

Tworzymy funkcję w PHP, która będzie zwracała przetworzony przez Smarty, wskazany w parametrze szablon:

function insert_nocache($PARAMS,$smarty) {
 
//wyłączamy cachowanie
$smarty-&gt;caching = 0;
 
//pobieramy i zwracamy przetworzony szablon
return $smarty-&gt;fetch($PARAMS['file']);
}

A tutaj już sposób wywołania tej funkcji z poziomu szablonu:

..tutaj część która jest cachowana..
{insert name=nocache file='plik_bez_cachowania.tpl'}
..i tutaj dalsza część która jest cachowana..

Open Power Driver – rozszerzenie do PDO

Udostępniony od wersji 5.1 języka, PHP Data Objects (PDO) – uniwersalny interfejs baz danych – wprowadził nową jakość w komunikacji z bazami danych. Oczywiście już wcześniej istniały inne rozwiązania abstrakcji baz danych, jednak PDO zostało wbudowane na stałe do języka, zdobywając przez to swoich gorących zwolenników jak i zażartych przeciwników.

Mi osobiście to rozwiązanie się podoba. Należy tutaj zaznaczyć, że PDO nie jest abstrakcją na składnię zapytań, ale jedynie sposób na zunifikowaną komunikację z różnymi bazami danych. Innymni słowy udostępnia zestaw standardowych metod do łączenia, odpytywania, pobierania wyników (itp.) bazy, niezależnie od jej rodzaju.

PDO posiada jednak kilka braków, które programistów posiadających już własne rozwiązania, mogą zniechęcać do korzystania z tego rozwiązania. Najważniejszą z nich jest brak wbudowanego cachowania wyników – choć również brak konsoli debuggera może być dokuczliwy. Oba te “niedociągnięcia” eliminuje biblioteka Open Power Driver, stanowiąca część większego projektu Open Power Board.

Kropka i przecinek czyli liczby w PHP i MySQL

Być może napotkaliście kiedyś problem z reprezentacją liczb naturalnych w PHP i MySQL. Otóż MySQL jako punkt dziesiętny stosuje zawsze kropkę, w PHP zależy to natomiast od ustawionej lokalizacji.

Tym samym, jeżeli w PHP ustawimy lokalizację, w której punkt dziesiętny nie jest kropką (na przykład polską), wstawiając takie liczby do zapytania SQL otrzymamy błąd SQL:

setlocale(LC_ALL ~LC_NUMERIC,'pl_PL'); //lub setlocale(LC_ALL,'plk_PLK') na systemach Windows
$result=5/2;
mysql_query('UPDATE table SET value='.$result);

You have an error IN your SQL syntax; CHECK the manual that corresponds TO your MySQL server version FOR the RIGHT syntax TO USE near ‘5′ at line 1

Rozwiązanie problemu jest oczywiście bardzo proste. Możemy wybrać, wśród dostępnych kategorii, jakich funkcji ma dotyczyć ustawienie lokalizacji.

setlocale(LC_TIME,'pl_PL'); //lub setlocale(LC_TIME,'plk_PLK') na systemach Windows
$result=5/2;
mysql_query('UPDATE table SET value='.$result); //teraz będzie ok

Oto lista wszystkich dostępnych opcji dla setlocale. Dla każdej z nich można ustawić inną lokalizację:

  • LC_ALL for all of the below
  • LC_COLLATE for string comparison, see strcoll()
  • LC_CTYPE for character classification and conversion, for example strtoupper()
  • LC_MONETARY for localeconv()
  • LC_NUMERIC for decimal separator (See also localeconv())
  • LC_TIME for date and time formatting with strftime()
  • LC_MESSAGES for system responses (available if PHP was compiled with libintl)

Alternatywna składnia dla ‘if’ i nie tylko

Nie wszyscy zapewne wiedzą, że PHP oferuje możliwość używania alternatywnej składni dla takich struktur jak if(), while(), for(), foreach() i switch(). Zasada stosowania alternatywnej struktury jest bardzo prosta: nawiasy otwierające blok zamieniamy na znak dwukropka ‘:’, a zamykające zastępujemy odpowiednio słowem kluczowym endif; endwhile; endfor; itd.

Poniżej przykład prosto z manuala:

if ($a == 5):
	echo "a equals 5";
	echo "...";
elseif ($a == 6):
	echo "a equals 6";
	echo "!!!";
else:
	echo "a is neither 5 nor 6";
endif;

Copyright © Kubiczek devblog
I'm lovin' it ;)

Built on Notes Blog Core
Powered by WordPress