2010-07-04 66 views
6

这里是一个情景在OOP中应尽可能避免使用方法中的参数?

class page { 
    public $name; 
    public $title; 

    public function showhead() { 
      return "<head><title>".$this->title."</title></head>"; 
    } 
} 
$mypage = new page; 
$mypage->title = "My Page title"; 
$mypage->showhead(); 

和另一个场景

class page { 
    public $name; 
    public function showhead($title) { 
      return "<head><title>".$title."</title></head>"; 
    } 
} 
$mypage = new page; 
$mypage->showhead("My Page title"); 

在这些方法中,哪一个更好,并且应该避免?为什么?

+0

错字? “尽可能地避免并尽量使用” - 改变和或? – apollodude217 2010-07-06 21:49:34

回答

8

我想这取决于你是否再次需要该标题。如果你这样做,然后做财产存储和检索。如果你只需要一次,那么使用方法参数。

1

没有任何其他信息,我要说的是,第一个是“更好”,因为它在我看来,$name$title是属于page性质,因此,它应该是一个类成员。但是,如果您觉得第二个版本更适合您的情况,那么请尽量使用它。

5

在传递参数(单独或者在不可变的聚合类型中,PHP中并不存在)以及将它们存储在某处(无论是类属性,全局变量,不管)之间总会存在一些紧张。 OOP的好处之一是你可以将状态存储在对象中并受益于封装(防止许多意外覆盖数据),同时避免用变量污染符号表。使用这些可变对象有其自己的一套问题,特别是如果我们进入多线程编程,但这是PHP中较小的问题。

在您的具体情况下,我认为将标题存储在对象中会更好。作为在硅片说,它似乎属于page,并且最重要的是你可以做的东西,如:

$page = new page; 
$page->setTitle("whatever"); 
... 
function doStuff($page) { 
    ... 
    $page->showhead(); 
} 

然后你不必连同标题传递$page

3

IMO:因为 - > showhead()有到$标题不是对象本身少语义关系,你应该assing $标题无论是作为财产,或通过对象的构造更好:

class page { 
    function __construct($title="") { 
     $this->title = $title 
    } 

所以您可以选择new page("My page")或稍后将其分配$page->title=...,具体取决于您何时有空。

+0

更重要的是;您现在可以声明受保护的属性,从而使该对象不可变。 – troelskn 2010-07-04 12:00:43

1

在一个侧面说明了最佳实践,这将是一个好主意,不直接访问对象成员,而是让它保护,并设置/得到它通过public方法代替,像这样

class foo 
{ 
    protected $title; 

    public function setTitle($title) 
    { 
     $this->title = $title; 
    } 

    public function getTitle() 
    { 
     return $this->title; 
    } 
} 

这消除了对使用这些数据的任何其他代码的需求,这些代码需要知道它是如何实际存储的,而是为它提供一个接口,从而封装(隔离)数据。 http://en.wikipedia.org/wiki/Information_hiding

3

你应该问自己:标题是否属于一个页面?或者它是一个页面使用的东西。
这些都是我用它来找出一个实体需要如何在OOP被设计主要启发式:

  • Compisition是一段亲密关系,一个。一个页面有一个标题?这个问题的答案是肯定的。
  • 继承关系是is-a。是 a 标题?这个问题的答案是否定的。请注意,只要有可能,您应该比继承更喜欢构图。通常你可以使用其中任何一个。
  • 将参数传递给函数的关系是uses-a。是否页面使用标题?这个问题的答案是肯定的。然而has-a是一个更强的关系,然后使用-a。再次有时你可以同时使用,但你应该更喜欢has-auses-a when possible。