【发布时间】:2010-09-07 02:59:07
【问题描述】:
我将尝试使用这个问题的格式,我非常愿意接受有关更好的处理方法的建议。
我不想只是在问题中转储一堆代码,所以我已在refactormycode 上发布了该课程的代码。
base class for easy class property handling
我的想法是人们可以在此处发布代码 sn-ps 或在 refactormycode 上进行更改并将链接发布回他们的重构。我会在此基础上投票并接受答案(假设有明确的“赢家”)。
无论如何,到班级本身:
我看到很多关于 getter/setter 类方法的争论,是直接访问简单的属性变量更好,还是每个类都定义了明确的 get/set 方法,等等等等。我喜欢使用显式方法的想法,以防您以后必须添加更多逻辑。然后您不必修改任何使用该类的代码。但是我讨厌有一百万个看起来像这样的函数:
public function getFirstName()
{
return $this->firstName;
}
public function setFirstName($firstName)
{
return $this->firstName;
}
现在我确定我不是第一个这样做的人(我希望有人可以向我建议更好的方法)。
基本上,PropertyHandler 类有一个 __call 魔术方法。任何通过 __call 以“get”或“set”开头的方法都会被路由到将值设置或检索到关联数组中的函数。进入数组的键是获取或设置后调用方法的名称。所以,如果进入__call的方法是“getFirstName”,那么数组键就是“FirstName”。
我喜欢使用 __call,因为它会自动处理子类已经定义了“getFirstName”方法的情况。我的印象(我可能错了)是 __get 和 __set 魔术方法不这样做。
下面是它如何工作的示例:
class PropTest extends PropertyHandler
{
public function __construct()
{
parent::__construct();
}
}
$props = new PropTest();
$props->setFirstName("Mark");
echo $props->getFirstName();
注意,PropTest 实际上没有“setFirstName”或“getFirstName”方法,PropertyHandler 也没有。所做的只是操作数组值。
另一种情况是您的子类已经在扩展其他内容。由于您在 PHP 中不能拥有真正的多重继承,因此您可以让您的子类将 PropertyHandler 实例作为私有变量。您必须再添加一个功能,但事情的行为方式完全相同。
class PropTest2
{
private $props;
public function __construct()
{
$this->props = new PropertyHandler();
}
public function __call($method, $arguments)
{
return $this->props->__call($method, $arguments);
}
}
$props2 = new PropTest2();
$props2->setFirstName('Mark');
echo $props2->getFirstName();
注意子类如何有一个 __call 方法,它只是将所有内容传递给 PropertyHandler __call 方法。
反对以这种方式处理 getter 和 setter 的另一个很好的论据是它很难记录。
事实上,基本上不可能使用任何类型的文档生成工具,因为不存在不记录的显式方法。
我现在几乎已经放弃了这种方法。这是一个有趣的学习练习,但我认为它牺牲了太多的清晰度。
【问题讨论】:
-
出于好奇,你现在用什么方法?
-
在同一个类中拥有 getter 和 setter 表明该类缺少其代码。调查使用类的 getter 和 setter 的代码并将其移动到类中,因为这是它所属的地方。