如何投射一个对象数组

时间:2010-12-24 13:02:59

标签: php

我正在尝试在PHP类中投射一个对象数组,并且已经有一些真正的问题使它工作,主要是逻辑本身,因为我是新手。查看并阅读了大量资源,但它似乎对我没有任何意义,任何指针都会非常感激,我愿意接受建议。

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

接下来,一个名为“ContactTabs”的ContactList对象数组。

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

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

业务逻辑如下:

联系 名称 BGCOLOR lgcolor 电子邮件

ContactTabs 雇员 朋友

     // class definition 
class Contact{ 
    // define properties 
    public $name; 
    public $bgcolor; 
    public $lgcolor; 
    public $email; 

    // constructor 
   public function __construct() { 

    } 

  //destructor 
  public function __destruct() { 

   } 

}

class ContactList extends Contact { 


    // constructor 
    public function __construct($contactname,$contactbgcolor,$contactlgcolor,$contactemail) {

 $this ->name = $contactname; 
 $this ->bgcolor = $contactbgcolor; 
 $this ->lgcolor = $contactlgcolor;
 $this ->email = $contactemail;  

    parent::__construct();
  }

  }

$johndie = new ContactList('John Die','#FCEDC9','#FEF9ED','somecontact1@gmail.com','9');

$johndoe = new ContactList('John Doe ','#DEEDFE','#EDF5FE','somecontact2@hotmail.com,'6');


$Friends = new ExtendedArrayObject($jp);
$Employees = new ExtendedArrayObject($elvete);

$ContactTabs= new ExtendedArrayObject($Employees,$Friends);

print_r($ContactTabs);

2 个答案:

答案 0 :(得分:1)

第一步是抛弃所有代码并重新开始。我不知道“ExtendArrayObject”是什么,但你不需要它 - 它只会让事情复杂化。其余的代码并没有真正走上正轨。

在OOP中,一个类应该模拟“某事”。某种实体,通常但并不总是真实世界的事物。面向对象开发的第一步是草拟所涉及的实体并在类中对它们进行建模。在这种情况下,您的作业会准确地告诉您实体是什么:

  1. 联系
  2. ContactList
  3. 那么,好吧,我们需要了解我们的联系方式 - 我们需要它拥有哪些属性?我们说“名字”和“电子邮件”。让我们给它这些属性:

    class Contact {
        public $name;
        public $email;
    }
    

    一个ContactList听起来很简单,它只是一个联系人列表,其标题可以在一个标签中显示。我会写它,以便它的内部存储在一个数组中:

    class ContactList {
        public $title;
        public $contacts = array();
    }
    

    您可能想知道,为什么我需要一个ContactList,如果它只是拥有一个标题并将联系人存储在一个数组中?答案是,因为你的任务说你需要它。 :)与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对象,其中包含不同的列表,其中包含不同的联系人
    • 额外功劳:在ContactList中编写一个添加联系人的方法,但前提是列表中不存在另一个具有相同电子邮件地址的方法。

答案 1 :(得分:1)

您的Contact类是正确的(尽管您可能希望使用私有/受保护的属性进行封装,但您可以稍后更改)。

我就是这样做的:

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]);
    }
}

ContactTabsContactList非常相似,但接受ContactList个对象而不是Contact

它是如何工作的:

// 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;
}
相关问题