我正在编写我的第一个对象工厂,我想知道在创建第二个对象时将一个对象传递给另一个对象是否有任何缺点,然后将第一个对象保存在第二个对象中供以后使用?
示例:
class main
{
public $connection = array();
// various other useful functions that should be loaded on every page here
// these other functions would be convenient to have avail for
// new objects in different classes
function dbconnect($db) {
if(!isset($this->connection[$db])) {
switch($db) {
case "users":
$connection = @mysql_connect(info,info,info);
$db_select = @mysql_select_db(info,$connection);
$this->connection[$db] = $connection;
break;
case "ads":
$connection = mysql_connect(info,info,info);
$db_select = mysql_select_db(info,$connection);
$this->connection[$db] = $connection;
break;
default:
die($db . " is not a recognized database.");
break;
}
}
return $this->connection[$db];
}
// note how i pass $this into the new object in this function
function create($class,$params=null) {
if(!class_exists($class) && !$this->load($class)) {
die($class . " is not a recognized class.");
}else{
return new $class($this,$params);
}
}
function load($file) {
$file = $_SERVER['DOCUMENT_ROOT'] . "/classes/" . $file . ".class.php";
if(file_exists($file)) {
return require_once($file);
}else{
return false;
}
}
}
class secondary {
private $connection;
private $mainObj;
private $params;
function __construct($mainObj,$params) {
$this->mainObj = $mainObj;
$this->params = $params;
$this->connection = $mainObj->dbconnect('users');
}
}
正如您在此处看到的,工厂创建的任何类都可以方便地连接到MySQL数据库,如果类需要它(以及其他常用/有用的函数)...无需使用全局变量或传递许多东西英寸
这是一种稳定的方式吗?我是新人,可以使用一些好的理论/学校教育为什么这是错误的 - 如果是的话。
答案 0 :(得分:4)
是的,这是一种非常稳定的方式。但我希望在将外部实例作为参数的方法中看到type hinting,这会使您的类更强。
实施例
class Alob {
public function aMethod(**Blob** $outerObject) {
...
}
}
class Blob {
...
}
如果使用除Blob之外的其他类型调用Alob :: aMethod(),则会抛出致命错误。
我还希望看到更多用于定义可见性的访问者关键字,使用“私有”隐藏您的类私有等等。
答案 1 :(得分:4)
对象传递绝对没有错。如果你有一个ClassB对象需要ClassA的实例化对象才能运行,那么你唯一的选择就是在ClassB中创建ClassA对象,或者传入ClassA。
如果ClassA对象可能被多个ClassB对象使用,就像在您的示例中那样,那么传递ClassA(即数据库连接对象)实际上更多效率高于其他选项,将涉及在每个类中创建的许多重复对象。
由于PHP5会自动通过引用传递对象,因此在secondary
类中设置引用到$mainObj
实际上非常有效。
答案 2 :(得分:2)
其中一个你必须小心,保持一个对象访问DB 的解决方案(这不错;你应该阅读“依赖注入”模式,顺便说一下) ,只要您仍然需要能够访问它,就是不要断开与DB的连接
(是的,似乎很合乎逻辑^^)
我的意思是,可能很容易忘记某处某个对象需要不关闭数据库连接。
简单的方法是永不断开连接 - 无论如何,PHP将自动关闭脚本末尾与数据库服务器的连接。
答案 3 :(得分:2)
这不仅可以,但它实际上是OOP的基石之一,它被称为aggregation