在 PHP 中使用 getter 和 setter 代替函数或简单的公共字段有什么好处?

新手上路,请多包涵

我不是 PHP 开发人员,所以我想知道在 PHP 中以纯 OOP 样式和私有字段(我喜欢的方式)使用显式 getter/setter 有哪些优点和缺点:

 class MyClass {
    private $firstField;
    private $secondField;

    public function getFirstField() {
        return $this->firstField;
    }
    public function setFirstField($x) {
        $this->firstField = $x;
    }
    public function getSecondField() {
        return $this->secondField;
    }
    public function setSecondField($x) {
        $this->secondField = $x;
    }
}

或者只是公共领域:

 class MyClass {
    public $firstField;
    public $secondField;
}

原文由 Mark 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 417
2 个回答

您可以使用 php 魔术方法 __get__set

 <?php
class MyClass {
  private $firstField;
  private $secondField;

  public function __get($property) {
    if (property_exists($this, $property)) {
      return $this->$property;
    }
  }

  public function __set($property, $value) {
    if (property_exists($this, $property)) {
      $this->$property = $value;
    }

    return $this;
  }
}
?>

原文由 Davis Peixoto 发布,翻译遵循 CC BY-SA 3.0 许可协议

这篇文章不是专门关于 __get__set 而是 __call 除了方法调用之外,这是相同的想法。通常,由于评论和帖子中概述的原因,我远离任何类型的允许重载的魔术方法 _但是_,我最近遇到了我使用的使用 SERVICE 和 SUB-SERVICE 的 3rd-party API,例如:

 http://3rdparty.api.com?service=APIService.doActionOne&apikey=12341234

重要的部分是这个 API 除了子操作之外的所有内容都相同,在本例中为 doActionOne 。这个想法是开发人员(我自己和使用此类的其他人)可以按名称调用子服务,而不是像:

 $myClass->doAction(array('service'=>'doActionOne','args'=>$args));

我可以这样做:

  $myClass->doActionOne($args);

硬编码这只是很多重复(这个例子 非常 松散地类似于代码):

 public function doActionOne($array)
    {
        $this->args     =   $array;
        $name           =   __FUNCTION__;
        $this->response =   $this->executeCoreCall("APIService.{$name}");
    }

public function doActionTwo($array)
    {
        $this->args     =   $array;
        $name           =   __FUNCTION__;
        $this->response =   $this->executeCoreCall("APIService.{$name}");
    }

public function doActionThree($array)
    {
        $this->args     =   $array;
        $name           =   __FUNCTION__;
        $this->response =   $this->executeCoreCall("APIService.{$name}");
    }

protected function executeCoreCall($service)
    {
        $cURL = new \cURL();
        return $cURL->('http://3rdparty.api.com?service='.$service.'&apikey='.$this->api.'&'.http_build_query($this->args))
                    ->getResponse();
    }

但是通过 __call() 的神奇方法,我可以使用动态方法访问所有服务:

 public function __call($name, $arguments)
    {
        $this->args     =   $arguments;
        $this->response =   $this->executeCoreCall("APIService.{$name}");
        return $this;
    }

这种动态调用返回数据的好处是,如果供应商添加另一个子服务,我不必在类中添加另一个方法或创建扩展类等。我不确定这是否有用任何人,但我想我会展示一个示例,其中 __set__get__call 等可能是考虑的选项,因为主要功能是返回数据的。


编辑:

巧合的是,我在发布后几天看到了这个,它准确地勾勒了我的场景。这不是我指的 API,但方法的应用是相同的:

我正确使用 api 吗?

原文由 Rasclatt 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题