Php 如何强制转换对象数组

Php 如何强制转换对象数组,php,Php,我试图在一个PHP类中铸造一个对象数组已经有一个星期了,但在使其工作时遇到了一些实际问题,主要是逻辑本身,因为我对类是新手。查阅并阅读了大量资源,但对我来说似乎没有任何意义,任何建议都将不胜感激,我愿意接受建议 问题是: 创建一个PHP类作为名为Contact的项目的一部分,然后创建一个名为“ContactList”的类,该类包含这些Contact对象的数组 接下来是一组名为“ContactTabs”的ContactList对象 然后,在程序中,用当前联系人填充一个ContactList对象(名

我试图在一个PHP类中铸造一个对象数组已经有一个星期了,但在使其工作时遇到了一些实际问题,主要是逻辑本身,因为我对类是新手。查阅并阅读了大量资源,但对我来说似乎没有任何意义,任何建议都将不胜感激,我愿意接受建议

问题是: 创建一个PHP类作为名为Contact的项目的一部分,然后创建一个名为“ContactList”的类,该类包含这些Contact对象的数组

接下来是一组名为“ContactTabs”的ContactList对象

然后,在程序中,用当前联系人填充一个ContactList对象(名为“Contacts”),并创建一个名为“Friends”的新ContactList对象,并在其中为朋友添加一些姓名和电子邮件地址。这是最重要的,这是一个很好的,面向对象的方式,这样它可以允许创建其他类型的接触在未来

“ContactList”对象不仅应该包含作为联系人列表的数组,还应该包含要放在选项卡上的文本标签。因此,更合适的做法是ContactList不仅仅是一个简单的数组,而是一个包含数组和文本标签的对象

业务逻辑如下所示:

接触 名称 bgcolor lgcolor 电子邮件

联系人选项卡 员工 朋友


第一步是扔掉所有的代码,重新开始。我不知道什么是“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;
    }