【问题标题】:What is the best method for getting/setting properties in PHP OOP在 PHP OOP 中获取/设置属性的最佳方法是什么
【发布时间】:2016-06-17 03:34:51
【问题描述】:

我看过的许多关于 PHP OOP 的教程都使用 getter 和 setter 方法来设置个人属性并从对象中检索数据。但是我想知道在数组中传递所有属性的第二种方法是否可以,如果不是,为什么?

$obj = new MyClass();

选项 1:Setter 和 Getter

$obj->setKeyword("orange");
$obj->setTitle("Title Name");
$obj->setPage(4);
$obj->setContent("Blah blah blah");
$obj->setTemplate("template.tpl");

$disp = $obj->getContent();

选项 2:数组和吸气剂

$params = array('keyword' => "orange",
                'title' => "Title Name",
                'page' => 4,
                'content' => "Blah blah blah",
                'template' => "template.tpl"
        );

$obj->setParams($params);
$disp = $obj->getContent();

对于我正在编写的脚本,我倾向于选项 2,因为可以为对象设置大约两打属性,我觉得也许只是将它们全部发送到一个数组中是最简单的方法做。我也不需要为每个属性创建一个 get 和 set 方法,我认为这会减少我需要为类创建的代码量。

选项 2 有什么问题吗?使用选项 1 中所示的 getter 和 setter 方法会更好吗?谢谢!

【问题讨论】:

  • 如果您所做的只是设置和获取(不在方法中进行任何类型的操作),最好避免它们 IMO。
  • 对象应该可以工作!用一种方法填充它并用另一种方法渲染它。默认情况下不要用 getter 和 setter 污染它。

标签: php oop


【解决方案1】:

你的第二种方法没有错。

在我看来,两者都必须可用。

我所知道的几乎每个集合实现都提供了至少一种批量分配方法。

【讨论】:

    【解决方案2】:

    单独的 get 和 set 让您有机会在输入和输出的过程中操作数据,或运行一些其他类型的逻辑。这通常是我是否拥有它们的驱动因素。如果对象纯粹是存储,那么质量集没有问题,但也要考虑未来的可能性......当有人来进行快速修复并执行以下操作时,我已经看到这类事情会退化:

    public function setParams($params){
        $params['x']=$params['x']*2;
        etc...
    }
    

    【讨论】:

      【解决方案3】:

      两者都没有问题。两者都很好。只是取决于你喜欢如何实现它。但是,如果您喜欢第一种方法并且不想为每个属性编写一个新方法。好吧,如果属性的数量多达两打,您不需要为每个单独的属性编写一个方法。相反,您可以使用 __get() 和 __set() 魔术方法。像这样的:

      class MyClass
      {
          private $publicProperties = ['abc'=>NULL,,'xyz'=>NULL]; //add all properties you want to be accessible. with their default values.
      
          public function __get($name)
          {
             if(array_key_exists($name, $this->publicProperties))
                  return $this->publicProperties[$name];
              throw new Exception('properties Does Not Exist.');
          }
      
          public function __set($name, $value)
          {
              if(array_key_exists($name))
              {
                  $this->publicProperties[$name] = $value;
                  return true;
              }
              throw new Exception('Proeperty Does Not Exist.');
      
          }
      }
      

      现在您可以设置如下属性:

      $class = new MyClass;
      $class->abc = 'New Value';
      

      然后像这样访问它:

      echo $class->abc; //output should be: New Value
      

      如果您喜欢使用方法设置值,例如$class->abc('New Value') 而不是$class->abc = 'new value',您可以使用__call($name, $value) 而不是__set($name, $value)

      【讨论】:

        猜你喜欢
        • 2013-11-12
        • 1970-01-01
        • 1970-01-01
        • 2013-10-13
        • 1970-01-01
        • 2018-03-24
        • 2011-01-07
        • 2011-10-09
        相关资源
        最近更新 更多