在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搜索时我总是会来这里!
答案 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)
members
是system
的对象属性,也是包含方法memberID()
的对象。
要为您的对象指定属性,只需执行以下操作:
class System {
function __construct() {
$this->members = new Members();
}
// etc
}
或
$systemObj = new System();
$systemObj->members = new Members();
这实际上取决于您希望使用的上下文:)
正如@markus所提到的,如果您从外部访问属性,则必须将属性声明为公共属性。此外,使用setter / getter通常要好得多......