处理对象中的对象数组


Handle array of objects in an object

给定以下两个类(简单明了(不检查变量的健全性等))

<?php
class Person {
    private $Name;
    private $Phones = [];                // List/array of phone number.
    function __construct($name) { $this->__set('Name',    $name);}
    public function __get($property) {return $this->$property;}
    public function __set($property, $value) {$this->$property = $value;}
}
?>

<?php
class Phone {
    private $Number;
    private $Type;
    public function __construct($number, $type = "private") {
        $this->__set('Number',         $number);
        $this->__set('Type',           $type);
    }
    public function __get($property) {return $this->$property;}
    public function __set($property, $value) {$this->$property = $value;}
}
?>

以及"控制器":

<?php
    include_once("models/person.inc");
    include_once("models/phone.inc");
    $person = new Person('Tony Test');
    $phone0 = new phone("1234567890", "private");
    $phone1 = new phone("9876543210", "work");
    $phone2 = new phone("3216549870");
    $stack          = array($phone0, $phone1, $phone2);
    // assigning the whole array in one big swoop. Very easy, but not smart.
    $person->Phones  = $stack;
    include_once("views/myview.inc");
?>

最后,不起眼的观点:

<html>
<head>
<title>person / phone test</title>
</head>
<body>
<table border="1"><tr><td colspan="2">
<?php echo $person->Name; ?></td></tr>
<?php foreach($person->Phones as $val) : ?>
    <tr>
        <td><?php echo $val->Type;   ?></td>
        <td><?php echo $val->Number; ?></td>
    </tr>
<?php endforeach ?>
</table>
<pre><?php echo print_r($person, 1) ?></pre>
</body>
</html>

处理person对象中添加/删除/电话号码的最佳/最合乎逻辑/最聪明的方法是什么?如果我有办法的话,我会让getter和setter处理它,但因为它在对象内部的数组中,所以我有点困惑。当然,我可以为这个属性制作独立的getter/setter,但其中可能有很多。

我可以做的一种方法是让__get()__set()接收整个数组,同时为单个电话对象制作一个特殊的getter和setter?

我是朝着正确的方向前进,还是有其他办法?

编辑:添加了视图。

看看这个:

最佳实践:PHP魔术方法__set和__get

也许神奇的方法不是办法。

此外,您还可以创建addPhone、removePhone等方法。它们只需在数组和作业上迭代,或者将一个新电话推送到列表中。

处理person对象中添加/删除/电话号码的最佳/最合乎逻辑/最聪明的方法是什么?

我认为这将通过它的不同部分(正如我所看到的)来封装它

收集电话数据

我认为这是一个简化的例子,您的数据不是硬编码的;它来自任何地方,也许是数据库,所以可以随心所欲地格式化它,也许是这样的:

$phoneContainer = array(
  0=>array("1234567890","private"),
  1=>array("9876543210","work"),
  2=>array("3216549870"),
);

创建对象

new phone($number,$group); // yeah obviously thanks Felix

。。。在迭代容器时

foreach ($phoneContainer as $phoneInfo) {
  if (isset($phoneInfo[1])) $phone = new phone($phoneInfo[0],$phoneInfo[1]);
  else $phone = new phone($phoneInfo[0]);
  $person->phones[] = $phone;
}

但是,直接使用公共属性来设置对象数组是有问题的。我至少会在person类中考虑这样一个属性,以及它的用法:

public function addToGroup($group,$what) {
  $this->$group[] = $what;
}
// now in the foreach:
$person->addToGroup('phones',$phone);

您可以使用这个相同的函数来管理所有potentionally many of these中可能很好的一部分,至少所有这些都是作为容器进行反应的。


无关,但php保留了一些__set()__get()的用法。为什么不把它们定义为正常的集和集呢?

public function get($property) {return $this->$property;}
public function set($property, $value) {$this->$property = $value;}

它们同样是您自己的函数,您可以根据需要对数据进行净化或验证,但它们也不再是php的方式。