Въпрос за __autoload ?

macmen

Registered
Здравейте, Използвам __autoload за да си зареждамм всички класове: това е структората


<?php

function __autoload($class_name) {
$dir_include = dirname(__FILE__) . DIRECTORY_SEPARATOR;
$arr = array(
$dir_include,
$dir_include . "models" . DIRECTORY_SEPARATOR,
$dir_include . "controller" . DIRECTORY_SEPARATOR
);
foreach ($arr as $dir) {
if (file_exists($dir . $class_name . '.php')) {
require_once $dir . $class_name . '.php';
}
}
}

?>
но се зарежда само един клас, а не всичките.

Кажете къде е грешката
Благодаря
 
Когато в кода си използваш клас (примерно TestClass), който не е зареден (примерно с include) PHP изважда Fatal Error и спира скрипта.

Когато дефинираш функцията __autoload, тя се извиква точно преди да се извади Fatal Error-а за несъществуващ клас. Тя ти е последното спасение да извикаш класа и да го използваш.

Ето пример:
PHP:
<?php

// ... код ...
$class1 = new TestClass($p1, $p2); // Ще извади Fatal Error

PHP:
</php
function __autoload ($class) { /* код */ }
// ... код ...
$class1 = new TestClass($p1, $p2); // Извиква __autoload и ако и тогава не намери класа, чак тогава изважда Fatal Error

Предполагам при теб възниква проблем и не ти зарежда класа, защото си объркал името на файл, в който се намира класа. Така, както си направил функцията __autoload зарежда файлове със същото име като на класа.
 
Функцията се вика, когато бъде извикан някой от класовете. И няма нужда да въртиш цикъл за това. Просто ползвай if...else за проверка.
 
Мдам, няма смисъл да въртиш цикли вътре във функция. Можеш просто така да я направиш:

PHP:
function __autoload($class_name) {
    require_once($class_name . '.php');
}
 
macmen каза:
всичките файлове не са в енда папка, това е причината да лоопвам foreach-a

Еми пак няма смисъл да тормозиш с цикли. Ползвай if...else . По примера виждам, че имаш само 2 папки, от които да проверяваш дали съществува такъв файл.

PHP:
function __autoload($className) {
	if(file_exists(ROOT . DS . 'library' . DS . strtolower($className) . '.class' . PHP_EXT)) {
		require_once(ROOT . DS . 'library' . DS . strtolower($className) . '.class' . PHP_EXT);
	} 
    else {
        if(file_exists(ROOT . DS . 'application' . DS . strtolower($className) . PHP_EXT)) {
	       require_once(ROOT . DS . 'application' . DS . strtolower($className) . PHP_EXT);
        }
	}
}

Ето как съм го направил аз.
 

Back
Горе