【问题标题】:Return object as an argument [closed]返回对象作为参数[关闭]
【发布时间】:2016-04-01 18:35:45
【问题描述】:

将对象作为参数返回是最佳实践吗? 更具体地说,以下哪种实现方式被认为更好?

一)

$foo = new ClassAInstance();
$bar = new ClassBInstance();

$bar->doSomethingToFoo($foo);

b)

$foo = new ClassAInstance();
$bar = new ClassBInstance();

$foo = bar->doSomethingToFoo($foo);

这个例子太垃圾了。希望你理解我的问题的一般概念。

【问题讨论】:

    标签: php oop object methods


    【解决方案1】:

    有趣的问题。两者在技术上都是正确的,但都不是完全面向对象的。我认为真正的问题是 foo 的状态发生了变化,因为 $bar.这意味着该函数可能至少有两个用途。

    似乎让一个对象改变它自己的状态,而不是另一个对象改变 foo 的状态。例如:

    $foo->changeState($bar->calculateValue($foo));
    

    【讨论】:

      【解决方案2】:

      如果您的doSomethingToFoo($someObject) 负责更改传递的对象属性,则无需将更改后的对象返回给客户端代码(这将是一种多余的方式)。
      当通过参数发送对象时,该参数是指向原始对象的指针。因此,您的函数将直接影响原始对象。
      考虑以下示例:

      class ClassA {
          public $name;
      
          public function __construct($name) {
              $this->name = $name;
          }
      }
      
      class ClassB {
          function doSomethingWithObject($obj){
              $obj->name = "changed name";
          } 
      }
      
      $foo = new ClassA("John");
      echo $foo->name;   // "John"
      
      $bar = new ClassB();
      $bar->doSomethingWithObject($foo);
      
      echo $foo->name;   // "changed name"
      

      http://php.net/manual/en/language.oop5.references.php

      【讨论】:

      • 按照你的方式,你的代码的哪一部分改变了$foo的状态,对读者来说并不是那么明显。使您的代码难以调试的东西。
      • @dios231,我提出了一个非常简单的例子。如果你对这些简单的事情有困难,你应该在调试之前开始阅读一些书籍。至少,您应该阅读这篇文章:php.net/manual/en/language.oop5.references.php,不过,这还不够
      • 您可能误解了我之前的提及。我不想侮辱你的代码和你,和平。我的主要概念是,在单个模块中将有超过 100 个方法调用的大型应用程序中,当对象更改状态时不会那么明显。假设您在 raw 中有 4 个以 $foo 作为参数的方法。读者如何才能知道对象是通过哪种方法改变状态的,而不用反复考虑呢?
      • “捕捉”主体状态变化的事件——考虑使用观察者模式。 sourcemaking.com/design_patterns/observer/php
      猜你喜欢
      • 1970-01-01
      • 2022-01-22
      • 2020-02-17
      • 2012-07-28
      • 1970-01-01
      • 2013-01-08
      • 2023-01-26
      • 1970-01-01
      • 2014-10-15
      相关资源
      最近更新 更多