2010-08-02 84 views
1

我甚至不知道如何問。我在C#中一直這樣做,但在我的生活中,我無法在PHP中找到任何體面的示例。你能幫我嗎?類中的類對象與PHP OOP

我想要做的是例如。假設我有一個叫公司的班級,他有很多員工。

我希望能夠將所有員工存儲在公司類中,然後當我迭代公司對象時,我需要能夠遍歷分配給該公司的所有員工,並且我正在摸索一段時間試圖找到一個直接的例子。

我可以填充它,但爲了我的生活我無法循環通過員工。我知道我做錯了什麼,但無法弄清楚。這是我的例子。

員工

這可能是完全錯誤的,我才知道作爲獲取數據退了出去。

class Employee 
    { 
     private $first; 
     private $last; 

     public function __construct($first = null, $last = null) 
     { 
      if(isset ($first)) 
       $this->first = $first; 

      if(isset ($last)) 
       $this->last = $last; 
     } 

     public function getEmployee() 
     { 
      return Employee($this->first, $this->last); 
     } 

     public function getFirst() 
     { 
      return $this->first; 
     } 

     public function getLast() 
     { 
      return $this->first; 
     } 
    } 

公司擁有一批員工。

在C#中我會使用類似的通用

public List<Employee> Employees {get;set;} 

然後在構造函數中我會做類似

Employees = new List<Employee>(); 

然後,我可以做類似

foreach(var x in Customer.Employees) 
      x.first; 

那是我有點想做的事情。

class Company 
    { 
     private $companyName; 

     private $employees; 


     public function __construct($nameOfCompany) 
     { 
      $this->companyName = $nameOfCompany;    
     } 

     public function setEmployee(Employee $employee) 
     { 
      $this->employees[] = $employee; 
     } 

     public function getCompanyName() 
     { 
      return $this->companyName; 
     } 

     public function setCompanyName($nameOfCompany) 
     { 
      $this->companyName = $nameOfCompany; 
     } 

     public function getEmployees() 
     { 
      return $this->employees; 
     } 
    } 

創建並填充

$c = new Company("Test"); 
    $c->setEmployee(new Employee('A','B')); 
    $c->setEmployee(new Employee('C','D')); 
    $c->setEmployee(new Employee('E','F')); 

直到此時一切都很好。

要獲得公司的名稱沒有問題。

echo $c->getCompanyName(); 

    echo "<PRE>"; 
    print_r($c); 
    echo "</PRE>"; 

但是,我如何循環通過員工?

我希望能夠像做投公司的員工在一個循環中的單個僱員,然後像做

foreach(customers employees) 
      echo Employee->getFirst, etc... 

是否有人可以提供一些指導?

感謝

回答

3

版本1:明確的getter方法

<?php 
class Employee 
{ 
    private $first; 
    private $last; 

    public function __construct($first = null, $last = null) 
    { 
    if(isset ($first)) 
    $this->first = $first; 

    if(isset ($last)) 
    $this->last = $last; 
    } 

    public function getFirst() 
    { 
    return $this->first; 
    } 

    public function getLast() 
    { 
    return $this->first; 
    } 
} 

class Company 
{ 
    private $companyName; 
    private $employees; 

    public function __construct($nameOfCompany) 
    { 
    $this->companyName = $nameOfCompany; 
    } 

    public function addEmployee(Employee $employee) 
    { 
    $this->employees[] = $employee; 
    } 

    public function getCompanyName() 
    { 
    return $this->companyName; 
    } 

    public function getEmployees() 
    { 
    return $this->employees; 
    } 
} 

$company = new Company('ACME'); 
$company->addEmployee(new Employee('A', 'A')); 
$company->addEmployee(new Employee('B', 'B')); 
$company->addEmployee(new Employee('C', 'C')); 

foreach($company->getEmployees() as $e) { 
    echo $e->getFirst(), "\n"; 
} 

版本2:使用__get

class Company 
{ 
    private $companyName; 
    private $employees; 

    public function __construct($nameOfCompany) 
    { 
    $this->companyName = $nameOfCompany; 
    } 

    public function addEmployee(Employee $employee) 
    { 
    $this->employees[] = $employee; 
    } 

    public function __get($name) { 
    // this will allow access to any member of the class 
    // so you might want to test access first 
    if (isset($this->$name)) { 
     return $this->$name; 
    } 
    } 

} 

$company = new Company('ACME'); 
$company->addEmployee(new Employee('A', 'A')); 
$company->addEmployee(new Employee('B', 'B')); 
$company->addEmployee(new Employee('C', 'C')); 

foreach($company->employees as $e) { 
    echo $e->getFirst(), "\n"; 
} 

$company = new Company('ACME'); 
$company->addEmployee(new Employee('A', 'A')); 
$company->addEmployee(new Employee('B', 'B')); 
$company->addEmployee(new Employee('C', 'C')); 

foreach($company->employees as $e) { 
    echo $e->getFirst(), "\n"; 
} 
+0

不要用'__get'給他提出想法 - 至少不是沒有告訴他關於固有問題。 – Artefacto 2010-08-02 00:20:45

+0

非常感謝您的回覆。它讓我朝着正確的方向前進。 問題,是否因爲__get允許你這樣做, foreach($ company-> employees as $ e)? 我想說是的,但我只是想確保我理解它。還有什麼是陷阱? Artefacto提到了固有的問題? 再次感謝您 – nitefrog 2010-08-02 02:54:57

+0

@nite __get比直接訪問對象屬性慢得多(在下一版本的PHP中更是如此)。在一個沉重的面向對象的應用程序中,它可能會有所作爲。 – Artefacto 2010-08-02 07:03:11

2
foreach ($company->getEmployees() as $emp) { 
    //do something with $emp 
} 

foreach

一個注意:

public function __construct($first = null, $last = null) 
    { 
     if(isset ($first)) 
      $this->first = $first; 

     if(isset ($last)) 
      $this->last = $last; 
    } 

是完全一樣的

public function __construct($first = null, $last = null) 
    { 
     $this->first = $first; 
     $this->last = $last; 
    } 

因爲沒有初始化的字段firstlast,被初始化爲nullisset,在你的情況下,只檢查參數是否爲null,因爲它保證被設置(它是一個參數)。

+0

謝謝你的答案。我想我試圖做一個強大的$ emp類型。 例如像(Employee)$ emp,或者在PHP中不可能實現? 再次非常感謝你的快速回復。 – nitefrog 2010-08-02 02:46:20

+0

@nite如果這就是你要求的,這些轉換在PHP中是不可能的。 – Artefacto 2010-08-02 03:16:53

+0

好的,現在它是有道理的...... – nitefrog 2010-08-02 03:34:00

2

PHP有一種叫做PHP標準庫內置的語言。 PHP標準庫帶有許多接口,允許您將某些核心語言功能實現到您自己定義的對象中。一旦這些是iterator接口。定義一個實現此接口的類,然後編寫一個實現,該實現將允許您的對象在放入foreach循環時執行所需操作。

此外,根據語義你之後,你可以很容易地做一個

foreach($company->getEmployees() as $employee) 
{ 
    var_dump($employee); 
} 

getEmployees方法纔會被調用一次。

+0

你好Alan,謝謝你的安息。我不知道迭代器。從我完成任何PHP和來自其他語言的人到現在已經很長時間了,這有點令人困惑。 再次謝謝你... – nitefrog 2010-08-02 02:47:45