NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Mezinárodní den IT společnosti je tady! Pouze nyní můžeš získat 90 % extra kreditů při nákupu od 1199 kreditů s promo kódem AJTACI90. Tak neváhej!

Diskuze: file_exists chyba

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Jak se ti líbí článek?
Před uložením hodnocení, popiš prosím autorovi, co je špatněZnaků 0 z 50-500
Jak se ti kurz líbí?
Tvé hodnocení kurzuZnaků 0 z 50-500
Aktivity
Avatar
martinkobelka
Tvůrce
Avatar
martinkobelka:30.12.2012 12:04

Zdravím

Zjišťuji, jestli soubor existuje, ale zobrazuje se mi chyba

Warning: file_exists() expects parameter 1 to be a valid path, string given in C:\Program Files (x86)\EasyPHP-12.1\www\kontro­lery\smerovac­.php on line 16

část kodu vypadá takhle

if(file_exists("kontrolery/$kontroler.php")){
       $this->kontroler = new $kontroler;
}
 
Odpovědět
30.12.2012 12:04
Avatar
Kit
Tvůrce
Avatar
Odpovídá na martinkobelka
Kit:30.12.2012 12:52

Doporučuji funkci file_exists() k tomuto účelu nepoužívat. Je zbytečné se ptát na existenci souboru s třídou před vytvářením instance a je to vlastně i špatně.

Nahoru Odpovědět
30.12.2012 12:52
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:30.12.2012 13:26

V PHP to dost dobře jinak nejde, jedině handlovat ten fatal error co vyvolá autoloader a to nebylo úplně průzračné. Funkce file_exists() se samozřejmě indexuje, takže to není ani pomalé. Spíše by mě zajímalo, proč mu to nejede, Máš nějaký nápad?

Nahoru Odpovědět
30.12.2012 13:26
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:30.12.2012 13:34

Že nejde? Tak si zkus tohle:

<?php
function __autoload($class) {
    if (!@include("$class.class.php")) throw new Exception("Třída $class neexistuje");
}

try {
    $a=new NonExistClass();
    echo "OK\n";
} catch (Exception $e) {
    echo $e->getMessage()."\n";
}
Nahoru Odpovědět
30.12.2012 13:34
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:30.12.2012 13:49

Ten zavináč mě nenapadl, dík :)

Nahoru Odpovědět
30.12.2012 13:49
New kid back on the block with a R.I.P
Avatar
martinkobelka
Tvůrce
Avatar
Odpovídá na martinkobelka
martinkobelka:30.12.2012 13:57

Už jsem to vyřešil tak, že jsem prohnal proměnou s názvem objektu funkci trim. Musely tam být bílé znaky.

 
Nahoru Odpovědět
30.12.2012 13:57
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:30.12.2012 14:01

Přišel jsem na to tak, že jsem kombinoval "@" a "include/require". A jedna z těch kombinací udělala přesně to, co jsem potřeboval. @include() vrací při neúspěchu false a nedělá nic víc.

Jinak je dost nebezpečné vytvářet objekty podle názvu z dat od uživatele.

Nahoru Odpovědět
30.12.2012 14:01
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na martinkobelka
Kit:30.12.2012 14:22

Pokud proměnnou $kontroler bereš z URL, je dobré ji ošetřit, např.

$kontroler=basename($kontroler);
Nahoru Odpovědět
30.12.2012 14:22
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.