Portál AbcLinuxu, 27. července 2025 07:15


Dotaz: Jak zavolat třídu v PHP podle zadané url

20.3.2017 19:30 Libor
Jak zavolat třídu v PHP podle zadané url
Přečteno: 349×
Odpovědět | Admin
Ahoj chlapy, potřeboval bych poradit s částí kódu v PHP.

v proměnné $_GET['url'] mám uloženou vždy celou url
echo $_GET['url'];
vypíše
/katalog/priroda-cr/voda-sladka/ryby-male
a potřebuji z této url vytvořit nový objekt třídy včetně namespace
$obj = new \Controls\Katalog\PrirodaCr\VodaSladka\RybyMale ();
Pokud třída neexistuje zavolat
$obj = new \Controls\Error404 ();
Poradil by mi prosím někdo jak to jednoduše udělat? Předem děkuji za pomoc.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

21.3.2017 06:52 frr | skóre: 34
Rozbalit Rozbalit vše Re: Jak zavolat třídu v PHP podle zadané url
Odpovědět | | Sbalit | Link | Blokovat | Admin

Nevím jestli jednoduše, a navíc nejsem PHPkář, spíš jsem se kdysi trochu hrabal pod sukněma Perlu... vidím to rámcově takto:

  1. kontrola vstupních dat = rozparsovat si to URL a převést si ho na striktní výčet možností ("enum"), jako že modul 1/2/3/ nebo chyba. Použil bych třeba regulární výrazy a/nebo řetězcové porovnání v kombinaci s rozskokem ve stylu switch/case nebo if-then-else. Tzn. začít hezky defenzivně.
  2. Návazně na to by se dala přímo v PHP zdrojáku vytvořit instance té či oné třídy, hezky explicitně, možná přímo v tom switch/case bloku.
  3. Pokud dáváte přednost životu na hraně, asi by se to URL dalo stringovými operacemi přežvejkat až na "cestu ke třídě" a tu pak předhodit funkci eval() - ale té funkci musíte podle mého předat určitý minimální blok kódu, který má nějakou hlavu a patu. V zásadě nejmíň "jeden ucelený řádek imperativního zdrojáku", pokud se nepletu. A hlavně pozor na kontrolu vstupních dat, abyste si nezavlekl do programu bezpečnostní díru (code injection).

[:wq]
21.3.2017 08:01 blondak | skóre: 36 | blog: Blondak | Čáslav
Rozbalit Rozbalit vše Re: Jak zavolat třídu v PHP podle zadané url
Odpovědět | | Sbalit | Link | Blokovat | Admin
něco jako,....
$class = '\Controls'.preg_replace_callback('/([-\/])(.)/', function($a){ return ($a[1]=='/'?'\':'').strtoupper($a[2]);}, $_GET['url']);
if (class_exists($class)){
	$obj = new $class();
} else {
	$obj = new \Controls\Error404();
Každý problém ma své logické, snadno pochopitelné nesprávné řešení.
22.3.2017 14:56 frr | skóre: 34
Rozbalit Rozbalit vše Re: Jak zavolat třídu v PHP podle zadané url
Dal bych fajfku že "řešení", ale nemám na čem otestovat :-) Díky za krásný insider snippet.
[:wq]
23.3.2017 00:01 OldFrog {Ondra Nemecek} | skóre: 36 | blog: Žabákův notes | Praha
Rozbalit Rozbalit vše Re: Jak zavolat třídu v PHP podle zadané url
Odpovědět | | Sbalit | Link | Blokovat | Admin
K čemu to má sloužit? Nevím jestli je dobrý nápad mít pro každé zvíře jednu třídu :-)
-- OldFrog

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.