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

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

Stack Overflow用户
提问于 2019-06-21 01:04:16
回答 2查看 0关注 0票数 0

我将尝试使用这个问题的格式,我非常愿意接受有关更好的方法来处理它的建议。

我不想只是在问题中转储一堆代码,所以我已经发布了该类的代码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

回答 2

Stack Overflow用户

发布于 2019-06-21 09:56:36

我忍不住投入了2美分......

我已经开始使用__get__set在这个庄园http://gist.github.com/351387(类似于教义的方式),然后只通过$obj->var课堂外的访问属性。这样,根据需要,而不是把一个巨大的,你可以重写的功能__get__set功能,或覆盖__get__set在子类。

票数 0
EN

Stack Overflow用户

发布于 2019-06-21 10:25:08

@布赖恩

我的问题是,添加“更多逻辑以后”要求您添加适用于使用getter / setter访问的所有属性的全局逻辑,或者使用if或switch语句来评估您正在访问哪个属性以便您可以应用具体逻辑。

那不是真的。拿我的第一个例子:

代码语言: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!";
        }
    }
}

我对PHP在隐式访问器方法方面的局限性不满意。

我完全同意。我喜欢Python的处理方式(我的实现只是一个笨拙的扯掉它)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100001266

复制
相关文章

相似问题

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