我有一个叫做Viewer的小班。这个类应该查看每个页面的正确布局或类似的东西......
我有一个名为getFirstPage的方法,当被调用时,此方法的用户将获得当前将页面设置为第一页的设置值。我在这里有一些代码,我认为它有效,但我并不是真的不知道我是以正确的方式做到的:
class Viewer {
private $db;
private $user;
private $firstPage;
function __construct($db, $user) {
$this->db = $db;
if(isset($user)) {
$this->user = $user;
} else {
$this->user = 'default';
}
}
function getFistPage() {
$std = $db->prepare("SELECT firstPage FROM settings WHERE user = ':user'");
$std->execute(array(':user' => $user));
$result = $std->fetch();
$this->firstPage = $result['firstPage'];
return $this->firstPage;
}
}
我的get方法是从数据库中获取设置(到目前为止一直很好?)。问题是,然后我必须使用此get方法来设置私有变量firstPage。看起来我应该有一个set方法来做这个,但我真的没有一个set方法只从数据库中获取一些设置,对吧?因为此对象的用户应该能够假设已经在对象中定义了设置...
我该怎么做?
答案 0 :(得分:1)
我认为你的方法并不差。最重要的是在构造函数中传递$db
。用户可以是构造函数的参数或方法本身,它取决于用户对应用程序的“永久性”。
我会改进几件小事:
private
可见性,请改用protected
。因此,如果有人想扩展您的课程,他仍然可以访问您的房产。public
可见性。这是一个很好的做法,你不会混淆那些默认为package
的Java开发人员。PDO::fetch
可以返回false,您应该在以数组形式访问结果之前检查此错误状态。$firstPage
保存到对象状态,则应在下次调用该方法时重复使用它。但是,如果你编写一个常见的Web应用程序,我认为你真的不想把它放到对象状态。相反,只需返回结果。然后,您的代码将如下所示:
class Viewer {
/** @var PDO $db */
protected $db;
protected $user;
public function __construct(PDO $db, $user = 'default') {
$this->db = $db;
$this->user = $user;
}
public function getFistPage() {
$std = $this->db->prepare("SELECT firstPage FROM settings WHERE user = ':user'");
$std->execute(array(':user' => $this->user));
$result = $std->fetch();
if ($result !== false) {
return $result['firstPage'];
} else {
throw new YourException('Failed to fetch first page.');
// or return false/null;
}
}
编辑:你应该总是在构造函数中完全设置对象状态,你不应该在其中进行任何计算。另外,避免使用类似初始化的方法。在这种情况下,构造函数确保我们设置PDO和$user
参数(对象状态)。然后,您可以在方法中进行计算而不传递其他参数(这很好,它支持对象封装)。
答案 1 :(得分:1)
Getters不应该改变对象的状态。但是,有时成员变量不是实际对象状态的一部分 - 而是用于内部缓存。你应该问自己 - firstPage
是州的一部分吗?该类用户是否应该关心它是否已设置?除了表现之外,对象是否会根据其价值采取不同的行动?如果没有,可以将它设置在吸气剂中。