Почему этот класс autoload
дублирует соединение БД?
class autoloader
{
private $directory_name;
public function __construct($directory_name)
{
$this->directory_name = $directory_name;
}
public function autoload($class_name)
{
$file_name = 'class_'.strtolower($class_name).'.php';
$file = AP_SITE.$this->directory_name.'/'.$file_name;
if (file_exists($file) == false)
{
return false;
}
include ($file);
}
}
# nullify any existing autoloads
spl_autoload_register(null, false);
# specify extensions that may be loaded
spl_autoload_extensions('.php, .class.php, .lib.php');
# instantiate the autoloader object
$classes_2 = new autoloader('classes');
# register the loader functions
spl_autoload_register(array($classes_2, 'autoload'));
$connection = new database_pdo(DSN,DB_USER,DB_PASS);
var_dump($connection);
результат
object(database_pdo)[2]
protected 'connection' =>
object(PDO)[3]
Класс соединения с БД находится в папке с именем 'classes',
class database_pdo
{
# database handler
protected $connection = null;
# make a connection
public function __construct($dsn,$username,$password)
{
try
{
# MySQL with PDO_MYSQL
$this->connection = new PDO($dsn, $username, $password);
$this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e)
{
# call the get_error function
$this->get_error($e);
}
}
...
# closes the database connection when object is destroyed
public function __destruct()
{
# set the handler to NULL closes the connection propperly
$this->connection = null;
}
}
Как я могу исправить эту ошибку?
EDIT:
результат должен быть,
object(database_pdo)[1]
protected 'connection' =>
object(PDO)[2]
В результате я получаю выше только в том случае, если не использую класс autoloader
, поэтому я думаю, что должно быть что-то, что я сделал неправильно в коде класса autoloader
.
Но я не знаю, какая строка неправильная ...
EDIT:
Если я использую print_r
,
print_r($connection);
Результат,
Object ( [connection:protected] => PDO Object ( ) )
EDIT:
Я получаю еще больше «дубликатов», если я использую этот автозагрузку класс от кого-то другого,
object (database_pdo) [11] защищенное 'соединение' =>
Объект (ПДО) [13] * * тысяча сорок шесть
EDIT:
function __autoload($class_name)
{
include AP_SITE."classes_1/class_".$class_name.".php";
}
$connection = new database_pdo(DSN,DB_USER,DB_PASS);
var_dump($connection);
результат,
object(database_pdo)[1]
protected 'connection' =>
object(PDO)[2]
но я получу ошибку, если захочу загрузить классы из других каталогов,
function __autoload($class_name)
{
include AP_SITE."classes_1/class_".$class_name.".php";
include AP_SITE."classes_2/class_".$class_name.".php";
}
сообщение
Внимание:
включают в себя (С: /wamp/www/art_on_your_doorstep_2011_MVC/global/applications/CART/classes_2/class_database_pdo.php)
[function.include]: не удалось открыть поток: нет такого файла или каталога
в ...
что относится к этой строке - include AP_SITE."classes_2/class_".$class_name.".php";
EDIT:
Этот работает так, как я ожидал,
function system_autoload($class) {
// $class = str_replace('_', '/', strtolower($class.'.php'));
if(file_exists(AP_SITE.'classes_1/class_'.$class.'.php')) {
include_once(AP_SITE.'classes_1/class_'.$class.'.php');
} else if(file_exists(AP_SITE.'classes_2/class_'.$class.'.php')) {
include_once(AP_SITE.'classes_2/class_'.$class.'.php');
}
}
spl_autoload_register('system_autoload');
Но это не универсально, поскольку я дублирую код внутри, когда у меня более 2 каталогов.