php автозагрузка: дублирование соединения с БД - PullRequest
0 голосов
/ 10 октября 2011

Почему этот класс 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 каталогов.

1 Ответ

1 голос
/ 10 октября 2011

Я бы сказал, что эти числа являются идентификаторами объектов.Это последовательные числа, назначаемые объектам PHP по мере их создания.

В вашем коде объект # 1 - это ваш автозагрузчик, # 2 - ваш database_pdo класс и # 3 - PDO.

...