Lei av å inkludere hauger av klassefiler i PHP? Prøv __autoload!

Obs! Autload fungerer kun i PHP5

Autoload er en funksjon som kalles ved bruk av en udefinert klasse eller interface.

Eks:

<?php
function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj = new MyClass1();
$obj2 = new MyClass2();
?>

Høres dette skummelt ut? Som alltid bør slike funksjoner brukes med fornuft.
Her er et par ting å tenke på:

  • Vurder å vaske $class_name-parameteren. For å minimere hacker-muligheter.
  • Feil kan ikke fanges med catch inne i __autoload-funksjonen.

Tenk også på kodens lesbarhet. I noen tilfeller kan include være nyttig for å synliggjøre avhengighet til visse klasser.

Selv bruker jeg autoload på løse avhengigheter som f.eks Log, Profiler eller Cache-klassene, men lar include gjerne stå ved sterke knytninger.

Her er min autoload-funksjon med whitelist-vasking av $class_name parameteren:

function __autoload($class_name) {

	// Whitelist-vasking
	$class_name = preg_replace( "/[^a-zA-Z0-9_]/", "", $class_name );

	// Sjekk etter filene i alle include-kataloger
	$include_path_tokens = explode(':', get_include_path() );

	// Aktuelle underkataloger
	$dirs = array("classes","models","controllers");

	foreach($include_path_tokens as $prefix){

		if ($prefix==".")
		continue;

		foreach($dirs as $dir){
			$path = $prefix . '/'.$dir.'/' . $class_name . '.php';
			if(file_exists($path)){
				require_once $path;
				return;
			}
		}
	}
}

Les mer om autoload i PHP-dokumentasjonen.


posted by andreeide October 27, 2008 12:30 pm     |     read comments (0)

Leave a Reply