首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这是处理PHP类中的getter/setter的合理方法吗?

这是处理PHP类中的getter/setter的合理方法吗?
EN

Stack Overflow用户
提问于 2008-08-28 12:54:09
回答 8查看 3.9K关注 0票数 8

我将尝试一些与这个问题的格式,我非常开放的建议,以更好的方式来处理它。

我不想仅仅在问题中抛出一堆代码,所以我已经在refactormycode上发布了这个类的代码。

易于处理类属性的基类。

我的想法是,人们可以在这里张贴代码片段,也可以在refactormycode上进行更改,并将链接发回他们的重构。我将在此基础上提出并接受一个答案(假设有一个明确的“赢家”)。

无论如何,对于这个类本身:

我看到很多关于getter/setter类方法的争论,最好是直接访问简单的属性变量,还是每个类都应该定义明确的get/set方法,诸如此类。我喜欢有显式方法的想法,以防以后需要添加更多的逻辑。然后,您就不必修改任何使用该类的代码。然而,我讨厌有这样的一百万个函数:

代码语言:javascript
运行
复制
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魔术方法不会这么做。

这里有一个例子说明了它是如何工作的:

代码语言:javascript
运行
复制
class PropTest extends PropertyHandler
{
    public function __construct()
    {
        parent::__construct();
    }
}

$props = new PropTest();

$props->setFirstName("Mark");
echo $props->getFirstName();

注意,PropTest实际上没有"setFirstName“或"getFirstName”方法,PropertyHandler也没有。所做的就是操纵数组值。

另一种情况是您的子类已经在扩展其他东西。因为在PHP中不可能有真正的多个继承,所以可以使子类作为私有变量拥有一个PropertyHandler实例。您必须再添加一个函数,但是事情会以完全相同的方式进行。

代码语言:javascript
运行
复制
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的好理由是,它使文档变得非常困难。

事实上,使用任何类型的文档生成工具基本上是不可能的,因为没有文档化的显式方法并不存在。

我现在已经放弃了这种方法。这是一个有趣的学习练习,但我认为它牺牲了太多的清晰度。

EN

Stack Overflow用户

发布于 2008-08-28 14:14:57

@Brian

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.

不完全是这样的。举我的第一个例子:

代码语言:javascript
运行
复制
class PropTest extends PropertyHandler
{
    public function __construct()
    {
        parent::__construct();
    }
}

$props = new PropTest();

$props->setFirstName("Mark");
echo $props->getFirstName();

假设我需要添加一些逻辑来验证FirstNames。我所要做的就是向子类中添加一个setFirstName方法,然后自动使用该方法。

代码语言:javascript
运行
复制
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处理这个问题的方式(我的实现只是一个笨拙的剥离)。

票数 3
EN
查看全部 8 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档