一个初学者问题:我不知道如何最好地构造这段代码,但基本上就是这样(伪代码时间):
if (form = submitted) {
submitted();
}
else {
printForm();
}
function submitted() {
process data from form;
if(errors = found) {
print warnings;
printForm();
} else {
submit to database;
}
}
function printForm() {
print form with databound elements;
}
我使用以下代码来创建一个User对象,但是调用它两次似乎很奇怪 - 一次在submitted()
和一次printForm()
,特别是在submitted()
调用之后printForm()
如果发现错误。
不幸的是,从表单处理数据需要数据库访问(检查现有的电子邮件地址等),因此我必须在submitted()
和printForm()
中调用以下代码。
try {
$db = new Database();
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$user = new User($db);
}
catch (PDOException $e) {
echo "<p>Error connecting to database: </p>".$e->getMessage();
}
但我的直觉告诉我这很糟糕。是吗?如果是这样,我该如何解决?
答案 0 :(得分:3)
function submitted(Database $db, User $user) {
// ...
}
function printForm(Database $db, User $user) {
// ...
}
try {
$db = new Database();
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$user = new User($db);
}
catch (PDOException $e) {
echo "<p>Error connecting to database: </p>".$e->getMessage();
}
submitted($db, $user);
printForm($db, $user);
当然,最好使用OOP,因为那时你不必将依赖注入每个函数:
class Foo {
protected $db;
protected $user;
public function __construct(Database $db, User $user) {
$this->db = $db;
$this->user = $user;
}
public function submitted() {
// use $this->db and $this->user here
}
public function printForm() {
// use $this->db and $this->user here
}
}
try {
$db = new Database();
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$user = new User($db);
$foo = new Foo($db, $user);
}
catch (PDOException $e) {
echo "<p>Error connecting to database: </p>".$e->getMessage();
}
$foo->submitted();
$foo->printForm();
答案 1 :(得分:2)
有几种方法可以让这更好......
一个是在函数调用之前初始化$ user并将其注入每个函数(依赖注入)。
另一种方法是创建用户实例的单例(虽然我可以看到这会导致问题)并使用User::instance()
之类的东西检索函数中的实例。
在我看来,依赖注入更好,因为它使您的函数更容易测试。
现在,转到代码的其余部分:
答案 2 :(得分:0)
虽然在某些情况下Singleton模式被认为是邪恶的,但似乎在PHP中(每个请求都有一个单独的工作进程),在您的情况下,它是实现您想要的最简单的方法。
这样您就可以在任何页面上的任何脚本中启动User
的实例,并且您必须在每个项目的一个位置初始化$user
对象(不是每个你想要做的脚本。)