2010-08-02 4 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: явный метод геттер

<?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

+0

Большое спасибо за этот ответ. Это меня в правильном направлении. Вопрос: это из-за __get, который позволяет вам это делать, foreach ($ company-> employees as $ e)? Я хочу сказать «да», но я просто хочу убедиться, что я это понимаю. И что же такое зачистки? Artefacto упомянул неотъемлемые проблемы? Еще раз спасибо – nitefrog

+0

@nite __get намного медленнее, чем прямой доступ к свойству объекта (и, тем более, это будет в следующей версии PHP). В тяжелом объектно-ориентированном приложении это, вероятно, будет иметь значение. – Artefacto

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

потому что поля first и last, не имеющие инициализатору, инициализируются null. isset, в вашем случае, проверяет только, является ли аргумент нулевым, поскольку он гарантированно установлен (это аргумент).

+0

Благодарю вас. Наверное, я пытался сделать сильный тип $ emp. Например, например (Employee) $ emp, или это действительно невозможно в PHP? Снова благодарим вас за быстрый ответ. – nitefrog

+0

@nite Эти ролики невозможны в PHP, если это то, о чем вы просите. – Artefacto

+0

ОК, теперь это имеет смысл ... – nitefrog

2

PHP есть что называется PHP стандартной библиотеки, встроенные в язык. Стандартная библиотека PHP имеет ряд интерфейсов, которые позволяют реализовать определенные функции основного языка в ваших собственных определенных объектах. Один из них - это интерфейс iterator. Определите класс, который реализует этот интерфейс, а затем напишите реализацию, которая позволит вашему объекту делать то, что вы хотите, когда оно помещено в цикл foreach.

Кроме того, в зависимости от семантического вы после этого, вы можете так же легко сделать

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

Метод getEmployees будет вызываться только один раз.

+0

Привет, Алан, благодарю вас за отдых. Я не знал об этом итераторе. Прошло много времени с тех пор, как я сделал какой-либо PHP и человек, пришедший с других языков, это немного запутанно. Еще раз спасибо ... – nitefrog

Смежные вопросы