Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php自动加载:复制数据库连接_Php_Oop_Pdo_Autoload - Fatal编程技术网

php自动加载:复制数据库连接

php自动加载:复制数据库连接,php,oop,pdo,autoload,Php,Oop,Pdo,Autoload,为什么这个自动加载类会复制数据库连接 class autoloader { private $directory_name; public function __construct($directory_name) { $this->directory_name = $directory_name; } public function autoload($class_name) { $file_name

为什么这个
自动加载类会复制数据库连接

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]
db连接类位于名为“类”的文件夹中

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;
    }
}
我怎样才能纠正这个错误

编辑:

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]
如果我不使用
autoloader
类,我只会得到上面的结果,因此我认为
autoloader
类的代码中一定有我做错了什么

但我不知道哪一行是错的

编辑:

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);
如果我使用
print\r

print_r($connection);
结果,

Object ( [connection:protected] => PDO Object ( ) )
编辑:

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);
如果我被其他人使用这个类,我会得到更多的“副本”

对象(数据库_pdo)[11]受保护的“连接”=> 对象(PDO)[13]

编辑:

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";
}
信息

警告: 包括(C:/wamp/www/art_on_your_doorstep_2011_MVC/global/applications/CART/classes_2/classes_database_pdo.php) [函数.include]:无法打开流:没有这样的文件或目录 在

这是指这一行-
包括AP_站点。“classes_2/CLASSE_”。$CLASSE_名称。“.php”

编辑:

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);
这一个像我预期的那样工作

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');

但它根本不是通用的,因为当我有两个以上的目录时,我会在其中复制代码。

我猜,这些数字是对象ID。这些是PHP对象实例化时分配给它们的序列号


在您的代码中,对象#1是您的自动加载程序,对象#2是您的
数据库pdo
类,对象#3是
pdo

自动加载=/=new。使用autoload,您可以创建一个、两个甚至一百个连接对象。所以复制连接对象的不是自动加载函数,而是你的代码。对不起,复制品在哪里?@Phil请看我上面的编辑。谢谢。@lauthiamkok您使用的是什么版本的PHP?我的
var\u dump()
结果看起来不是这样的。我得到的格式类似于
object(class)#id(propertyCount)
。我认为您可能误解了
var_dump()
@Phil的结果。我的PHP版本是5.3.4。在5.2.x上运行时,我的
var_dump()
将返回如下结果-
object(class)#id(propertyCount)
。@lauthiamkok这现在是一个完全不同的问题。你原来的autloader看起来更能处理这个新问题真的!我将寻找其他更好的解决方案。。。谢谢有一个解决方案,但它是不够通用…请参阅我的编辑上面。谢谢