Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM    Subskrybuj kanał ATOM dla tagu php Kanał ATOM (tag: php)

Autor wpisu: Piotr Śliwa, dodany: 05.11.2015 23:19, tagi: php

Ostatnio można było odnieść wrażenie, że tak jak tytuł mówi, jestem leniwy (ostatni wpis na początku roku), ale nic bardziej mylnego. Już zabieram się za temat leniwej ewaluacji. Wyjdę od Scali, a później przejdę do PHP.

Leniwa ewaluacja na przykładzie Scali

Są dwa sposoby ewaluacji wyrażeń: chciwe (strict) oraz leniwe (lazy). Scala jest językiem, który domyślnie wyrażenia ewaluuje chciwie (tak jak większość języków), ale gdy tego chcemy, możemy oznaczyć aby dane wyrażenie było leniwe.

lazy val a = 1 + 2  
lazy val b = a + 3  
val c = a + b // obliczenie wartości a i b odbywa się dopiero tutaj  
              // a nie w momencie inicjalizacji zmiennej

Listy i większość innych kolekcji w scali są chciwe, jedną z leniwych struktur jest Stream - jest to leniwa wersja listy. Przykład strumienia będącego nieskończonym ciągiem liczb naturalnych:

val naturals: Stream[Int] = 0 #:: naturals.map(_ + 1)  
//res0: Stream[Int] = Stream(0, ?)

Powyższy zapis jest skróconym zapisem:

val naturals: Stream[Int] = Stream.cons(0, naturals.map(_ + 1))  

Poniżej dwa akapity wyjaśnień, bo mimo iż zapis ten jest prosty, naturalny i dosyć matematyczny, mózg może się przed nim lekko opierać.

Co to jest rekurencyjna struktura danych? Wyjaśnię to na przykładzie. Matrioszka to klasyczna rosyjska zabawka składająca się z X lalek. X - 1 lalek jest otwieranych i może zawierać w sobie kolejną (mniejszą) lalkę. Ostatnia lalka nie jest otwierana i nie można już do niej nic wsadzić. Tak więc pierwsza lalka zawiera drugą, która zawiera trzecią i tak do ostatniej, która nie zawiera już kolejnej lalki. Każda z lalek ma ten sam "interfejs", wygląda podobnie. Ostatnia lalka różni się od reszty tym, że nie zawiera kolejnej. Podobnie jest ze strukturami rekurencyjnymi. W przypadku strumieni, "lalkę" mogąca zawierać inną "lalkę" nazywamy Cons, zaś ostatnią pustą "lalkę" Empty. Cons jest węzłem, który ma wartość i referencję do pozostałej części strumienia (ogona). Empty to pusty strumień. Konstruktor Cons wygląda następująco: Cons(value, Stream) - ma referencję do przechowywanej wartości oraz dalszej części strumienia. Dalsza część strumienia może być Cons lub Empty (otwierana lub ostatnia pusta "lalka"). Przykładowy strumień złożony z 2 elementów: Stream.cons(0, Stream.cons(1, Stream.Empty)) lub składnia skrócona: 0 #:: 1. Jako referencji do całego strumienia używamy referencję do jego pierwszego elementu - tak samo jak w przypadku matrioszki, pierwsza lalka jest lalką samą w sobie, nie jest potrzebne dodatkowe opakowanie tak jak w przypadku klasycznej listy powiązanej.

Wracając do naszego ciągu liczb naturalnych (ignorujemy to że może się przekręcić po dojściu do max int). 0 to pierwszy element strumienia, naturals.map(_ + 1) to strumień będący dalszą częścią głównego strumienia (drugim argumentem konstruktora Cons). Bardzo ważne jest to, że naturals.map(_ + 1) jest ewaluowane leniwie, czyli wartość drugiego elementu zostanie wyliczona tylko gdy będziemy chcieli go odczytać. Zapis może na początku lekko kołować, ale wystarczy sobie uświadomić, że jest to rekurencyjna definicja równoznaczna z rekurencyjnym wywołaniem funkcji:

def createNaturals(from: Int): Stream[Int] = from #:: createNaturals(from+1)  
val naturals = createNaturals(0)  

Jeśli dwa poprzednie akapity nie są jasne, przeczytaj je jeszcze raz (rekurencyjnie, aż do spełnienia warunku wyjścia) ;)

Wyliczenie wartości następuje tylko gdy chcemy tą wartość odczytać:

naturals(5) //pobranie 5-tego elementu ciągu  
            //następuje ewaluacja ciągu do 5-tego 
            //elementu włącznie, 6-ty element nie jest ewaluowany
//res1: Int = 5

Ok, teraz trochę bardziej złożony przykład - definicja ciągu fibonacciego:

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: batman, dodany: 28.10.2015 17:00, tagi: php

Najnowsza wersja PHP, oznaczona numerem 7, zbliża się do nas dużymi krokami i za około miesiąc ma być dostępna stabilna wersja. Najczęściej podkreślanym atutem jest szybkość „siódemki”, która ma na głowę bić poprzednie wersje. Ciekawie się również zapowiadają nowe elementy języka. Lista nowości znajdujących się w PHP7 jest całkiem długa, dlatego też nie będę wymieniał ich wszystkich, a skupię się jedynie na tych, które dla mnie są najciekawsze. Deklaracja typów skalarnych Od dawien dawna narzekałem na brak możliwości określenia typu danych przyjmowanych oraz zwracanych przez... [[ This is a content summary only. Visit my website for full links, other content, and more! ]]

Autor wpisu: matipl, dodany: 16.10.2015 11:34, tagi: php

A jednak – właśnie ukazała się piąta wersja Release Candidate najnowszej wersji PHP, którego premiera zaplanowana jest na listopad 2015. Lista poprawionych błędów jest o wiele mniejsza niż ostatnio. To dobry znak.

Artykuł PHP 7.0.0 RC5 pochodzi z serwisu Mateusz matipl Kamiński.

Autor wpisu: Łukasz Socha, dodany: 13.10.2015 16:16, tagi: php, mvc

Czytelnikom bloga chyba nie muszę tłumaczyć co to jest i do czego służy paginacja. W tym wpisie udostępnię bibliotekę dostosowaną do szkieletu aplikacji pokazanego w cyklu MVC w praktyce z composer – tworzymy system artykułów. Żeby zrozumieć treść tego artykułu konieczne jest zapoznanie się powyższym cyklem. Kod biblioteki jest zmodyfikowaną klasą paginacji z aplikacji Open […]

Autor wpisu: Diabl0, dodany: 09.10.2015 14:46, tagi: php, sql

Pobieramy instantclient z strony Oracle (wymaga logowania). Ja korzystałem z wersji 11.2.0.4.0 (64-bit). Potrzebne nam są:

  • Instant Client Package – Basic: All files required to run OCI, OCCI, and JDBC-OCI applications
  • Instant Client Package – SDK: Additional header files and an example makefile for developing Oracle applications with Instant Client

Zawartość unzipujemy i kopiujemy do wybranej ścieżki (w moim przypadku /usr/local/instantclient)

Następnie tworzymy symlinki:

ln -s libclntsh.dylib.11.1 libclntsh.dylib
ln -s libclntsh.dylib libclntsh.so

I exportujemy ścieżkę aby pdo_oci odnalazło sobie instantclienta:

export ORACLE_HOME="instantclient,/usr/local/instantclient,11.2.0.4.0"

Teraz pozostało nam już odpalić instalację PHP, np. poprzez:

brew install php56 --with-pdo-oci

Oczywiście pozostałe opcje kompilacji (oraz wersję PHP) dobieracie pod swoje potrzeby.

 

Autor wpisu: matipl, dodany: 06.10.2015 18:35, tagi: php

5 dni temu Sebastian Bergmann opublikował nową wersję PHPUnit – 5.0.0.

Dlaczego Wam o tym piszę, a nie wspominałem o poprzednich wydaniach? Ponieważ wraz z wersją PHPUnit 5 zostaje całkowicie usunięte wsparcie dla PHP 5.3, PHP 5.4, i PHP 5.5. To naprawdę poważna zmiana, ponieważ dopiero co skończyło się oficjalne wsparcie bug fixów w PHP 5.4 (wrzesień 2015), a już poszczególne biblioteki/rozwiązania przestają wspierać tą wersję.

Zmianą w pełni pozytywną jest przestawienie się w modelu dystrybucji PHPUnit na archiwa PHAR (w 1 pliku mamy wszystko czego wymaga PHPUnit do poprawnego działania). To powinno ułatwić pracę z testami jednostkowymi, jak również w przyszłości pozwoli na równoległe testowanie na różnych wersjach PHPUnit. Wsparcie dla PHPUnit 5 (łatanie błędów) jest zapewnione do 4 sierpnia 2017 roku.

I to nie koniec poważnych zmian. Sebastian oświadczył także, że kolejna wersja PHPUnit 6, której wydanie planowane jest na 5 sierpnia 20152016 zupełnie zostanie pozbawiana wsparcia PHP w linii 5.* (czyli pół roku po wydaniu PHP 7).

Artykuł PHPUnit 5.0.0 pochodzi z serwisu Mateusz matipl Kamiński.

Autor wpisu: batman, dodany: 06.10.2015 12:00, tagi: php

Laravel, jak przystało na nowoczesny framework, pozwala na instalowanie paczek, które znacząco podnoszą komfort korzystania z frameworka oraz bardzo upraszczają tworzenie aplikacji. Czasami nie chcemy aby jakaś paczka trafiła na produkcyjny serwer i dodajemy ją w composerze do require-dev. Teoretycznie wszystko jest w porządku, poza jednym drobnym szczegółem. W pliku konfiguracyjnym nadal wisi provider, który w bardzo ładny sposób położy całą aplikację i wyświetli komunikat o braku plików. Jak temu zaradzić? Rozwiązań problemu jest kilka. Jednym z bardziej popularnych jest trzymanie różnych... [[ This is a content summary only. Visit my website for full links, other content, and more! ]]
Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.