是否值得在OOP中获取和设置方法?

时间:2012-05-16 10:41:15

标签: php oop get set

我已经看到一些项目,其中类有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();

值得这样做吗?我个人认为设置字段然后获取并更新其中的记录是没用的。每个模块都需要花费很多时间。处理这种事情的最佳方法是什么? 是否有任何担保以这种方式进行?

4 个答案:

答案 0 :(得分:13)

  

这样做是否值得?

取决于。

通过公开“智能”属性(即getter和/或setter)从用户中提取字段有两个缺点:

  1. 您需要编写更多代码;如果该属性没有真正做任何聪明的事情,这是没有任何用处的代码。
  2. 该物业的使用者稍微有点不方便,因为他们也必须输入更多。
  3. 它有一个优点:

    1. 将来,您可以添加逻辑到属性,即使之前没有,也不会破坏用户的代码
    2. 如果这种优势是有意义的(例如,您正在编写一个可重用的软件库),那么编写属性而不是裸字段是很有意义的。如果没有,你就是在做无益的工作。

        

      处理此类事情的最佳方式是什么?

      您可以覆盖魔术__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也应该被覆盖!

        

      有没有担心这样做的安全?

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

答案 1 :(得分:6)

通常建议在使用getter / setter而不是公共变量的语言中没有属性(实际上导致函数调用的公共成员“变量”)。否则,如果人们已经在使用普通字段,则无法在以后添加逻辑(例如,在设置变量时)。

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

答案 2 :(得分:2)

制作setter和getter有助于强制执行OOP封装。我不确定PHP,但对于许多其他语言(Java,C ++),一个好的IDE(eclipse / netbeans)会为你自动生成这些setter和getter。

对于简单类型,它可能不会立即显而易见,但如果必须执行任何更复杂的处理,那么它就会变得更加明显。

答案 3 :(得分:1)

为什么有时使用getter和setter的示例:  我有在200个不同文件中设置值的代码:

$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

假设客户突然有一个新要求:“所有的猫名都必须以'Sweet'开头

现在,我们必须找到所有猫的声明并替换它们的赋值:

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

另一方面,如果我们使用了setter方法,我们要做的就是添加代码以在一个位置添加'Sweet':

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