快速OOP问题 - PHP

时间:2011-05-07 18:30:08

标签: php oop class function

在OOP中,有时你会看到类似的东西:

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

我对它所在的部分感到疑惑和困惑->members->...这是如何工作的?

例如,假设我有一个名为$systems的类,那么如何在其后面放->members->来运行成员类?

我只知道如何做到这一点:

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

但我想知道如何做到这一点:

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

谢谢!

- 更新 - 这是一个小小的更新,感谢所有帮助我的人!你们真的指出了我正确的方向,我真的对我自己的问题有一个很好的答案! :)感谢版主编辑了这个问题,对不起,我对bbcode语法并不熟悉。

我想要自动创建新课程,例如调用 - > members->将使用__get()自动包含,而不必手动输入类似“new members()”的内容。我有点难以解释,但我希望你掌握它的基础知识。

无论如何,这是我使用的代码:

<? 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.')');
    }
}

}?&gt;

现在,如果我要采取以下措施:

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

它会自动创建一个成员类的新实例,并需要lib文件夹中的文件。

如果这违反规则,那么我道歉。我只是想在搜索Google时遇到这个问题的任何人发布这个帖子,因为我知道在Google搜索时我总是会来这里!

3 个答案:

答案 0 :(得分:3)

$system变量包含一个对象,该对象具有一个名为$members的属性,该属性本身包含一个具有属性$memberID的对象

$system = new system();
$system->members = new Members(); // or whatever it must be
$system->members->memberId();

答案 1 :(得分:1)

当你看到类似的东西时,你知道有人很可能做错了什么!

为了使此代码有效,您需要授予对象的成员变量的公共访问权限(前者存储对象)。

在大多数情况下,授予对此类成员变量的公共访问权限是不好的做法。该变量只能通过getter访问(至少,它仍然会违反LoD)。

此代码打破了封装原理和LoD(Demeter法则)。

[编辑]

为什么这几乎肯定是一个错误:

A)授予对成员变量的直接公共访问权限在大多数情况下都是错误的,因为会使您的类的公共接口变得严格(难以更改)。如果你有一个getter,你可以随时更改成员的实现,getter仍然是相同的,你不需要从任何地方更改调用。 您永远不能编写代理来直接访问变量!另一方面,为getter编写代理很容易!

B)在大多数情况下,授予对成员变量的直接公共访问权是一个错误,因为你让所有人直接与课堂内的课程对话!当这两个类中的任何一个的公共接口发生变化时,这很可能会导致更高的维护成本

[/编辑]

答案 2 :(得分:0)

memberssystem的对象属性,也是包含方法memberID()的对象。

要为您的对象指定属性,只需执行以下操作:

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

  // etc
}

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

这实际上取决于您希望使用的上下文:)

正如@markus所提到的,如果您从外部访问属性,则必须将属性声明为公共属性。此外,使用setter / getter通常要好得多......

相关问题