Autor Zpráva
phobos9007
Profil
Ahoj,

Postupně přecházím ve svých projektech na 5.3.0 a vyzkoušel jsem novou třídu finfo. Zdá se, že funguje, ale mám problém v cestě k checkovanému souboru.

Problematika: Chci ke každému soubor v adresáři připsat jeho MIME

Způsob:

$handle=dir(".");
while($file=$handle->read())
			{
				if($file=="." or $file=="..")continue;
				
				$finfo=new finfo(FILEINFO_MIME_TYPE);
				$this->mimeType=$finfo->file($file);
				echo $this->mimeType;
			}


Vrací: Warning: finfo::file() [finfo.file]: File or path not found 'soubor.pripona' in C:\wamp\www\jupiterusframework\upload.php on line 19

Přičemž, když místo $file zapíšu ručně C:\wamp\www\projects\upload\soubor.pripona vše funguje.
Moje otázka tudíž zní, kde třída hledá ty soubory relativně uvedené?

Moderátor Majkl578: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
fuckin
Profil
$this->mimeType=$finfo->file(dirname(__FILE__).'/../projects/upload/soubor.pripona');
phobos9007
Profil
fuckin:
Funguje, díky moc, ale co v případě, když si klient dá adresář s frameworkem na svém serveru úplně někam jinam (a odkáže include_path v php.ini jak je zvykem)?
S tím souvisí i otázka, proč, když do stejné třídy vkládám parametr $dir a uvedu ".", skript bere adresář, ve kterým se nachází soubor s includovanou třídou, ovšem když ve stejné třídě chci použít $file, skript bere adresář třídy?

Majkl578:
Dík za edit, odteď budu
fuckin
Profil
phobos9007:
Moc to nechapu. Mozna kdybys to rozkouskoval do nekolika samostatnych vet tak by to bylo citelnejsi.

Dirname(__FILE__) ti vrati aktualni adresu skriptu, neni problem v tomto?
phobos9007
Profil
Dobře, zkusím to napsat srozumitelněji. To Dirname(__FILE__) jsem pochopil (a znám to).

Jde o to, že použitím
dirname(__FILE__)."/../projects/upload/".$file
vytvořím absolutní cestu od frameworku (třídy) k adresáři upload. Ale otázka je, co když si klient dá adresář s frameworkem na svém serveru úplně někam jinam (a odkáže include_path v php.ini jak je zvykem)? Pak už nebude platit "/../projects/upload" ale třeba "/../../upload" atd. Je nepřípustné, aby sám měnil obsah skriptů.
S tím souvisí fakt, když zadám funkci
dir
parametr
"."
a ta funkce je v třídě (frameworku), vždycky se dirne ten adresář, ve kterým se nachází ten soubor, který tu danou třídu implementuje, nikoliv adresář třídy samé. Tak proč to samé neplatí pro funkci
$finfo->file
, která hledá soubory v adresáři, kde se nachází daná třída a nikoliv soubor, který ji implementuje? Tudíž místo
dirname(__FILE__)."/../projects/upload/".$file
zapsat pouze
$file
jak jsem uvedl v [#1]
AM_
Profil
Vůbec bych se nebál toho vykašlat se na PHP include_path, nechat klienta pouze requirovat nějaký loader toho frameworku a na všechny soubory kromě loaderu se odkazovat relativně vůči umístění loaderu, jako to má například Nette.
Myslím, že k tomu jsou hned dva důvody:
- klienti to uvítají, protože je často mnohem snazší upravit nějakou konstantu, která určuje, kde framework je, než upravovat nastavení apache
- ne všichni klienti bývají pány svých serverů a tuto možnost tedy nemusí mít vůbec
- v poslední době vídám v profesionálně napsaných skriptech právě relativní odkazování vůči umístění souboru přes dirname(__FILE__) a docela to chápu, protože magie, jakou PHP hledá odkazované soubory, je dost zvláštní a nešikovná a vývojáři s ní nechtějí mít nic společného.
Mastodont
Profil
phobos9007:
No, já bych dirname(__FILE__) volal v index.php a uložil si to jako ROOT konstantu, kterou bych pak používal všude jinde, samozřejmě za předpokladu, že se nebude šoupat s adresáři (proč taky).
phobos9007
Profil
Děkuji vám, s tou magií je to pravda, někdy je to docela zvláštní. Asi upustím od include_path a začnu to řešit více uživatelsky.
Rozhodně jsem rád, že to teď pojede dobře ba líp ;)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: