Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Podmínky v PHP

Ahoj.
Chtěl bych poradit s kódém v PHP-čku. Nevím jak napsat podmínku.

// přiklady URL
$url = 'knihovna';
$url = 'knihovna/cesko';
$url = 'knihovna/cesko/klasika';
$url = 'knihovna/slovensko';
$url = 'knihovna/slovensko/klasika';

// akce na URL
if     ( $url === 'knihovna' )                   new knihovna ();
elseif ( $url === 'knihovna/cesko' )             new knihovna\cesko ();
elseif ( $url === 'knihovna/slovensko' )         new knihovna\slovensko ();
elseif ( $url === 'knihovna/cesko/klasika' )     new knihovna\cesko\klasika ();
elseif ( $url === 'knihovna/slovensko/klasika' ) new knihovna\slovensko\klasika ();

Jenže já bych potřeboval vytvořit daný objekt (vždy pouze jeden) i když za těmi adresami něco ještě bude.

// příklad
$url = 'knihovna/cokoliv-ale-ne-cesko-a-slovenso';      new knihovna ();
$url = 'knihovna/cesko/cokoliv-ale-ne-klasika'          new knihovna\cesko ();
$url = 'knihovna/cesko/klasika/cokoliv';                new knihovna\cesko\klasika ();
$url = 'knihovna/slovensko/cokoliv-ale-ne-klasika';     new knihovna\slovensko ();
$url = 'knihovna/slovensko/klasika/cokoliv';            new knihovna\slovensko\klasika ();

Napadlo mě to celý otočit abych opravdu vytvářel pouze jeden objekt a nevytvářel objektů víc ale stejně nevím jak ty podmínky napsat.

// něco jako
if     ( $url === 'knihovna/cesko/klasika' )     new knihovna\cesko\klasika ();
elseif ( $url === 'knihovna/slovensko/klasika' ) new knihovna\slovensko\klasika ();
elseif ( $url === 'knihovna/slovensko' )         new knihovna\slovensko ();
elseif ( $url === 'knihovna/cesko' )             new knihovna\cesko ();
elseif ( $url === 'knihovna' )                   new knihovna ();

Možná by to šlo uložit do pole ale zase to končí na podmínce. Můžete mi prosím poradit někdo zkušený? Děkuji

Předmět Autor Datum
Netusim presne podle toho popisu co mas za problem, ale "vycucnout" kus retezce dokaze treba substr(…
Dwane Dibbley 03.04.2017 14:33
Dwane Dibbley
Co ti není jasné? já se tak snažil :-)
Lubos58 03.04.2017 14:41
Lubos58
Musis to bud testovat od najprisnejsej po najmenej prisnu a pouzivat elseif, alebo druha moznost je…
MM.. 03.04.2017 15:10
MM..
Díky a jak to je dynamicky a nebo adresami, můžeš nastínit? Díky.
Lubos58 03.04.2017 18:02
Lubos58
Dynamicky je to tak ze si v cykle citas co uz mas v databaze alebo na disku a triedis si to podla to…
MM.. 03.04.2017 18:07
MM..
OK, tak to mám db, array a nějaká další možnost? Co jsi myslel těmi adresami ? P.S.2. a nechapem vy…
Lubos58 03.04.2017 19:05
Lubos58
PS: jinak je to presenter, ale vy to asi znáte spíše pod pojmem controller ;)
Lubos58 03.04.2017 19:06
Lubos58
Neviem co potrebujes robit a kolko tam je tych kategorii, ale ak to ma byt dynamicke tak sa to neda…
MM.. 03.04.2017 19:14
MM..
Třídy bych vytvořil takhle class knihovna { ... } class knihovna_narodni extends knihovna { public…
hynajs 03.04.2017 23:12
hynajs
Takto to mám celý postavený a právě řeším logiku, jak to volat...
Lubos58 04.04.2017 21:52
Lubos58
Buď to môžeš spraviť tak, že budeš kontrolovať všetky možnosti: $parts = explode('/', $url); switch…
los 04.04.2017 19:48
los
Mrknu na tu druhou možnost, pro mě lepší.. zatím díky.. poslední
Lubos58 04.04.2017 21:53
Lubos58

Musis to bud testovat od najprisnejsej po najmenej prisnu a pouzivat elseif, alebo druha moznost je v tej podvetve kde mas if(slovensko) tak tam este testovat dodatocne if klasika elif pop else ostatne a do if pre cesko zasa to iste atd.
Zavisi to od toho jaku realitu sa snazis naprogramovat a jak to chces mat organizovane. Da sa to robit aj dynamicky s dtabazou alebo poliami alebo adresarmi apod. je to tvoja volba.

Dynamicky je to tak ze si v cykle citas co uz mas v databaze alebo na disku a triedis si to podla toho, je to tvoja volba, tvoj navrh, ty vies co od toho programu chces, ne ja. Vyzaduje to uz ale potom seriozne programovanie, to potom neni jedno if.
P.S. ten cyklus som myslel pre podzlozky zo vstupu, ne pre databazu samozrejme...
P.S.2. a nechapem vyznam toho "new knihovna\slovensko\klasika ()" to ma akoze robit co?

OK, tak to mám db, array a nějaká další možnost? Co jsi myslel těmi adresami ?

P.S.2. a nechapem vyznam toho "new knihovna\slovensko\klasika ()" to ma akoze robit co?

Je to clasická třída včetně namespaces, v příkladu bez objektu pro lepší čitelnost...

Třídy bych vytvořil takhle

class knihovna {
  ...

}
class knihovna_narodni extends knihovna {
  public $jazyk;
  ...
}
class knihovna_narodni_druh extends knihovna_narodni {
  public $druh;
  ...
}

$knihovna=new knihovna_narodni_druh();
$knihovna->jazyk="ceska";
$knihovna->druh="klasika";

přičemž poslední dva řádky lze upravit do __construct($pole).
Url bych rozskouskoval a podle počtu a hodnot se rozhodnul, kterou třídu zavolám.

Buď to môžeš spraviť tak, že budeš kontrolovať všetky možnosti:

$parts = explode('/', $url);
switch (array_shift($parts)) {
    case 'knihovna':
        switch (array_shift($parts)) {
            case 'cesko':
                switch (array_shift($parts)) {
                    case 'klasika':
                        return new knihovna\cesko\klasika;
                }
                return new knihovna\cesko;
            case 'slovensko':
                switch (array_shift($parts)) {
                    case 'klasika':
                        return new knihovna\slovensko\klasika;
                }
                return new knihovna\slovensko;
        }
        return new knihovna;
    default:
        return NULL;
}

Alebo budeš zisťovať, či požadovaná trieda existuje:

$class = str_replace('/', '\\', $url);
while (TRUE) {
    if (class_exists($class))
        return new $class;
    $i = strrpos($class, '\\');
    if ($i === FALSE)
        return NULL;
    $class = substr($class, 0, $i);
}

Zpět do poradny Odpovědět na původní otázku Nahoru