PHP类方法何时返回或不返回


PHP Class Method when to return or not to return

在类中,我创建了一个set方法,如果它被调用,则接受数据。

    <?php
    public function set_name($name)
    {
    $this->name = ucwords(trim($name));
    // return $this->name;
    }
    ?>

我的问题是,我是否必须返回函数的结果。如果不是,为什么?我知道在display()方法中,你必须这样返回:return$this->name;。我真的很困惑。

您不必返回任何内容。

然而,最好在某些函数上返回一些东西来对其进行测试,即使它只是真的或假的,以澄清函数是否正确执行。

考虑到您的代码,一般来说,我个人不会对setters设置回报。所以什么都不退还也没关系。

例如,你可能想测试你的名字是否只包含字母,如果没有,则返回false

<?php
public function set_name($name) {
    if(preg_match("/[A-Za-z]+/", $name) {
        $this->name = ucwords(trim($name));
        return true;
    } else {
        return false;
    }
}
?>

然后你可以称之为:

<?php
        if(!set_name($name)) {
            echo "There was an error";
        }
?>

然而,这并不符合mvc框架。

在面向对象编程语言中,返回值是最好的。否则,当你的网站变得越来越大,而且容易出错时,这将是幼稚的,很难维护错误。

您不必在setter函数中返回结果,最好的用途是制作一些getter函数来获取数据。

否则,我对setter的看法是返回$this。有了这个小技巧,您可以将setter函数链接起来。

例如:

class C
{
    private $arg;
    private $arg2;
    function setArg($NewArg)
    {
        // your tests or so
        $this->arg = $NewArg;
        return $this;
    }
    function setArg2($NewArg)
    {
        // your tests or so
        $this->arg2 = $NewArg;
        return $this;
    }
    function getArg()
    {
        return $this->arg;
    }
    function getArg2()
    {
        return $this->arg2;
    }
}

你可以这样使用它:

$Item = new C();
$Item->setArg('hello')
     ->setArg2('hi');
$Item->getArg(); // return 'hello'
$Item->getArg2(); // return 'hi'

在这种情况下,它更具语义。我是否希望一个名为set_name的函数为我提供名称?不,不是真的,听起来很傻。在这种情况下,我不会退还任何东西。

因为一个函数应该只做一件事,所以你应该总是能够将选择简化为二进制的"是的,我希望它会返回一些东西"或"不,这没有任何意义"决定。

一般来说,您的方法应该按照期望的方式执行,只需查看它们的名称(有些人会讨厌我这么说)。

把自己放在一个必须处理代码的程序员的位置上总是一个好主意。如果必须使用一个名为:set_name()的方法,他永远不会期望它返回一些东西。

你的方法总是应该做人们期望他们做的事情,并通过异常向外部环境抱怨。不多不少

如果你把这个付诸实践:祝贺你。您刚刚为那些做了太多(分离关注点)的方法建立了一个伟大而可靠的警钟,您离干净的软件设计又近了一步。

当然,这不是你会强迫的事情(什么都不是),但这是你需要自己决定的事情。如果由于任何原因(例如多次提到的方法链接)无法做到这一点,您可以提供一个很好的类文档,并明确这些方法的实际作用。