处理对象中的对象数组

时间:2014-10-21 10:51:42

标签: php arrays oop 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;}
}
?>

和&#34;控制器&#34;:

<?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处理它,但因为它在一个对象内部的数组中,我有点难过。我当然可以为这个房产制作独立的吸气剂/安装者,但可能有很多这些。

我能做到的一种方法是让__get()__set()接受整个数组,同时为单个手机对象制作一个特殊的getter和setter?

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

编辑:添加了视图。

2 个答案:

答案 0 :(得分:0)

看看这个:

Best practice: PHP Magic Methods __set and __get

也许不是魔术方法。

此外,您可以创建方法addPhone,removePhone等。他们只需迭代数组并完成工作或将新手机推送到列表中。

答案 1 :(得分:0)

  

在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 has some reserved usage for __set() and __get()。为什么不将它们定义为普通集并获取?

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

它们不仅仅是您自己的功能,您可以根据需要清理或验证数据,但它们也不再是以PHP的方式。