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

在OOP设计(PHP)中传递多个变量的正确方法,php,oop,Php,Oop,如何正确地将数据传递给此结构中引用的类: -Head Index - PageBuilder - PageSection -Body -Foot -头 索引-页面生成器-页面部分-正文 -脚 例如,我想向head发送大量数据,但我希望避免这种情况: newpagesection('head'、'how to cook'、$keywords、$description、$script、$css) 上述内容看起来很难管理和修改。还有更

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

-Head Index - PageBuilder - PageSection -Body -Foot -头 索引-页面生成器-页面部分-正文 -脚 例如,我想向head发送大量数据,但我希望避免这种情况:

newpagesection('head'、'how to cook'、$keywords、$description、$script、$css)

上述内容看起来很难管理和修改。还有更多需要传递的数据没有显示在该示例中


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

这可能是定义包含变量的对象。通过这种方式,您可以通过特定属性的名称安全地引用该属性。也可以使用映射或数组。例如,jQuery广泛使用params对象来实现此目的,因此在代码中可以使用(模拟语法)


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

下面是一个(人为的)示例(在Java中,因为我不了解PHP)


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

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

$section = new PageSection('head');
$section->addKeyword();
$section->setDescription();
您可以获取设置关键字的数组,编辑该数组并将其重置:

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

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

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

与仅使用其中一种方法相比,使用这两种方法有两个优点

  • 易于初始配置。如果只使用setter和getter,那么在实例化对象之后,必须在代码中设置每个单独的属性
  • 使用getter和setter,可以封装逻辑,从而驱动需要在这些对象中管理的每个属性
Zend Framework使用一个配置对象,该对象可以用数组实例化,并且可以动态地添加到或从中删除。但是,当一个配置对象被传递给构造函数时,它会立即转换为数组并作为数组使用。通过这种方式,如果有意义,可以使用配置对象(比如从数据库或配置文件加载设置),或者如果有意义,可以使用数组(比如在代码中设置参数只是对象实例化)


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

当您在多个对象和/或不同的层之间传递数据时,情况并非如此。我同意,我会将参数重构为数据对象(所有成员变量都是公共的,很少有(否?)方法)然后将这样一个对象的实例传递给PageSection类。您声明如下:创建一个对象,设置所有需要传递给构造函数的参数,将objct传递给构造函数,在构造函数内部获取对象的所有属性,并将它们设置为自身的属性保存保存的对象以便能够传递更多的信息(在这种情况下,您可以传递类本身,因为它具有所有相同的属性)似乎不太符合逻辑?1)参数对象可以用多种不同的方式构造。2) 你可以很容易地传递它3)它可以独立于你传递给它的对象来生成它自己4)参数对象不必以与构造对象相同的格式包含/表示数据。这是一个强大的关注点分离。这里的问题是我不能以这种方式调用函数,因为节对象是在另一个对象中声明的。使用setter存在以下问题:(1)调用它们的顺序;(2)并非所有setter都必须由客户端调用。
$section = new PageSection('head');
$section->addKeyword();
$section->setDescription();
$keywords = $section->getKeywords();
//edit them
$section->setKeywords($keywords);