【发布时间】:2014-12-16 13:44:04
【问题描述】:
鉴于以下两个类,(为了清晰而简单(不对变量进行完整性检查等))
<?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?
我是在朝着正确的方向前进,还是有任何其他方式?
编辑:添加视图。
【问题讨论】:
-
"...但是这些可能有很多。" 我的建议:不要偷懒。每次你因为懒惰而模糊你的代码时,它都会在以后困扰你。
-
我完全明白你在说什么,但我愿意很努力地偷懒。但是是的...
-
你应该把
__get()和__set()留给php,直接在构造函数中使用$this->name=$name;。就像现在一样,你这样做的方式只是......更长,没有任何好处。__set()无论如何都会在你定义你的属性时被 php 调用,所以......是的,我认为你所做的没有意义 -
此外,请发布您使用的实际代码。在这里,我们可以判断这不是您真正的控制器(或不是您的真正类),因为您尝试在公共范围内分配给私有属性
phone。 (eg$person->Phones = $stack;) 这个问题贴的代码没有运行;它会引发可见性错误。 -
@FélixGagnon-Grenier 你对构造函数中的
__get和__set是错误的。试试this code,你会看到的。这实际上非常重要。关于问题中的代码主题,它有效。我只是没有提供观点,因为我认为这对所提出的问题并不重要。我会添加它,但这对于我的问题并不重要。