它是值得的获取和OOP set方法?(Is it worth making get and set

2019-06-24 12:05发布

我见过一些在类有get和set方法来操纵插入数据的一些项目。 让我这里有一个例子:

    class Student extends dbClass
{
    private $TableID;
    private $FullName;
    private $Gender;
    private $Address;




    function setTableID($Value)
    {
        $this->TableID = $Value;
    }

    function getTableID()
    {
        return $this->TableID;
    }

    function setFullName($Value)
    {
        $this->FullName = $Value;
    }

    function getFullName()
    {
        return $this->FullName;
    }

    function setGender($Value)
    {
        $this->Gender = $Value;
    }

    function getGender()
    {
        return $this->Gender;
    }

    function setAddress($Value)
    {
        $this->Address = $Value;
    }

    function getAddress()
    {
        return $this->Address;
    }


    function UpdateStudent()
    {
        $sql = "UPDATE INTO usertable SET
        FullName = '".$this->getFullName()."',
        Gender = '".$this->getGender()."',
        Address = '".$this->getAddress()."'
        where TableID='".$this->getTableID()."'";
        $this->query($sql);
    }
}

以上是我所见过的例子类。 以下是该过程中,他们是如何使用它:

$student = new Student;
$student->setTableID = 1;
$student->setFullName('My Name');
$student->setGender('Male');
$student->setAddress('this is my address');

$studen->UpdateStudent();

是否值得这样做呢? 我个人认为它没用设置域,然后在它那里得到和更新记录。 这真的需要花费大量的时间把它的每一个模块。 什么是处理此类事情的最好方法? 有没有这样做,任何有关的安全性?

Answer 1:

是否值得这样做呢?

这取决于。

通过暴露“智能”属性(即,吸气剂和/或setter)提取来自用户的字段有两个缺点:

  1. 你需要写更多的代码; 如果该属性并没有真正做任何事情聪明,这是代码,没有任何用处。
  2. 因为他们必须键入多一点为好属性的用户稍有不便。

它有一个好处:

  1. 在未来,你可以添加逻辑来的属性,即使有不破坏用户的代码之前没有。

如果这样的好处是有意义的(例如,你正在编写一个可重用的软件库),那么它使伟大的意义写属性,而不是裸露的领域。 如果没有,你这样做是为了毫无益处的工作。

什么是处理此类事情的最好方法?

您可以覆盖魔术__get__set函数(也许在一个基类,所以你可以继承倍率为好)自动转发属性访问到你的getter和setter。 简化的代码:

public function __get($name) {
    $getter = 'get'.$name;
    if (method_exists($this, $getter)) {
        return $this->$getter();
    }

    $message = sprintf('Class "%1$s" does not have a property named "%2$s" or a method named "%3$s".', get_class($this), $name, $getter);
    throw new \OutOfRangeException($message);
}

public function __set($name, $value) {
    $setter = 'set'.$name;
    if (method_exists($this, $setter)) {
        return $this->$setter($value);
    }

    $getter = 'get'.$name;
    if (method_exists($this, $getter)) {
        $message = sprintf('Implicit property "%2$s" of class "%1$s" cannot be set because it is read-only.', get_class($this), $name);
    }
    else {
        $message = sprintf('Class "%1$s" does not have a property named "%2$s" or a method named "%3$s".', get_class($this), $name, $setter);
    }
    throw new \OutOfRangeException($message);
}

买者自负:由于__get__set被覆盖, __isset__unset应该重写以及!

有没有这样做,任何有关的安全性?

不,根本就没有(假设你不插入错误意外)。



Answer 2:

在语言不具有的属性 (public成员“变量”,这实际上导致函数调用)使用getter / setter方法,而不是公共变量通常建议。 不然以后如果已经有人在使用您的平坦区域,你不能(设置一个变量时如)添加逻辑。

由于PHP是这样一种语言(不幸)的答案是肯定的,使用它们



Answer 3:

制作getter和setter方法有助于强制OOP封装。 林不知道的PHP,但对许多其他语言(Java,C ++),良好的IDE(日食/的NetBeans),将自动生成这些getter和setter方法为您服务。

它可能不是简单类型立竿见影,但如果任何一种更复杂的处理必须执行,那么它变得更明显。



Answer 4:

我有一些代码,设置在200个不同的文件中值:至于为什么要有时使用getter和setter方法的一个例子:

$cat->name = 'Fery'          // in file one
$favoriteCat->name = 'Tery'  // in another file
$fatCat->name = 'jery'             // in another file
// 200 more calls in alot of places

试想一下,客户突然又有了新的要求:“所有的猫名称必须用‘甜’来前缀

现在,我们必须找到猫的所有声明和替换他们的任务:

$cat->name = 'Sweet '.'Fery'
// times 200   

在另一方面,如果我们使用了setter方法我们需要做的就是添加的代码中添加“甜”在一个地方:

public function setCatname($catname)
{
  $this->catName = 'Sweet ' . $catname;
}


文章来源: Is it worth making get and set methods in OOP?
标签: php oop get set