Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
快速OOP问题-PHP_Php_Oop_Class_Function - Fatal编程技术网

快速OOP问题-PHP

快速OOP问题-PHP,php,oop,class,function,Php,Oop,Class,Function,在OOP中,有时您会看到类似的情况: $memberID = $system->members->memberID(); 我很好奇,也完全搞不清楚它在哪里,->members->……这是怎么回事 例如,假设我调用了一个名为$systems的类,那么如何将->members->放在它后面以运行members类 我只知道如何做这件事: $system = new system(); $memberID = $system->memberID(); $system = new s

在OOP中,有时您会看到类似的情况:

$memberID = $system->members->memberID();
我很好奇,也完全搞不清楚它在哪里,
->members->……
这是怎么回事

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

我只知道如何做这件事:

$system = new system();
$memberID = $system->memberID();
$system = new system();
$system->members->functionHere();
但我想知道如何做到这一点:

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

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

我想要一些能够自动生成新类的东西,例如调用->成员->将使用“\uu 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.')');
    }
}
它将自动创建members类的新实例,并需要lib文件夹中的文件


如果这违反了规则,我道歉。我只是想把这篇文章发给在谷歌搜索时遇到这个问题的人,因为我知道我在谷歌搜索的时候总是在这里登陆

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

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

members
system
的对象属性,也是包含方法
memberID()
的对象

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

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

  // etc
}

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


正如@markus提到的,如果您从外部访问属性,则必须将其声明为公共。另外,使用setter/getter通常更好

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

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

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

该代码打破了封装原则和LoD(德米特定律)

[编辑]

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

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

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


[/EDIT]

除了对变量做额外的工作之外,我认为没有理由使用getter——它是一个无用的中间人。当你在得到一个变量后对它执行某个过程,但是让一个函数访问一个变量,并且为此不得不对所有东西进行不同的命名时,这是可以理解的?@Zirak:你显然不理解封装的原理和德米特定律。你也没有比“现在”想得更远,这是工程上的一个大错误@Zirak你只是个新手。了解更多关于封装和接口的信息。例如,这本书:@Galen:你愿意解释一下你的分歧吗?
$systemObj = new System();
$systemObj->members = new Members();