Доступ к члену объекта в классе в PHP - PullRequest
0 голосов
/ 22 апреля 2009

Мой код:

class Address{
   public var $Street;
}

class Employee{
    public var $ID:
    public var $Name:
    public var $Address;
}

$myEmployee = new Employee();
$myEmployee->Address = new Address();

Как мне теперь выйти на улицу?

$street = $myEmployee->$Address->Street;
$street = $myEmployee->Address->Street;

Оба дают мне предупреждения в «Затмении». Я думал о:

$street = $myEmployee['Address']->Street;

Это правильно?

Ответы [ 6 ]

5 голосов
/ 22 апреля 2009

Как уже было сказано, ваше предложение использовать:

$street = $myEmployee->Address->Street;

совершенно правильно. Однако в вашем коде есть несколько ошибок, которые могли вызвать проблемы. Во-первых, публичные переменные-члены либо объявляются так:

public $id;

или это (устарело):

var $id;

Ваша комбинация двух недопустима в коде PHP.

Также у вас есть два двоеточия (:) в конце строки, которые должны быть точками с запятой (;).

Надеюсь, это поможет!

5 голосов
/ 22 апреля 2009
$myEmployee->Address->Street;

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

Также затмение не поддерживает автоматическое завершение того, что вам нужно сделать.

3 голосов
/ 22 апреля 2009
$street = $myEmployee->Address->Street;

должно работать. В любом случае, на что жалуется Eclipse?

0 голосов
/ 22 апреля 2009

Причиной отсутствия завершения кода Eclipse является то, что для завершения кода требуется информация о типе.

В PHP это достигается либо с помощью подсказок типа и комментируемых аннотаций.

Я не уверен, какой плагин Eclipse вы используете, но если это PDT, ознакомьтесь с руководством по помощи кода :

Простая аннотация комментария:

Над сотрудником вы можете добавить:

/**
 * @property Address $Address
 */
class Employee 
....
0 голосов
/ 22 апреля 2009

Альтернативой может быть использование методов доступа и личных данных:

class Address {
   private $Street;

   public function __construct() {}

   public function setStreet($Street) {
       $this->Street = $Street;
   }

   public function getStreet() {
      return $this->Street;
   }
}

/* ... same for Employee ... */

$myEmployee = new Employee();
$myEmployee->setAddress(new Address());

$street = $myEmployee->getAddress()->getStreet();

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

Рефакторинг будет проще, и это также избавит вас от предупреждений.

0 голосов
/ 22 апреля 2009

Почему бы вам не создать адрес в конструкторе класса Employee? Я предполагаю, что в конечном итоге вы создадите более одного сотрудника, и вместо того, чтобы каждый раз иметь две строки для создания сотрудника и адреса, вы можете просто создать сотрудника и наслаждаться тем, что адрес уже был создан и хранится в $ myEmployee-> Address.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...