在OOP设计中传递许多变量的正确方法(PHP)

时间:2009-10-18 20:31:11

标签: php oop

如何将数据正确传递给此结构中引用的类:

                                  -Head
Index - PageBuilder - PageSection -Body
                                  -Foot

例如,我想发送大量数据,但我想避免这种情况:

new PageSection('head','how to cook',$keywords,$description,$script,$css);

以上看起来很难管理和修改。并且需要传递更多数据,而不是在该示例中显示!

Head,Body和Foot类需要大量用户提供的数据,但发送此数据的最佳方式是什么。请记住,某些数据需要进行硬编码,而某些数据需要根据数据库进行设置,或者在某些情况下需要依赖于默认设置。

4 个答案:

答案 0 :(得分:3)

为什么不创建表示参数集的对象?所以你只需传递一个对象,但它包含你的各个参数。一个优点是您可以轻松地重构以添加/删除发送到方法的数据,但不会更改方法调用,因为它们只是处理参数对象。

一个(人为的)示例(在Java中,因为我不支持PHP)

// build the parameters from command-line args 
// (you could build from a database or XML or whatever)
PageParameters p = PageParameters.fromArgs(args);

PageSection page = new PageSection(p);

PageParameters将包含以某种形式构造PageSection对象所需的属性 - 不一定是PageSection将自己存储它们的形式。 PageParameters可以拥有不属于PageSection的功能(例如命令行args解析,健全检查值等)。

答案 1 :(得分:3)

根据Brian Agnew和Nicky De Maeyer的建议,在构造函数中使用setter和getter以及数组或对象。我的选择框架(Zend)以这种方式处理这个精确的问题。

与仅使用其中一种方法相比,使用这两种方法具有一些优势。

  • 易于初始配置。如果您只使用setter和getter,则必须在实例化对象后在代码中设置每个单独的属性。
  • 使用getter和setter,您将获得逻辑的封装,这些逻辑将驱动您需要在这些对象中管理的每个属性。

Zend Framework使用可以使用数组实例化的Config对象,可以动态添加或删除。但是当一个配置对象传递给构造函数时,它会立即转换为一个数组并被用作这样的数组。通过这种方式,可以使用Config对象,如果有意义(比如从数据库或配置文件中加载设置)或者只使用数组(如果有意义的话)(比如在代码中设置参数只是对象)实例化)。

此外,Zend Framework提供了getter和setter,以便您可以随时在代码中自由修改对象。否则,您必须销毁现有对象,然后使用调整后的参数重新实例化。

答案 2 :(得分:0)

这可能是定义包含变量的对象。这样您就可以通过名称安全地引用特定属性。您还可以使用地图或数组。例如,jQuery为此目的疯狂地使用params对象,所以在你的代码中你可以拥有(模拟语法)

doSomething(props) {
  props.head
  props.body
  props.foot
}

答案 3 :(得分:-1)

您可以使用setter而不是通过构造函数传递所有内容。

$section = new PageSection('head');
$section->addKeyword();
$section->setDescription();

你可以得到一组set关键字,编辑数组并重置它:

$keywords = $section->getKeywords();
//edit them
$section->setKeywords($keywords);

或者您可以创建更多的子类,但要注意复杂性和不必要的子类化......