我期待一个很好的模式来创建绑定到数据库的对象。我将用一个简单的例子来说明我的想法:创建用户。
首先:创建/加载用户的工厂方法。用户配置在新创建的实例中完成。
$user = User::Create($db); // Flag the instance to create an user when save() is called
$user->setUsername('...');
$user->set...;
$user->save(); // Will insert a new user into the database.
...
$user = User::Load($db, id); // Load an user from the database. Flag object to update.
$user->setUsername('...'); // Change username.
$user->save(); // Update existing object instead of inserting a new one.
第二种:立即创建新用户的工厂方法。
User::Create($db, $username, $password, ...); // Create and insert a new user.
...
$user = User::Load($db, 1);
$user->setUsername("..."); // Change username.
$user->save(); // Save only updates a user, no flag needed because an user is entirelly created by User::Create().
第三步:使用具有静态工厂方法的工厂类。
Factory::newUser($db, $username, $password, ...); // May contain many other types of objects.
我可以做到这样的事情:
$factory = new Factory($db);
$user = $factory->newUser($username, $password, ...);
另一件事是,我应该创建一个单例来提供数据库的句柄,该数据库将在应用程序上用于创建对象(不对对象内部的句柄进行硬编码)吗?
示例:
class DB {
public static function handle() { /* Do a lazy connection to a database once. */ }
}
...
$user = User::Create(DB::handle(), ...);
所以,我真正的问题是,什么是最好的模式?我知道这可能太相对了,但我需要一些提示,当然,我想将依赖关系留在外面,而不是在对象内部硬编码。
提前致谢。