Przejdź do głównej zawartości

Posty

Wyświetlam posty z etykietą PHP

Dlaczego nie PHP - $this w metodach statycznych (odc. 4)

W języku PHP widziałem już kilka dziwnych zjawisk. Jednak to na co natknąłem się niedawno, powaliło mnie zupełnie na kolana. PHP w momencie gdy nie ma ustawionego poziomu raportowania błędów na "strict" pozwala na wywoływanie metod, które nie są zadeklarowane jako statyczne przy użyciu operatora :: oraz odwrotnie - metody statyczne można wywoływać w kontekście obiektu poprzez $this. Dla przykładu przedstawię kod. <?php class A { public function test () { return B :: test (); } } class B { public function test () { return get_class ( $this ); } } $obj = new A (); echo $obj -> test (); ?>   Zazwyczaj takie działania w innych językach powodują błędy. W PHP, które nie jest ustawione na "strict" wykona powyższy kod. Co ciekawe wynik będzie dosyć zaskakujący. Na logikę w kontekście statycz...

Dlaczego nie PHP - kompatibilność wsteczna (odc. 3)

Na początku marca 2012 wydano  nową wersję 5.4 języka PHP. Nowa wersja wprowadza wiele udogodnień oraz kilka nowinek do gramatyki. Na przykład możliwość używania operatora tablicowego za operatorem funkcji $obiekt->funkcja()[4]; , składni $klasa::funkcja(). Jako zupełna nowość pojawiły się długo oczekiwane cechy (ang. traits). Niestety ze względu na porzucenie części kompatybilności wstecznej niektóre skrypty/programy pisane pod 5.3 mogą przestać działać. Na taki problem napotkałem się po aktualizacji oprogramowania przez pewnego administratora, który nie informując nikogo a swoim zamiarze nagle zmienił na serwerze dedykowanym wersję PHP z gałęzi 5.3.x na 5.4.x.   Problem dotyczył konkretnie framework'a Kohana 2.3.4. Zdaję sobie sprawę, że framework ten był pisany z myślą o PHP 5.2 jednak pod 5.3 wszystko działało jak dawniej. Po kilku godzinach ciężkich prób i walki na podstawie informacji znalezionych na forum debiana udało się wprowadzić stosowną poprawkę do kodu. C...

Dlaczego nie PHP - Rzutowanie łańcuchów znakowych (odc. 2)

Ostatnio natknąłem się w pracy na niemiłą niespodziankę. Okazało się, że PHP ma trochę odmienne podejście do konwersji łańcuchów tekstowych do zmiennych typu logicznego (boolean). Różnica polega na tym, że większość języków niepuste ciągi znaków rzutują do boolean na logiczną prawdę (TRUE).  Weźmy na przykład tutaj Pythona: matis@linux-xcbr:~> python Python 2.6.5 (r265:79063, May  6 2011, 17:25:59) [GCC 4.5.0 20100604 [gcc-4_5-branch revision 160292]] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> bool("0") True >>> Jednak jak wiadomo Python pomimo dynamicznego typowania jest zaliczany do języków silnie typowanych, dlatego postanowiłem zweryfikować dla spokoju swojego sumienia jak to się odbywa w JavaScript, który tak jak PHP jest językiem słabo typowanym. Poniżej komenda wpisana do konsoli Firebuga wraz z rezultatem: >>> Boolean("0") true ...

Dlaczego nie PHP - Tablice (odc. 1)

Po wielu nerwowych godzinach spędzonych przy PHP postanowiłem podzielić się z innymi użytkownikami internetu na temat moich spostrzeżeń odnośnie do języka i platformy PHP - zarówno tych negatywnych jak i pozytywnych (choć tych będzie chyba trochę mniej). Język ten rozwija się stosunkowo powoli, a twórcy późno dochodzą do wniosków, do których doszli twórcy takich języków jak Python już w fazie projektowania. W pierwszych artykułach doczepię się gramatyki języka, której w mojej ocenie brakuje kilku "drobiazgów". Na pierwszy ogień niech pójdą tablice i praca z nimi. <?php $element_trzeci = $obiekt -> pobierz_tablice ()[ 2 ]; ?> Konstrukcja znana z wielu języków programowania (chociażby Python, Java, JavaScript itp, itd). Niestety w PHP 5.3  kod ten się nie wykona - zobaczymy piękny komunikat "syntax error". Konstrukcja ta została wprowadzona stosunkowo niedawno w wersji 5.4 (programiści PHP musieli czekać do drugiej dekady XXI wieku na coś, co w ...

Konkatenacja w zapytaniach SQL a bindowanie przez "?"

Ostatnio w kodzie pewnego programisty znalazłem dosyć ciekawy błąd. Wynikał on z różnego sposobu podpinania parametrów do zapytania UPDATE (SQL). Wartości pól po "SET" były bowiem konkatenowane, natomiast część po słowie kluczowym "WHERE" bindowana przez znaki zapytania. Mniej więcej wyglądało to tak (pół-pseudokod): <?php $set = ' user_id =' . escape ( $user_id ) . ' ' ; ( ... ) if ( isset ( $_POST [ 'comment' ])) { $set .= ', comment="' . escape ( $_POST [ 'comment' ]) . '"' ; } query ( 'UPDATE `tabela` SET ' . $set . ' WHERE id=? ' , $id ); ?> Cały szkopuł polegał na tym, że w momencie, kiedy w którejkolwiek wartości podpiętej w zmiennej $set pojawił się znak zapytania (bo użytkownik np. chciał zadać pytanie), to do tego znaku zapytania została zbindowana zmienna $id i finalne zapytanie wyglądało np. tak : UPDATE ` tabela ` SET ` user_id `= 5 , ...

SOTE 3.5 - Widok koszyka.

Aby pozmieniać widok koszyka należy otworzyć plik /htdocs/themes/base/base_theme/basket_delivery_submit.html.php i tutaj możemy ustawić sobie np. minimalną wartość zamówienia poprzez skontruowanie warunku: <?php $min_amount = 0 ; if ( $_SESSION [ 'global_basket_amount' ] >= $min_amount ) { print ' < input type="submit" name="submit_proceed" value="' . $lang -> basket_take_order . '" >' ; } else { print 'twoje zampwienie nie wynosi minumum ' . $min_amount . 'zl :-(' ; } ?> gdybyśmy chcieli skontruować warunek dla kwoty minimalnej łącznie z przesyłką, to warunek zmieniamy tak: <?php if ( $shop -> currency -> price ( $order_amount ) >= $min_amount ) { "(...)" } ?>