在OOP中,有时你会看到类似这样的东西:
$memberID = $system->members->memberID();我想知道->members->...是如何工作的,我对此感到非常困惑。
例如,假设我调用了一个名为$systems的类,那么我如何将->members->放在它后面来运行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.')');
}
}} ?>
现在,如果我要做的事情是这样的:
$system = new system();
$system->members->functionHere();它将自动创建members类的一个新实例,并需要lib文件夹中的文件。
如果这是违反规定的,那么我道歉。我只是想给那些在搜索谷歌时遇到这个问题的人贴上这篇文章,因为我知道我在谷歌上搜索东西的时候总是会出现在这里!
发布于 2011-05-08 02:32:38
$system变量保存一个对象,该对象具有一个名为$members的属性,该对象本身包含一个具有$memberID属性的对象
$system = new system();
$system->members = new Members(); // or whatever it must be
$system->members->memberId();发布于 2011-05-08 02:36:53
当你看到这样的事情时,你就知道有人很可能做错了什么!
为了让这段代码正常工作,您需要授予对对象的成员变量(前者存储对象)的公共访问权限。
在大多数情况下,授予对此类成员变量的公共访问权限是不好的做法。该变量应该只能通过getter访问(至少,它仍然会违反LoD)。
这段代码破坏了封装原则和LoD (迪米特定律)。
编辑
为什么这几乎可以肯定是一个错误:
A)在大多数情况下,授予对成员变量的直接公共访问权限是错误的,因为会使您的类的公共接口变得严格(很难更改)。如果你有一个getter,你可以随时改变成员的实现,getter仍然是一样的,你不需要从任何地方改变调用。您永远不能编写代理来直接访问变量!另一方面,为getter编写代理是很容易的!
B)在大多数情况下,授予对成员变量的直接公共访问权限是错误的,因为您让每个人直接与类中的类对话!当这两个类的公共接口发生变化时,这很可能会导致更高的维护成本。
/EDIT
发布于 2011-05-08 02:35:19
members是system的对象属性,也是包含memberID()方法的对象。
要将属性分配给对象,只需执行以下操作:
class System {
function __construct() {
$this->members = new Members();
}
// etc
}或
$systemObj = new System();
$systemObj->members = new Members();这真的取决于您希望使用的上下文:)
正如@markus所提到的,如果要从外部访问属性,则必须将属性声明为public。而且,使用setters/getters通常要好得多。
https://stackoverflow.com/questions/5923148
复制相似问题