Php 使用单一方法设置/获取值,而不是使用两种方法?

Php 使用单一方法设置/获取值,而不是使用两种方法?,php,class,coding-style,getter-setter,Php,Class,Coding Style,Getter Setter,将getter和/或setter方法替换为处理这两种方法的单个方法是一个好主意吗 例如: function name($what = null){ if(!$what) return $this->name; $this->name = $what; } 用法如下: // get name print $obj->name(); // set name $obj->name('

将getter和/或setter方法替换为处理这两种方法的单个方法是一个好主意吗

例如:

    function name($what = null){

      if(!$what)
        return $this->name;

      $this->name = $what;
    }
用法如下:

    // get name
    print $obj->name();

    // set name
    $obj->name('bla');
我见过一些框架这样做。社区认为这是好的做法还是坏的做法P

它看起来效率更高,但看起来有点混乱,因为我习惯于用PHP获取和设置。这种风格让我想起jQuery

将getter和/或setter方法替换为处理这两种方法的单个方法是一个好主意吗

没有

可能是一个非常具体的用例。但是,如果你需要将NULL指定为$NAMP,请在自己的代码中考虑。您的代码不允许这样做

就效率和性能而言,我看不出如何。最后,您仍然进行一次方法调用。设置或获取

如果您的意思是在更少的代码中实现高效,那么您已经牺牲了可读性。哪个效率更低。尤其是随着时间的推移

将getter和/或setter方法替换为处理这两种方法的单个方法是一个好主意吗

没有

可能是一个非常具体的用例。但是,如果你需要将NULL指定为$NAMP,请在自己的代码中考虑。您的代码不允许这样做

就效率和性能而言,我看不出如何。最后,您仍然进行一次方法调用。设置或获取


如果您的意思是在更少的代码中实现高效,那么您已经牺牲了可读性。哪个效率更低。尤其是随着时间的推移。

您可以为对象中的所有变量创建一个Get和一个Set

因此,不使用函数getName和getAge

您可以使用get'name'或set'name',Foo-Bar'

函数如下所示:

    public function __set($name, $value) {
    $method = 'set' . $name;
    if (('mapper' == $name) || !method_exists($this, $method)) {
        throw new Exception('Invalid Client property');
    }
    $this->$method($value);
}

public function __get($name) {
    $method = 'get' . $name;
    if (('mapper' == $name) || !method_exists($this, $method)) {
        throw new Exception('Invalid Client property');
    }
    return $this->$method();
}

如果您正在寻找一种高效的替代getter和setter的方法,可能就是这样。

您可以做的是为对象中的所有变量创建一个Get和一个Set

因此,不使用函数getName和getAge

您可以使用get'name'或set'name',Foo-Bar'

函数如下所示:

    public function __set($name, $value) {
    $method = 'set' . $name;
    if (('mapper' == $name) || !method_exists($this, $method)) {
        throw new Exception('Invalid Client property');
    }
    $this->$method($value);
}

public function __get($name) {
    $method = 'get' . $name;
    if (('mapper' == $name) || !method_exists($this, $method)) {
        throw new Exception('Invalid Client property');
    }
    return $this->$method();
}

如果您正在寻找一种有效的替代getter和setter的方法,可能就是这样。

一般来说,使用一个函数,一次返回某个内容,另一次设置另一个内容,然后返回void,这永远都不是一个好主意可读性和findbug的原因,拥有一个函数,一次返回某个内容,另一次设置另一个内容并返回void,这从来都不是一个好主意可读性和findbug原因

我也使用过类似jQuery的单一方法解决方案,确实喜欢它,但读过一些帖子,出于某种原因,我认为其他人认为这是一种不好的做法。但现在我又在四处阅读,偶然发现了这篇文章

我的解决方案有一个免责声明:压缩格式

class Person {
    protected $name;
    protected $age;
    public function name($value = null) {
        if (null !== $value) {
            $this->name = (string) $value;
            return $this;
        }
        return $this->name;
    }
    public function age($value = null) {
        if (null !== $value) {
            $this->age = (int) $value;
            return $this;
        }
        return $this->age;
    }
}
我确实喜欢这种类型的界面

$person1 = new Person();
$person1->name('Bob')->age(30);
echo $person->name();
一般的想法是,如果$value为null,则发送回属性,否则将属性设置为$value,可以键入强制转换它,或者通过一些其他过滤器运行它,然后返回类的实例

现在我再次访问这个,我不太清楚为什么会如此糟糕,除了您可能会将IDE与返回值混淆,因为它可能是您的属性数据类型或类

需要将值设置为false在这里仍然有效,在for me edge的情况下,我需要设置为null,然后我只需一次性/逐案更改默认/条件检查以适应


我确实很欣赏那种不必编写两个方法及其相关的phpdoc块的不那么典型的感觉。

我也使用过类似于jQuery的单一方法解决方案,我很喜欢它,但读过一些帖子,出于某种原因,我认为其他人认为这是一种不好的做法。但现在我又在四处阅读,偶然发现了这篇文章

我的解决方案有一个免责声明:压缩格式

class Person {
    protected $name;
    protected $age;
    public function name($value = null) {
        if (null !== $value) {
            $this->name = (string) $value;
            return $this;
        }
        return $this->name;
    }
    public function age($value = null) {
        if (null !== $value) {
            $this->age = (int) $value;
            return $this;
        }
        return $this->age;
    }
}
我确实喜欢这种类型的界面

$person1 = new Person();
$person1->name('Bob')->age(30);
echo $person->name();
一般的想法是,如果$value为null,则发送回属性,否则将属性设置为$value,可以键入强制转换它,或者通过一些其他过滤器运行它,然后返回类的实例

现在我再次访问这个,我不太清楚为什么会如此糟糕,除了您可能会将IDE与返回值混淆,因为它可能是您的属性数据类型或类

需要将值设置为false在这里仍然有效,在for me edge的情况下,我需要设置为null,然后我只需一次性/逐案更改默认/条件检查以适应


我确实很欣赏那种不必编写两个方法及其相关的phpdoc块的不那么典型的感觉。

我通常喜欢让使用我的代码的程序员在通过uu set和u get直接访问受保护变量和通过我的自定义getter/setter直接访问受保护变量之间做出选择。我发现在getter/setter中使用func_num_参数是可以接受的解决方案 . 它比只测试null稍微慢一点,但允许我将值设置为null

/**
 * Getter/Setter for Class::$someVar.
 * 
 * @access public 
 * @param mixed Value for Class::$someVar to be set to.
 * @return mixed If no parameter are passed it returns the current value for Class::$var.
 */
public function someVar($value = null) {
    if (func_num_args() > 0) {
        $this->someVar = $value;
        return $this;
    } else {
        return $this->someVar;
    }
}

我们在编程中所做的每一个选择都是一种妥协。诀窍是找出哪里可以妥协,哪里不应该妥协。

我通常喜欢让使用我的代码的程序员在通过uu set和u get直接访问受保护变量和通过我的自定义getter/setter直接访问受保护变量之间做出选择。我发现在getter/setter中使用func_num_参数是可以接受的解决方案。它比只测试null稍微慢一点,但允许我将值设置为null

/**
 * Getter/Setter for Class::$someVar.
 * 
 * @access public 
 * @param mixed Value for Class::$someVar to be set to.
 * @return mixed If no parameter are passed it returns the current value for Class::$var.
 */
public function someVar($value = null) {
    if (func_num_args() > 0) {
        $this->someVar = $value;
        return $this;
    } else {
        return $this->someVar;
    }
}

我们在编程中所做的每一个选择都是一种妥协。诀窍是找出哪里可以妥协,哪里不应该妥协。

如果我想将var设置为false或null?你是对的,这非常令人困惑,而且违反直觉。我希望PHP能提供类似properties的东西。jQuery正是它模仿的东西。显然,许多编码人员很容易被双用途访问器方法弄糊涂。但在某些情况下,它有助于API的可用性,这在流畅的接口中很常见。相对于应该不存在的浅层getter和setter,它更可取。@mario-Fluent接口,据我所知,总是返回一个值,您可以信赖它。上面示例中令人困惑的部分是,函数可能返回值,也可能不返回值,这只会带来麻烦。如果我想将var设置为false或null?你是对的,这非常令人困惑,而且违反直觉。我希望PHP能提供类似properties的东西。jQuery正是它模仿的东西。显然,许多编码人员很容易被双用途访问器方法弄糊涂。但在某些情况下,它有助于API的可用性,这在流畅的接口中很常见。相对于应该不存在的浅层getter和setter,它更可取。@mario-Fluent接口,据我所知,总是返回一个值,您可以信赖它。上面示例中令人困惑的部分是,函数可能返回值,也可能不返回值,这只会带来麻烦。我会采用这种方法实现getter和settings,最大的优点是这样做可以强制对象只具有您想要的属性。如果有人真的输入了一个错误,并为一些不应该存在的属性赋值,你的代码就会告诉你错误!帮助你抓住你的打字错误@JASONCCREARY确实是这样,尽管获得对您正在做的事情的直接反馈通常更可取。@bkwint,所以在开发中启用显示错误。虽然魔术方法确实有用,但使用它们来识别拼写错误是我今天听到的最愚蠢的事情。@JasonMcCreary,这是一个很好的副作用,仅此而已。我会选择这种实现getter和settings的方法,最大的优点是这样做可以强制对象只具有您想要的属性。如果有人真的输入了一个错误,并为一些不应该存在的属性赋值,你的代码就会告诉你错误!帮助你抓住你的打字错误@JASONCCREARY确实是这样,尽管获得对您正在做的事情的直接反馈通常更可取。@bkwint,所以在开发中启用显示错误。虽然魔法方法确实有用,但用它们来识别打字错误是我今天听到的最愚蠢的事情。@JasonMcCreary,这是一个很好的副作用,仅此而已。