首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速OOP问题- PHP

快速OOP问题- PHP
EN

Stack Overflow用户
提问于 2011-05-08 02:30:08
回答 3查看 244关注 0票数 3

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

代码语言:javascript
复制
$memberID = $system->members->memberID();

我想知道->members->...是如何工作的,我对此感到非常困惑。

例如,假设我调用了一个名为$systems的类,那么我如何将->members->放在它后面来运行members类?

我只知道如何做这样的事情:

代码语言:javascript
复制
$system = new system();
$memberID = $system->memberID();

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

代码语言:javascript
复制
$system = new system();
$memberID = $system->members->memberID();

谢谢!

--更新--这里有一个小小的更新,感谢到目前为止帮助我的每一个人!你们真的给我指明了正确的方向,实际上我对我自己的问题有了一个很好的答案!:)感谢编辑这个问题的版主,很抱歉我不熟悉bbcode语法。

我想要一些东西来自动生成新的类,例如调用->members->将使用__get()自动包括在内,而不是必须手动放入"new members()“之类的东西。对我来说,解释起来有点困难,但我希望你已经掌握了它的基本知识。

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

代码语言:javascript
复制
<? 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.')');
    }
}

} ?>

现在,如果我要做的事情是这样的:

代码语言:javascript
复制
$system = new system();
$system->members->functionHere();

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

如果这是违反规定的,那么我道歉。我只是想给那些在搜索谷歌时遇到这个问题的人贴上这篇文章,因为我知道我在谷歌上搜索东西的时候总是会出现在这里!

EN

回答 3

Stack Overflow用户

发布于 2011-05-08 02:32:38

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

代码语言:javascript
复制
$system = new system();
$system->members = new Members(); // or whatever it must be
$system->members->memberId();
票数 3
EN

Stack Overflow用户

发布于 2011-05-08 02:36:53

当你看到这样的事情时,你就知道有人很可能做错了什么!

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

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

这段代码破坏了封装原则和LoD (迪米特定律)。

编辑

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

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

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

/EDIT

票数 1
EN

Stack Overflow用户

发布于 2011-05-08 02:35:19

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

要将属性分配给对象,只需执行以下操作:

代码语言:javascript
复制
class System {
  function __construct() {
    $this->members = new Members();
  }

  // etc
}

代码语言:javascript
复制
$systemObj = new System();
$systemObj->members = new Members();

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

正如@markus所提到的,如果要从外部访问属性,则必须将属性声明为public。而且,使用setters/getters通常要好得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5923148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档