我将尝试一些与这个问题的格式,我非常开放的建议,以更好的方式来处理它。
我不想仅仅在问题中抛出一堆代码,所以我已经在refactormycode上发布了这个类的代码。
易于处理类属性的基类。
我的想法是,人们可以在这里张贴代码片段,也可以在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的好理由是,它使文档变得非常困难。
事实上,使用任何类型的文档生成工具基本上是不可能的,因为没有文档化的显式方法并不存在。
我现在已经放弃了这种方法。这是一个有趣的学习练习,但我认为它牺牲了太多的清晰度。
发布于 2008-08-28 14:14:57
My problem with this is that adding "more logic later" requires that you add blanket logic that applies to all properties accessed with the getter/setter or that you use if or switch statements to evaluate which property you're accessing so that you can apply specific logic.
不完全是这样的。举我的第一个例子:
class PropTest extends PropertyHandler
{
public function __construct()
{
parent::__construct();
}
}
$props = new PropTest();
$props->setFirstName("Mark");
echo $props->getFirstName();假设我需要添加一些逻辑来验证FirstNames。我所要做的就是向子类中添加一个setFirstName方法,然后自动使用该方法。
class PropTest extends PropertyHandler
{
public function __construct()
{
parent::__construct();
}
public function setFirstName($name)
{
if($name == 'Mark')
{
echo "I love you, Mark!";
}
}
}I'm just not satisfied with the limitations that PHP has when it comes to implicit accessor methods.
我完全同意。我喜欢Python处理这个问题的方式(我的实现只是一个笨拙的剥离)。
https://stackoverflow.com/questions/32145
复制相似问题