5

根据得墨忒耳定律,你可以在返回的对象上调用方法吗?

例如

<?php
class O
{
    public function m($http)
    {
        $response = $http->get('http://www.google.com');
        return $response->getBody(); // violation?
    }
}
?>

$http->get() 返回一个对象。这算作在 M 中创建/实例化的对象吗?如果你不能在上面调用方法(根据 LoD),你将如何处理这种情况?

4

3 回答 3

6

这并不违反得墨忒耳法则,因为

更正式地说,函数的得墨忒耳定律要求对象 O 的方法 M 只能调用以下类型对象的方法:

  • O本身
  • M的参数
  • 在 M 中创建/实例化的任何对象
  • O 的直接组件对象
  • 一个全局变量,可由 O 访问,在 M 的范围内

由于 $response 是在 M 中创建的对象,因此您可以在该对象上调用方法而不会违反。但是,访问以下属性将是违规行为getBody()

$length = $response->getBody()->length;

有时你可以说这条法则可以通过说它是“一个点”规则来简化,这意味着你可以深入访问一个属性或方法。

于 2010-06-09T14:10:44.197 回答
6

一方面,$response似乎是在 method 中创建的m,所以答案似乎是肯定的。

另一方面,由于$http已传入 to m,由 that 返回的对象$http->get()现在由 表示,$response可能是 that 的成员$http,可能在进入 to 之前已创建m

考虑到对法律的“只有一个点”(或者,在这种情况下是箭头)解释,重写你的函数体return $http->get('http://www.google.com')->getBody();表明它可能是违反的。将中间成员保存为局部变量似乎是一种避免单点原则的狡猾方法。

我无法给出肯定的答案。在某种程度上,我认为这取决于你对$http->get()给你一个新创建的对象而不是一个预先存在的成员的信任程度。

于 2010-06-09T14:24:55.353 回答
1

解决这个问题的一种可能性是在 m() 中创建对象,并让 http->get() 用信息填充它。

class O
{
    public function m($http)
    {
        $response = new HttpResponse();
        $http->get('http://www.google.com', & $response);
        return $response->getBody(); // no violation, since we made $response ourselves.
    }
}
于 2010-06-09T17:43:13.487 回答