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看起来更能处理这个新问题真的!我将寻找其他更好的解决方案。。。谢谢有一个解决方案,但它是不够通用…请参阅我的编辑上面。谢谢