Php 如何强制转换对象数组
我试图在一个PHP类中铸造一个对象数组已经有一个星期了,但在使其工作时遇到了一些实际问题,主要是逻辑本身,因为我对类是新手。查阅并阅读了大量资源,但对我来说似乎没有任何意义,任何建议都将不胜感激,我愿意接受建议 问题是: 创建一个PHP类作为名为Contact的项目的一部分,然后创建一个名为“ContactList”的类,该类包含这些Contact对象的数组 接下来是一组名为“ContactTabs”的ContactList对象 然后,在程序中,用当前联系人填充一个ContactList对象(名为“Contacts”),并创建一个名为“Friends”的新ContactList对象,并在其中为朋友添加一些姓名和电子邮件地址。这是最重要的,这是一个很好的,面向对象的方式,这样它可以允许创建其他类型的接触在未来 “ContactList”对象不仅应该包含作为联系人列表的数组,还应该包含要放在选项卡上的文本标签。因此,更合适的做法是ContactList不仅仅是一个简单的数组,而是一个包含数组和文本标签的对象 业务逻辑如下所示: 接触 名称 bgcolor lgcolor 电子邮件 联系人选项卡 员工 朋友Php 如何强制转换对象数组,php,Php,我试图在一个PHP类中铸造一个对象数组已经有一个星期了,但在使其工作时遇到了一些实际问题,主要是逻辑本身,因为我对类是新手。查阅并阅读了大量资源,但对我来说似乎没有任何意义,任何建议都将不胜感激,我愿意接受建议 问题是: 创建一个PHP类作为名为Contact的项目的一部分,然后创建一个名为“ContactList”的类,该类包含这些Contact对象的数组 接下来是一组名为“ContactTabs”的ContactList对象 然后,在程序中,用当前联系人填充一个ContactList对象(名
第一步是扔掉所有的代码,重新开始。我不知道什么是“ExtendArrayObject”,但你不需要它,它只会使事情复杂化。代码的其余部分实际上并不在正确的轨道上 在OOP中,一个类应该对“某物”进行建模。某种实体,通常是,但并不总是,真实世界的东西。OO开发的第一步是勾勒出所涉及的实体,并在类中对它们进行建模。在这种情况下,您的任务会准确地告诉您实体是什么:
class Contact {
public $name;
public $email;
}
联系人列表听起来很简单,它只是一个联系人列表,带有一个可以显示在选项卡中的标题。我将编写它,以便它在数组中内部存储其联系人:
class ContactList {
public $title;
public $contacts = array();
}
您可能想知道,如果联系人列表只包含一个标题并将联系人存储在一个数组中,为什么我需要一个联系人列表?答案是,因为你的作业说你需要它。:)像OOP的许多方面一样,它们的有用性只会随着项目复杂性的增加而显示出来。现在就随它去吧
现在,将这些类放在两个单独的文件中:Contact.php和ContactList.php。(这不是严格必要的,但通常被认为是最佳做法。)创建第三个名为whatever的文件,并在其中添加以下代码以将其绑定在一起:
include("Contact.php");
include("ContactList.php");
// create a Contact object
$contact = new Contact();
$contact->name = "Bill";
$contact->email = "bill@gmail.com";
// create a ContactList object
$contact_list = new ContactList();
// set its title
$contact_list->title = "My Great Contacts";
// add our contact to it
$contact_list->contacts[] = $contact;
print_r($contact_list);
有了这段代码,你就完成了80%的任务-我不想完全按照你指定的任务去做,因为那样你就什么都没有了!我鼓励你玩这个游戏,直到你觉得你真的“明白了”。OOP通常需要一段时间才能在脑海中“点击”。但这真的很关键
练习:
- 向Contact类添加一些不同的属性,如“phone”和“address”
- 创建更多联系人并将其添加到列表中
- 创建第二个ContactList对象,该对象包含不同的列表,其中包含不同的联系人
- 额外积分:在联系人列表中写一个方法,添加一个联系人,但前提是列表中不存在另一个具有相同电子邮件地址的联系人
联系人
类是正确的(尽管您可能希望使用私有/受保护属性进行封装,但您可以稍后更改)
我会这样做:
class Contact{
public $name;
public $bgcolor;
public $lgcolor;
public $email;
public function __construct($name, $bgcolor, $lgcolor, $email) {
$this->name = $name;
$this->bgcolor = $bgcolor;
$this->lgcolor = $lgcolor;
$this->email = $email;
}
}
class ContactList implements Iterator, ArrayAccess {
protected $_label;
protected $_contacts = array();
public function __construct($label) {
$this->_label = $label;
}
public function getLabel() {
return $this->label;
}
public function addContact(Contact $contact) {
$this->_contacts[] = $contact;
}
public function current() {
return current($this->_contacts);
}
public function key() {
return key($this->_contacts);
}
public function next() {
return next($this->_contacts);
}
public function rewind() {
return reset($this->_contacts);
}
public function valid() {
return current($this->_contacts);
}
public function offsetGet($offset) {
return $this->_contacts[$offset];
}
public function offsetSet($offset, $data) {
if (!$data instanceof Contact)
throw new InvalidArgumentException('Only Contact objects allowed in a ContactList');
if ($offset == '') {
$this->_contacts[] = $data;
} else {
$this->_contacts[$offset] = $data;
}
}
public function offsetUnset($offset) {
unset($this->_contacts[$offset]);
}
public function offsetExists($offset) {
return isset($this->_contacts[$offset]);
}
}
而联系人选项卡
与联系人列表
非常相似,但会接受联系人列表
对象,而不是联系人
其工作原理是:
// create some contacts
$bob = new Contact('Bob', 'black', 'white', 'bob@bob.com');
$john = new Contact('John', 'black', 'white', 'john@john.com');
// create a contact list and add contacts to it
$contactlist = new ContactList('Contacts');
$contactlist->addContact($bob); // using a method
$contactlist[] = $john; // using array notation
// access the list by using foreach on it, since ContactList implements Iterator
foreach ($contactlist as $contact) {
echo $contact->email;
}
类ExtendedArrayObject扩展了ArrayObject{private$\u array;public function{uuu construct(){if(is_array(func_get_arg(0))$this->_array=func_get_arg(0));else$this->_array=func_get_args();parent::u construct($this->_array)}(tipp)PHP具有比数组更适合存储对象集合的特性。Alexantd,非常感谢您这么快的回复,感谢您在审阅我的作业时给予我的巨大帮助。netcoder,这篇文章写得令人惊讶。我对你处理原始问题的方式无言以对。正如我最初向alexandt提到的,我是PHP类新手,无法正常睡眠,尽管我从未想过我会在短时间内得到如此出色和快速的响应。你们真是太棒了!!非常感谢。将尝试这两种方法,因为代码在另一台服务器上工作,但不是以oop方式。做到这一点不仅是学习OOP不同观点的好方法,也是结交新朋友的好方法JP(tipp)您可以实现
IteratorAggregate
并为_联系人返回arrayiiterator
,而不是手动添加所有迭代器方法。
// create some contacts
$bob = new Contact('Bob', 'black', 'white', 'bob@bob.com');
$john = new Contact('John', 'black', 'white', 'john@john.com');
// create a contact list and add contacts to it
$contactlist = new ContactList('Contacts');
$contactlist->addContact($bob); // using a method
$contactlist[] = $john; // using array notation
// access the list by using foreach on it, since ContactList implements Iterator
foreach ($contactlist as $contact) {
echo $contact->email;
}