我期待一个很好的模式来创建绑定到数据库的对象。我将用一个简单的例子来说明我的想法:创建用户。
第一:创建/加载用户的工厂方法。用户配置在新创建的实例中完成。
$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(), ...);
所以,我真正的问题是,最好的模式是什么?我知道这可能太相对了,但我需要一些提示,当然,我想将依赖关系留在外面,而不是硬编码在对象内部。
提前致谢。