Быстрый ООП Вопрос - PHP - PullRequest
3 голосов
/ 07 мая 2011

В ООП иногда вы видите что-то похожее на это:

$memberID = $system->members->memberID();

Я был удивлен и совершенно сбит с толку с той стороны, где это ->members->... Как это работает?

Например, допустим, у меня есть класс, который я вызываю и который называется $systems, тогда как я могу поставить ->members-> после него для запуска класса members?

Я только знаю, как сделать что-то вроде этого:

$system = new system();
$memberID = $system->memberID();

Но я хотел бы знать, как это сделать:

$system = new system();
$memberID = $system->members->memberID();

Спасибо!

- ОБНОВЛЕНИЕ - Вот небольшое обновление, спасибо всем, кто помог мне так далеко!Вы, ребята, действительно указали мне правильное направление, у меня действительно есть отличный ответ на мой собственный вопрос!:) И благодаря модератору, который редактировал этот вопрос, мне жаль, что я не был знаком с синтаксисом bbcode.

Я хотел, чтобы что-то автоматически создавало новые классы, например, вызывая -> members->будет автоматически включен с помощью __get (), а не вручную вставлять что-то вроде «новые члены ()».Немного сложно объяснить, но я надеюсь, что вы поняли основы.

В любом случае, вот код, который я использую:

<? class system {

public function __get($name){
    $file = 'lib/'.$name;
    if(file_exists($file)){
        require_once($file);
        $classname = $name;
        $this->$name = new $classname($this);
        return $this->$name;
    }else{
        die('Class '.$name.' could not be loaded (tried to load class-file '.$file.')');
    }
}

}?>

Теперь, если бы я что-то сделал, строчки этого:

$system = new system();
$system->members->functionHere();

Это автоматически создаст новый экземпляр класса members и потребует файл из папки lib.

Если это противоречит правилам, то я прошу прощения.Я просто хотел опубликовать это для всех, кто сталкивался с этим вопросом при поиске в Google, потому что я знаю, что всегда попадаю сюда, когда что-то гуглю!

Ответы [ 3 ]

3 голосов
/ 07 мая 2011

переменная $system содержит объект со свойством с именем $members, который сам содержит объект, обладающий свойством $memberID

$system = new system();
$system->members = new Members(); // or whatever it must be
$system->members->memberId();
1 голос
/ 07 мая 2011

Когда вы видите что-то подобное, вы знаете, что кто-то, скорее всего, сделал что-то не так!

Чтобы этот код работал, вам нужно предоставить открытый доступ к переменной-члену объекта (прежнее хранение объекта).

Предоставление публичного доступа к такой переменной-члену в большинстве случаев является плохой практикой.Переменная должна быть доступна только через геттер (по крайней мере, она все равно будет нарушать LoD).

Этот код нарушает принцип инкапсуляции и LoD (Закон Деметры).

[РЕДАКТИРОВАТЬ]

Почему это почти наверняка ошибка:

A) Предоставление прямого публичного доступа к переменным-членам в большинстве случаев является ошибкой, поскольку делает публичный интерфейс вашего классажесткий (трудно изменить).Если у вас есть получатель, вы можете изменить реализацию члена в любое время, получатель останется прежним, и вам не нужно будет изменять вызов из любого места. Вы НИКОГДА не можете написать прокси для прямого доступа к переменной!С другой стороны, написать прокси для геттера очень просто!

B) Предоставление прямого публичного доступа к переменным-членам в большинстве случаев является ошибкой, поскольку вы позволяете всем говорить с классом внутри класса напрямую!Это, скорее всего, приведет к более высоким затратам на обслуживание при изменении общедоступного интерфейса любого из этих двух классов.

[/ EDIT]

0 голосов
/ 07 мая 2011

members - это свойство объекта system, а также объект, содержащий метод memberID().

Чтобы назначить свойство вашему объекту, просто сделайте что-то вроде этого:

class System {
  function __construct() {
    $this->members = new Members();
  }

  // etc
}

или

$systemObj = new System();
$systemObj->members = new Members();

Это действительно зависит от контекста, который вы хотите использовать:)

Как упоминалось @markus, свойства должны быть объявлены общедоступными, если вы обращаетесь к ним извне,Кроме того, использование сеттеров / геттеров часто намного лучше ...

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