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

Autor wpisu: sokzzuka, dodany: 02.10.2011 23:50, tagi: php

Tak przy okazji refleksji i rozmyślań filozoficznych, postanowiłem zademonstrować, jak w języku pokroju Javy zaimplementować rozwiązanie problemu obliczania ceny wszystkich produktów w koszyku.

Proceduralnie:


public class Produkt {
    private Integer cena = 0;
    private Integer ilosc = 0;
    private String nazwa = "";

   public Produkty(Integer cena, Integer ilosc, String nazwa);

    /** tu gettery i settery dla wszystkich parametrow parametrow **/

}

public class Koszyk {

    private List<Produkt> produkty;

    public List<Produkty> getProdukty();
    public void setProdukty(List<Produkty> produkty);

}

public class KoszykUtil {

    public static Integer podliczKoszyk(Koszyk koszyk){
        List<Produkty> produkty = koszyk.getProdukty();
        Integer suma = 0;        

        for(Produkt produkt: produkty){
            suma+= produkt.getCena() * produkt.getIlosc();
        }
        return suma;
    }
}

Produkt p1 = new Produkt(12, 1, "baton z ropą");
Produkt p2 = new Produkt(13, 1, "baton z benzyną");
List<Produkty> produkty = new ArrayList<Produkty>();
produkty.add(p1);
produkty.add(p2);

Koszyk k = new Koszyk();
k.setProdukty(produkty);

Integer suma = KoszykUtil.podliczKoszyk(k);
System.out.println(suma);

Obiektowo:


public class Produkt {

    private final String nazwa;
    private final Integer cena;
    private Integer ilosc;

    public Produkt(String nazwa, Integer cena, Integer ilosc);
    public Integer suma(){
        return cena*ilosc;
   }

}

public class Koszyk {

    private List<Produkt> produkty;
    private Integer wartosc = 0;    

    public dodajProdukt(Produkt produkt){
        produkty.add(produkt);
        wartosc += produkt.suma();
    }

    public Integer wartosc(){
        return wartosc();
    }
}

Koszyk k1 = new Koszyk();
Produkt p1 = new Produkt("baton z benzyna" , 10, 1);
Produkt p2 = new Produkt("baton z ropą", 10, 1);
k1.dodajProdukt(p1);
k1.dodajProdukt(p2);

Integer suma = k1.wartosc();
System.out.println(suma);

Funkcyjne:


public interface Sumator<D> {

     public Integer sumuj(Integer suma, D element);
}

public class Util {

    public static <T> Integer sumuj(Sumator s, List<T> dane) {
        Integer suma = 0;
        for (T element : dane) {
            suma = s.sumuj(suma, element);
        }
        return suma;

    }
}

public final class Produkt {
    public final Integer cena;
    public final String nazwa;

    public Produkt(String nazwa, Integer cena){
        this.nazwa = nazwa;
        this.cena = cena;
    }
}

Produkt p1 = new Produkt("baton z ropą", 10);
Produkt p2 = new Produkt("baton z benzyna", 10);

List<Produkt> produkty = new ArrayList<Produkt>();
produkty.add(p1);
produkty.add(p2);

produkty = java.util.Collections.unmodifiableList(produkty);
Integer suma = Util.sumuj(new Sumator<Produkt>() {

            @Override
            public Integer sumuj(Integer suma, Produkt element) {
                return suma + element.cena;
            }
        }, produkty);

System.out.println(suma);

Czego można dowiedzieć się z tych prostych przykładów ? Otóż można zauważyć w każdym z nich cechy charakterystyczne danego stylu programowania i tego na co kładzie nacisk.

  1. Proceduralny – stawia na swobodny przepływ danych.
  2. Obiektowy – abstrakcja, enkapsulacja, odwzorowanie modelu domeny
  3. Funkcyjny – niezmienność (immutability), generyczność i funkcja jako pełnoprawny element języka (tutaj emulowana przez anonimową klasę)

Mam nadzieje, że powyższe przykłady były pouczające.Jestem bardzo ciekawy, które z powyższych rozwiązań przypadło Wam do gustu i dlaczego, oraz jaki styl preferujecie.

Autor wpisu: widmogrod, dodany: 30.09.2011 22:42, tagi: php, zend_framework

Już w najbliższy czwartek 6 października o godzinie 18:30 odbędzie się w Albotak KrakSpot TECH #6.

Jest to o tyle ciekawe wydarzenie gdyż będę miał przyjemność poprowadzenia już po raz drugi prezentację na KrakSpot TECH. Temat mojej 15 minutowej prezentacji będzie związaną z nadchodzącą odsłoną Zend Framework 2.

Zapraszam wszystkich programistów PHP tworzących swoje aplikacje w ZF będzie dużo fajnych informacji i będzie konkurs z fajnymi mini nagrodami :)

UPDATE: Niestety KrakSpotTECH został odwołany… ale już wiem, że na zaprezentuję informację o ZF2 na nowej konferencji organizowanej w Krakowie! bądźcie czujni! :)

Autor wpisu: cojack, dodany: 28.09.2011 19:36, tagi: php

Aby wykonywać skrypt z KDevelop bezpośrednio należy wejść w menu do Run -> Configure Launchues

Następnie po lewej stronie mamy listę swoich projektów, wybieramy projekt który nas interesuje klikamy na zielony plusik pojawia się pod element naszego projektu: „New Native Application Configuration” albo coś podobnego, po wybraniu tego elementu (nie klikamy w debug) po prawej stronie powinno pojawić się okno z wyborem paru elementów, w Executable wpisujemy php (chyba że chcesz podać bezwzględną ścieżkę do pliku wykonywalnego php. Poniżej mamy Behaviour w Arguments wpisujemy argumenty które chcemy podać do php czyli nazwa pliku php który ma się wykonać np: index.php. Jeszcze niżej jest Working Directory, tutaj wybieramy położenie naszego projektu w którym znajduje się powyżej wybrany plik jako argument. Jeszcze mamy environment, możemy zdefiniować stałe argumenty jakie chcemy przesyłać do php (ja tego nie używam)

Zostaje wcisnąć Apply -> Ok, po zamknięciu okna, należy się upewnić jaki profil uruchamiania jest aktywny, by to zrobić przechodzimy w Menu do Run -> Current Launch Configuration, tam powinniśmy listę dostępnych konfiguracji, dobrym sposobem jest nazywanie ich (zmiana tego „New Native Application Configuration” w poprzednim oknie konfiguracji) jeżeli mamy taką potrzebę, lub też różne konfiguracje do testowania.

Skrót klawiaturowy do uruchomienia to Shit + F9 lub też po prostu kliknąć Execute w oknie KDevelop.

Jak zrobić by KDevelop działał z Debug przy pomocy xdebug, jeszcze nie wiem, ale dev od kdevelop pracują nad tym ;)

Autor wpisu: Wojciech Sznapka, dodany: 27.09.2011 00:34, tagi: php, symfony, symfony2

Today I ran into a little issue: how to pass generic logger object to method? I wanted to get some verbose output from method, which I call from Command, but onc time it should log with Symfony2 OutputInterface and other time it should use monolog logger. Of course I can make some wrapper class for [...]

Autor wpisu: bastard13, dodany: 23.09.2011 14:46, tagi: php

trochę przydługi wstęp...

Jest szereg tutoriali pokazujących jak wykorzystać techniki obiektowe, jak je zastosować w kodzie, ale w większości z nich brak jednej ważnej informacji - OOP to przede wszystkim obiektowe myślenie. Techniki i sposób ich implementacji w danym języku programowania są jak język mówiony i gramatyka, są czymś zmiennym. Natomiast sposób myślenia obiektowego, umiejętność podejmowania decyzji w kwestiach relacji między klasami jest czymś stałym. Nie ważne, czy piszesz kod w PHP, Javie, C++ itp., ponieważ, jeżeli potrafisz poprawnie zaprojektować strukturę, to będzie ona uniwersalna, zmieni się jedynie sposób przetłumaczenia tego na język zrozumiały dla interpretera/kompilatora.A więc o czym to będzie?Właściwie to o tym samym, co wszędzie, czyli podstawy takie, jak: dziedziczenie, interfejsy, abstrakcje, hermetyzacja itd. Z tym, że oprócz przykładu użycia postaram się jeszcze przedstawić tok myślenia, który się za tym kryje. Tak, więc np. w dziedziczeniu nie chodzi tylko o to, że mamy dwie klasy Samochód i Samolot, które dziedziczą po abstrakcyjnej klasie Pojazd:)Postaram się zaprezentować przykłady, kiedy dane rozwiązanie jest niekoniecznie dobre lub całkiem złe.Tak naprawdę najwięcej będzie o myśleniu, bo w gruncie rzeczy do tego OOP się sprowadza. Ostatnim etapem dobrego programowania obiektowego jest pisanie kodu.

programowanie obiektowe - wtf?

Programowanie obiektowe jest to przedstawienie świata rzeczywistego i relacji w nim zachodzących, za pomocą obiektów. Najważniejszymi cechami programowania obiektowego są:
  • Abstrakcja
  • Enkapsulacja
  • Dziedziczenie
  • Polimorfizm
Wszystkie te pojęcia rozwinę w kolejnych wpisach.Dzisiaj skupię się na kwestiach językowych, które są niezbędne do rozpoczęcia zabawy z OOP:

klasa

Klasa jest to typ zmiennej z punktu widzenia programowania, natomiast w ujęciu projektowym jest to ogólna definicja pewnej grupy powiązanych ze sobą obiektów. Klasa definiuje metody, czyli funkcjonalność, które są dostarczane przez obiekty. Poza tym definiuje również atrybuty, które są indywidualne (nie zawsze, ale do tego tematu jeszcze wrócę:) dla konkretnych obiektów. Czym jest obiekt? Jest to instancja danej klasy, czyli konkretna zmienna danego typu. Prosty przykład:Janek, Ania, Zosia to obiekty klasy Człowiek. Każde z nich może spać, jeść, poruszać się i to są właśnie metody zdefiniowane w klasie Człowiek. Oprócz tego każdy człowiek posiada imię oraz datę urodzenia, jednak są one indywidualne dla każdego obiektu, czyli nie są bezpośrednio powiązane z klasą, a z obiektem danej klasyA jak coś takiego napisać?
<?phpclass Human{  private $_name;  private $_birthDate;    public function __construct($name, $birthDate) {/*...*/}  public function eat() {/*...*/}  public function sleep() {/*...*/}  public function move() {/*...*/}}$janek = new Human('Janek', '1982-01-09');$anna = new Human('Anna', '1950-02-19');$zosia = new Human('Zosia', '1999-11-17');
Z informacji dotyczących klasy warto przeczytać jeszcze o operatorach widoczności.

abstrakcja i dziedziczenie

Klasa abstrakcyjna różni się od zwykłej klasy tym, że nie można utworzyć jej instancji. Może ona również dostarczać metod abstrakcyjnych, czyli metod, które zostały zadeklarowane i muszą zostać zdefiniowane w klasach potomnych. Aby to rozjaśnić rozwinę przykład z poprzedniego akapitu:Pomimo iż Janek, Ania i Zosia są obiektami klasy Człowiek, to są pewne różnice charakterystyczne dla grup np. Ani i Zosia mogą urodzić dziecko, ponieważ są Kobietami, natomiast Janek nie doświadczy tego przywileju gdyż jest Mężczyzną. Dodatkowo różni ich też sposób sikania, pomimo tego, że i Kobiety i Mężczyźni to robią. Więc tak naprawdę żadne z nich nie jest tylko Człowiekiem, ale jest albo Kobietą, albo Mężczyznąi kod:
<?phpabstract class Human{  private $_name;

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

Autor wpisu: bigzbig, dodany: 20.09.2011 01:41, tagi: php, mysql

Na początku mojej nauki PHP kupiłem sobie książkę „PHP4 Aplikacje” (Tobiasa Ratschiller i Till Gerken – Wydawnictwo Robomatic). Zawarta w tej lekturze tematyka była wtedy dla mnie zbyt zaawansowana i potem wielokrotnie wracałem do tej pozycji stopniowo dojrzewając do poruszanych w niej tematów. Najdłużej wzbraniałem się przed zgłębieniem wiedzy dotyczącej operacji na bitach. Dzisiaj nie [...]

Autor wpisu: bastard13, dodany: 19.09.2011 15:18, tagi: php

pre { border: #aaa solid 1px; padding: 10px; margin: 5px 5px 15px 5px; font-family: "Courier New",Courier,monospace; background-color: #f9f9f9 !important;}pre span.key_word { color: #006699 !important; font-weight: bold;}pre span.comment { color: #008200 !important;}pre span.variable{ color: #AA7700 !important;}pre span.string{ color: blue !important;}pre span.functions{ color: #FF1493 !important;}p { margin: 0px;}W PHPie istnieją trzy przydatne słowa kluczowe będące referencją do metod oraz atrybutów klas. Wykorzystuje się je przy dziedziczeniu i są to: self, parent, static.Parent odnosi się do metod/atrybutów klasy bazowej:
<?phpclass A {    public function foo() {        return 'class A, method foo()';    }}class B extends A{    public function foo() {        return 'class B, method foo() and parent: ' .                 parent::foo();    }}$object = new B;echo $object->foo();
Powyższy kod dana nam wynik:
class B, method foo() and parent: class A, method foo()
Self odnosi się do metod/atrybutów klasy, które są zdefiniowane w bieżącym kodzie, czyli jeżeli mam klasę A w niej metody foo() i boo(), gdzie chcę, żeby metoda foo() zaimplementowana w klasie A, zawsze odnosiła się do metody boo() z klasy A, nawet jeżeli w klasach potomnych zostanie nadpisana, to właśnie wtedy stosujemy słowo kluczowe self:
<?phpclass A {    public function foo() {        return self::boo();    }    public function boo() {

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

Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.