Obiekt do przechowywania preferencji/zestawu danych

Z PHP kontakt miewam sporadycznie, ostatnio jakoś pod koniec 2007 roku, ale czasem trzeba. Potrzebuję przechować uporządkowane dane. Nie jest ich wiele, kilkanaście sztuk, pewnie nigdy więcej niż 20-30. Podpinanie w tym celu bazy danych wydaje się bez sensu, szczególnie, że jest to kompletnie adynamiczne.

Potrzebuję dostać się do danych posiadając na wejściu albo numer kolejny albo nazwę którą dostaję z GET(); Nie chciałbym wynajdować koła od początku, zmajstrowałem coś takiego:


class PortfolioItem
{
    public  $id          = array(); // numer kolejny
    public  $name        = array(); // krótka nazwa z $sub_category
    private $description = array(); // opis linku w leftbox
    private $photos      = array(); // liczba zdjęć

    public function setData( $id, $name, $description, $photos )
    {
        $this->id[$name]        = $id;
        $this->name[$id]        = $name;
        $this->description[$id] = $description;
        $this->photos[$id]      = $photos;
    }

    public function getDescription ( $index )
    {
        if ( is_int( $index ) )
            return $this->description[ $index ];
        else
            return $this->description[ $this->id[ $index ] ];
    }

    public function getPhotos ( $index )
    {
        if ( is_int( $index ) )
            return $this->photos[ $index ];
        else
            return $this->photos[ $this->id[ $index ] ];
    }
}

$test = new PortfolioItem;

$test->setData( 1, 'biuro_Alces', 'Budynek administracyjno biurowy firmy Alces w Tłokonii Kościelnej', 4);
$test->setData( 2, 'biuro_Intermarche', 'Budynek administracyjno biurowy firmy Intermarche w Poznaniu', 13);

print "<pre>";
print $test->getDescription( 1 );
print "\n";
print $test->getDescription( 'biuro_Intermarche' );
print "\n";
print_r ($test);
print "</pre>";

to generalnie wydaje się działać jak powinno (wydaje się, bo nie zacząłem jeszcze tego cudactwa używać), ale jak mówię nie chciałbym wynajdować koła od początku byłbym więc wdzięczny za krytykę od ludzi którzy z PHP są na bieżąco, bo ja gapię się po prostu w manual i klepię co mi ślina na palce... :D

2 lata, 3 miesiące temu | edytowane przez: wariat 1432110

  • Możesz to zrobić trochę inaczej i da Ci to nawet większe pole manewru w przyszlości. Klasę PortfolioItem przerabiasz tak, aby przechowywała dane pojedyńczego wpisu (czyli pola nie sa tablicami tylko konkretnymi wartościami). Potem tworzysz druga klasę, PortfolioRepository, która zawiera tablicę obiektów PortfolioItem. W tej klasie robisz metodę getItem i setItem, które służą do zarządzania wewnętrzną tablicą obiektów PortfolioItem. Takie rozwiązanie wymaga napisania większej ilości kodu, ale jeśli kiedyś okaże się, że dane bedą dynamiczne to zmiana klasy PortfolioRepository wystarczy, cała reszta kodu bez zmian

  • Dobrze jest. Jak działa i wiesz, kiedy trzeba będzie przerzucić się na bazkę danych to spokojnie można użyć takiego sposobu.

  • Dodam jeszcze, że jeżeli chcesz cos dostawac poprzez GET i chcesz sprawdzic warunek if ( isint( $index ) ) to ten if bedzie Ci zwracal false, bo dane pobrane przez _GET sa typu tekstowego, musisz to sobie zrzutowac do inta

    $zmienna = $_GET['costam']; $zmienna = (int)$zmienna;

  • Całkiem zgrabnie. Pola id i name też możesz zrobić private, poza tym pole name wydaje się być nadmiarowe, a przynajmniej w przykładzie, który zaprezentowałeś do niczego go nie używasz.

  • Jeśli to nie jest baza tylko taki tam sobie obiekt t musisz go tworzyc przy kazdym przebiegu skryptu, bo tak czy siak takeigo obiektu w sesji przechowac sie nie da. A skoro tak to nawet przy kilkudziesieciu polach takiej a'la bazy danych obciazenie moze byc duuuuzo wieksze niz wyslanei jednego selecta.

    Tak czy siak jak ktos tu juz zauwazyl, konstrukcja sama w sobie nawet zgrabna, nie mozna powiedziec ze ten fragmencik jest jakis brzydki.

Zaloguj się, aby dodać swoją odpowiedź