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

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
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... nový
Lubos58 04.04.2017 21:52
Lubos58
Buď to môžeš spraviť tak, že budeš kontrolovať všetky možnosti: $parts = explode('/', $url); switch… nový
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

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