объект класса в классе с PHP - PullRequest
1 голос
/ 02 августа 2010

Я даже не уверен, как спросить. Я делаю это все время в C #, но я не могу найти достойных примеров в PHP. Вы можете помочь?

Например, я пытаюсь это сделать. Скажем, у меня есть класс под названием Компания, в котором много сотрудников.

Я хочу иметь возможность хранить всех сотрудников в классе компании, а потом, когда я перебираю объект Company, мне нужно иметь возможность перебирать всех сотрудников, назначенных этой компании, и у меня чертовски время, пытаясь найти прямой пример.

Я могу заполнить его, но из-за своей жизни я не могу пройтись по Сотрудникам. Я знаю, что делаю что-то не так, но не могу понять это. Вот что у меня есть например.

Сотрудник

Это может быть совершенно неправильно для всех, что я знаю, как вернуть данные.

    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 "";
    print_r($c);
    echo "
";

Но как мне прокрутить сотрудников?

Я хочу иметь возможность сделать что-то вроде приведения сотрудников компании в цикл к одному сотруднику, а затем сделать что-то вроде

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

Может кто-нибудь дать какое-нибудь руководство?

Спасибо

Ответы [ 3 ]

3 голосов
/ 02 августа 2010

версия 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";
}
2 голосов
/ 02 августа 2010

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

Кроме того, в зависимости от семантики, которую вы ищете, вы можете

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

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

2 голосов
/ 02 августа 2010
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, в вашем случае, только проверяет, является ли аргумент нулевым, поскольку он гарантированно будет установлен (это аргумент).

...