Autoloading - o co chodzi

0

Siema. Mógłby ktoś mi wytłumaczyć, jakie argumenty trzeba podać do funkcji spl_autoload_register() umieszczonej w index.php, żeby można było wywoływać klasy bez używania include/require w innych plikach? Za bardzo nie mogę pojąć tego co jest w manualu.

Znalazłem tylko jedną rzecz i zrobiłem to tak:
set_include_path(implode(PATH_SEPARATOR, array(get_include_path(), './system', './application/controllers')));

Żeby można było wywoływać klasy z powyższych folderów. Zadziałało w tym samym pliku w którym dałem tą deklaracje. Jak w tym pliku wywołałem np. Request::invoke(), to w wywoływanej funkcji już autoloading nie działał, trzeba było includować klasy. Można coś z tym zrobić, żeby wszędzie dało się zastosować autoloading?

0

W miarę stary kod, ale może pomoże.

<?php

final class Loader
{
	private $dir = array();
	
	private static function convertPath($className)
	{
		$path = $className;
		
		$pos = strpos($path, '_');
		if ($pos !== false)
		{
			$_dir = substr($path, 0, $pos+1);
			$_dir = str_replace('_', DIRECTORY_SEPARATOR, $_dir);
			$path = $_dir . $path;
		}
		
		return $path . '.class.php';
	}
	
	public function __construct()
	{
		spl_autoload_register(array($this, 'autoload'));
	}
	
	public function addPath($path)
	{
		if (!is_dir(dirname($path)))
		{
			throw new RuntimeException($path.' is not a valid directory path.');
		}
		
		$this->dir[] = $path;
	}
	
	public function autoload($className)
	{	
		$classFile = self::convertPath($className, $this->dir);
		foreach ($this->dir as $path)
		{
			$path .= $classFile;
			if (file_exists($path))
			{
				require_once($path);
				return true;
			}
		}
		
		return false;
	}
}

Uruchamiasz w ten sposób:

$loader = new Loader();
$loader->addPath('jakas sciezka' . DIRECTORY_SEPARATOR); // tę funkcję możesz wywołać dowolną ilość razy

Działa to tak, że dla klasy Foo dołącza (jeśli istnieje) plik Foo.class.php. W przypadku _ w nazwie zamienia je na separatory katalogów, np. dla klasy Foo_Bar.class.php wyszukuje plik Foo/Foo_Bar.class.php.

0

Ok, dzięki wielkie za pomoc, teraz już wszystko działa...Tylko takie pytanie mam jeszcze co do sposobu działania, z ciekawości - gdyby w klasie była tylko funkcja autoload(), to nie byłaby ona wywoływana przy każdym odwołaniu się do nieznanej klasy? Wywoływanie tej metody autoload() zapewnia to spl_autoload_register(array($this, 'autoload')) w konstruktorze?

1 użytkowników online, w tym zalogowanych: 0, gości: 1