2011-05-07 95 views
3

在OOP中,有时你会看到类似这样的:快速OOP的问题 - PHP

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

我想知道和它在哪里->members->...是如何运作的部分完全糊涂了?

例如,假设我有一个叫做$systems的类,那么在它运行成员类后我怎么能把它放在->members->之后呢?

我只知道如何相处的这行做一些事情:

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

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

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

谢谢!

- UPDATE - 这是一个小小的更新,感谢所有帮助过我的人!你们真的把我指向正确的方向,其实我对自己的问题有一个很好的答案! :)感谢编辑这个问题的版主,我很抱歉我不熟悉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(); 

会自动创建成员类的新实例并从lib文件夹中获取文件。

如果这是违反规则,那么我很抱歉。我只是想把这个发布给那些在搜索Google时遇到这个问题的人,因为我知道我在Google上搜索时总是会出现在这里!

回答

3

$system变量持有具有名为$members属性其本身持有具有属性$memberID

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

memberssystem对象属性,并且还包含方法memberID()的物体的目标的对象。

要指定属性的对象,简单地做这样的事情:

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

    // etc 
} 

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

这真的取决于上下文你想使用:)

由于@markus提到,如果您从外部访问属性,则必须声明属性。此外,使用setter/getters往往好得多...

1

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

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

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

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

[编辑]

为什么那么几乎可以肯定是错误:

A)授予对成员变量直接公共访问是在大多数情况下是错误的,因为它使你的类的公有接口刚性(难以改变)。如果你有一个getter,你可以随时改变成员的实现,getter仍然是一样的,你不需要从任何地方改变呼叫。 你永远不会写代理直接访问变量!另一方面写一个getter的代理很容易!

B)直接公开访问成员变量在大多数情况下是错误的,因为你让所有人都直接与类中的类对话!当这两个类别中的任何一个的公共接口发生变化时,这很可能会导致维护成本增加。

[编辑]

+1

什么是downvote? – markus 2011-05-07 18:39:35

+0

做错了什么? – Galen 2011-05-07 18:39:55

+0

@Galen,的确如此! – markus 2011-05-07 18:40:56