Autor wpisu: bastard13, dodany: 15.10.2013 14:09, tagi: javascript
Autor wpisu: matipl, dodany: 10.10.2013 13:56, tagi: php
Od 8 października Google udostępniło dla wszystkich testowe środowisko dla aplikacji PHP w ramach Google App Engine. Dzięki temu, jak zapewnia Google nie powinniśmy mieć problemu ze skalowalnością takich produktów jak Drupal, CodeIgniter czy nawet phpBB. Jestem ciekaw czy kiedyś chmura Google będzie realną konkurencją dla usług Amazona.
W ramach App Engine dostajemy do dyspozycji standardowy PHP 5.4 z włączonymi ponad 38 rozszerzeniami, m.in.:
- gd
- memcache / memcached
- mcrypt
- PDO / mysql / mysqli / mysqlnd
Jeśli chcielibyście przetestować w chmurze Google własną aplikację, musicie pamiętać o funkcjach, które są wyłączone. Bardziej popularne zablokowane funkcje to tmpfile(), fsockopen(), gethostname().
Autor wpisu: Jacek Skirzyński, dodany: 07.10.2013 23:40, tagi: php
Pierwsze wydania głównych (obecnie) gałęzi PHP miały miejsce:
- 5.3.0 – 30 czerwca 2009r
- 5.4.0 – 1 marca 2012r
- 5.5.0 – 20 czerwca 2013r
Natomiast egzamin na certyfikat z PHP przez dłuższy czas dotyczył wersji 5.3, jednak nadchodzą zmiany.
Po pierwsze dotychczasowy egzamin (obejmujący PHP 5.3) będzie dostępny tylko do 31 grudnia 2013 roku. W jego miejsce pojawił się egzamin obejmujący PHP 5.5. Zmienia się również nazwa, teraz będzie to „Zend Certified PHP Developer”, co Zend tłumaczy dopasowaniem nazwy do innych certyfikatów IT. Według informacji ze strony rejestracja na nową wersję egzaminu była dostępna od 3 października, natomiast sam egzamin od dziś (7 października).
Nadal dostępny jest Study Guide dla wersji 5.3 a prace nad jego aktualizacją do 5.5 trwają i efekty mają być w przyszłym miesiącu (podejrzewam, że chodzi o listopad).
Źródło: PHP Certification
Autor wpisu: Jacek Skirzyński, dodany: 06.10.2013 12:58, tagi: php
We wpisie Magiczne „cyferki” pisałem o używaniu stałych zamiast magicznych cyfr, które dla osoby nie znającej szczegółów projektu nic nie znaczą. Stałe zamiast cyfr są postępem, jednak pozostaje problem poprawności danych. Na przykład wartość 1
może mieć status obiektu firmy, osoby i wielu innych obiektów w aplikacji. W dodatku dla każdego obiektu może on oznaczać coś zupełnie innego. Z drugiej strony przy większej liczbie statusów w jednym obiekcie i mniejszej w innych można przez pomyłkę przypisać status innego obiektu, który jest poza zakresem danego obiektu.
Krótko mówiąc pozostaje problem ograniczenia możliwości ustawienia statusu tylko z określonego zakresu/typu. Typ jest tutaj istotną wskazówką – m.in. w Javie są tytułowe typy wyliczeniowe, które pozawalają zdefiniować nowy typ, dla określonego zbioru wartości, a język poprzez typowanie parametrów metody przypilnuje, żeby ustawiać statusy tylko dozwolonego typu.
W PHP również jest typowanie parametrów (tylko dla typów złożonych) i jak się okazuje w bibliotece SPL znajduje się nawet klasa dla typów wyliczeniowych – SplEnum. Jej budowa jest dość prosta a przykłady z manuala klarowne. Jest jednak jeden problem – nie jest standardowym elementem języka i wymaga doinstalowania rozszerzenia PECL na serwerze. Dla posiadaczy serwerów dedykowanych/VPS nie stanowi to problemu, jednak przy uruchamianiu aplikacji na hostingu współdzielonym zainstalowanie tego rozszerzenia zależy od administratora.
Jak wspominałem trochę wyżej budowa klasy jest dość prosta, więc zamiast zastanawiać się nad dostępnością/możliwością instalacji rozszerzenia na serwerze można napisać odpowiednik tej klasy samemu, poniżej przykładowa implementacja.
<?php /** * My implementation of alternative SplEnum * @link http://php.net/manual/en/class.splenum.php */ class MyEnum { /** * Value of object * @var mixed */ private $value; /** * Name of const with default value * @var string */ private $defaultName = '__default'; /** * Reflection object * @var ReflectionClass */ private $reflection; /** * Create object * @param mixed $initialValue * @throws UnexpectedValueException */ public function __construct($initialValue = null) { if ($initialValue && in_array($initialValue, $this->getConstList())) { $this->value = $initialValue; } elseif (!$initialValue && $this->getDefault()) { $this->value = $this->getDefault(); } else { throw new UnexpectedValueException('Value not a const in enum '. get_class($this)); } } /** * Get array of class consts * @param boolean $includeDefault * @return array */ public function getConstList($includeDefault = false) { $tmp = $this->getReflection()->getConstants(); if (!$includeDefault && array_key_exists($this->defaultName, $tmp)) { unset($tmp[$this->defaultName]); } return $tmp; } /** * Get value of object * @return mixed */ public function getValue() { return $this->value; } public function __toString() { return (string) $this->getValue(); } /** * Get default value from class * @return mixed */ protected function getDefault() { return $this->getReflection()->getConstant($this->defaultName); } /** * Get instance of class reflection * @return ReflectionClass */ protected function getReflection() { if (!$this->reflection) { $this->reflection = new ReflectionClass($this); } return $this->reflection; } }
Myślę, że kod jest czytelny i jasny. Dla przypomnienia odczytanie stałych zadeklarowanych w klasie jest realizowane z wykorzystaniem mechanizmu refleksji, który pozwala na analizowanie struktury/budowy obiektu w trakcie wykonania kodu.
Teraz bardzo prosty kod z przykładem użycia:
<?php function processOption(Opcje $opcja) { echo($opcja); } class Opcje extends MyEnum { const __default = 2; const OPCJA1 = 1; const OPCJA2 = 2; } $obj = new Opcje(); processOption($obj);
Powyżej znajduje się definicja funkcji, która przyjmuje parametr typu Opcje
i definicja tej klasy. Klasa ogranicza się jedynie do dziedziczenia po MyEnum
i deklaracji stałych, cała funkcjonalność jest dziedziczona. Przykładowy kod wyświetli tylko 2
, ponieważ taka jest wartość domyślna typu wyliczeniowego i typ zgadza się z oczekiwanym typem parametru funkcji.
W przypadku próby utworzenia obiektu z wartością spoza zdefiniowanych stałych zostanie rzucony wyjątek UnexpectedValueException
, natomiast przy próbie przekazania do funkcji parametru innego typu:
<?php processOption(2); // wynik: Catchable fatal error: Argument 1 passed to processOption() // must be an instance of Opcje, integer given, called in...
Wygląda na to, że problem jest rozwiązany – nie można pomyłkowo przypisać innej wartości i tego nie zauważyć.
Dodatkowo, na polskiej planecie PHP pojawił się jakiś czas temu wpis z pomysłem implementacji typów wyliczeniowych w oparciu o koncepcję z Javy – odsyłam do tego wpisu (autorem jest Sebastian Malaca). Warto również przyjrzeć się komentarzom pod tym wpisem, ponieważ można tam znaleść kolejną/bardziej rozbudowaną alternatywę dla SplEnum
.
Autor wpisu: batman, dodany: 30.09.2013 07:00, tagi: skrypty
Autor wpisu: Jacek Skirzyński, dodany: 29.09.2013 18:06, tagi: php
Często jest tak, że aplikacja korzysta z jakichś bibliotek, modułów lub zakłada pewne opcje konfiguracyjne. Przykładem może być sprawdzanie MIME pliku z wykorzystaniem modułu Fileinfo
. PHP w wersjach przeznaczonych na Windowsa wymaga ręcznej edycji php.ini
i włączenia wczytywania tego modułu. Efekt jest taki, że w środowisku *nix wszystko działa, a po uruchomieniu tego samego kodu na Windowsie jest problem…
Mając chwilę wolnego czasu napisałem kawałek kodu, który pomaga znajdować tego typu problemy z zależnościami, konfiguracją przed uruchomieniem docelowej aplikacji – mowa o PHP Applications Requirements Tester (PART). Projekt znajduje się na moim koncie w serwisie GitHub.
Użycie jest według mnie bardzo proste – przykładowy plik z testami znajuje się również na GitHubie. Wystarczy utworzyć nowy plik PHP, dołączyć plik part.php
, utworzyć obiekt PART i wywoływać na nim odpowiednie metody z testami środowiska. Taki zestaw umieszcza się w miejscu gdzie ma być aplikacja i uruchamiamy – w przeglądarce lub z shella. Mogą wystąpić różnice w konfiguracji między środowiskiem shell i webowym (ponieważ mają osobne pliki php.ini
, więc najlepiej uruchamiać test z tego środowiska w którym będzie działała docelowa aplikacja.
Poniżej źródło przykładowego zbioru testów i wyniki:
<?php require_once 'part.php'; $obiekt = new PART(); $obiekt->checkConfigHasValue('display_errors', 0) ->checkPDO() ->checkPDODriver('mysql') ->checkPHPVersion(5.4) ->checkDisableMagicQuotes() ->checkDefaultTimezone('Europe/Warsaw') ->checkNotWindowsServer();
Wynik konsolowy:
PHP Applications Requirements Tester - Report Warning: The CLI environment may be different from web environment Test name Result Expected Environment ================================================================================ Config [display_errors] OK 0 Extension loaded [PDO] OK PDO driver [mysql] OK PHP version OK 5.4 [>=] 5.4.9-4ubuntu2.3 Config [magic_quotes_gpc] OK 0 Config [magic_quotes_runtime] OK 0 Config [magic_quotes_sybase] OK 0 Default timezone failure Europe/Warsaw Europe/Berlin Not Windows OS serwer OK Warning: The CLI environment may be different from web environment
Na załączonych raportach widać, różnicę pomiędzy uruchomieniem testu z konsoli i przeglądarki – w pierwszym wypadku display_errors
jest wyłączone zgodnie z oczekiwaniami, w drugim przeciwnie.