给定以下两个类(简单明了(不检查变量的健全性等))
<?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的方式。