Autor Zpráva
lopikol
Profil
Npsal jsem si třídu a funkci na načítání tříd a zaregistroval jí pomocí:
spl_autoload_register()


Nyní mám ale takový problém. Třída je tvořena takto:

 if (file_exists(DIR . '/' . $className . '.php')) {
	                                 
 require_once (DIR . '/' . $className . '.php');} 


Přijde mi to dost naprd, jelikož díky tomu musí být všechny třídy ve složce DIR a né např v DIR/Database/.

Mohl bych tedy poprosit o nějakou ideo jak to řešit lepé? Např nešlo by to lépe přes namespace?

Vytvořil bych si nějaké pole, kde bych definoval namespace a adresu k souboru a ten by se načetl.

'Database\Connection' => '/Database/Connect.php'


Pokud by to tak šlo, pomohl by někdo toto uvédst do praxe? Zkoušel jsem na téma loader něco hledat, ale většinou je to řešeno způsobem, který nehci.

Děkuji.
YoSarin
Profil
lopikol:
třídy můžeš mít pojmenované třeba 'Database_Connection.php' a v autoloaderu nahradíš '_' za DIRECTORY_SEPARATOR -> dostaneš to co chceš (Database/Connection.php)
Nox
Profil
lopikol:
Doctrine2 classloader? https://github.com/doctrine/common/blob/master/lib/Doctrine/Common/ClassLoader.php#L140

prakticky to snad není nějaký horor... změníš \ na / a je to

ještě jsem dočetl:
nemusíš si dělat pole, to je zbytečné - právě když máš takový pevný systém, tak je to zbytečné ... pokud vim tak do registrované funkce jde fully qualified name, takže jen změníš \ na /, prefixneš základní cestu a sufixneš ".php" (tyhle dvě už máš) a načteš

YoSarin:
už snad máme namespacy ;) co navrhuješ je o krok zpět za lopikolem
YoSarin
Profil
Nox:
To máme, ale já je ještě k ničemu nepoužil :) Tenhle systém mám zažitý a zatím jsem neměl důvod ho měnit :)
lopikol
Profil
Nox: Díky vrhnu se na to, kdyby něco, tak ještě napíšu. Jinak použiju to pole, jelikož bez něj by to bylo tak, že namespace = soubor a v některých případech mi to přijde zbytečné (např., když se jedná o abstract class)
lopikol
Profil
Mám takovou pokusnou třídu. Ale končí to chybou:
Notice: Undefined variable: this
Pokud $this vyměnim za AutoLoader, tak to jde.
Proč $this nejde použít?

class AutoLoader {

 	 public static function autoload($class){

		//...........
	}  

 	 public static function register(){

		spl_autoload_register(array($this, 'autoload'));
	}  
}

YoSarin
Profil
lopikol:
Protože jsi ve statické metodě a tam žádné $this neexistuje... zkus 'self' nebo 'static' (?)

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:

0