Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.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

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
Php 创建两个相互使用的类?_Php_Oop - Fatal编程技术网

Php 创建两个相互使用的类?

Php 创建两个相互使用的类?,php,oop,Php,Oop,在消息传递项目中,我有两个类,number和message。第一个类做关于数字的事情,第二个类做消息处理 number->recive()应该调用message->getPass()。 然后message->getPass应该生成一个密码,并使用message->send()将其回复给用户 有很多这样的情况,我希望这个班在那个里,那个在这个 我在message类的构造函数中尝试了$this->number=newnumber(),反之亦然, 但出现了一个致命错误:允许的内存大小33554432字

在消息传递项目中,我有两个类,number和message。第一个类做关于数字的事情,第二个类做消息处理

number->recive()
应该调用
message->getPass()
。 然后
message->getPass
应该生成一个密码,并使用
message->send()
将其回复给用户

有很多这样的情况,我希望这个班在那个里,那个在这个

我在message类的构造函数中尝试了
$this->number=newnumber()
,反之亦然, 但出现了一个致命错误:允许的内存大小33554432字节已用尽(尝试分配65488字节)

我认为错误的原因很明显,我造成了一个无限的实例化循环

有没有办法让两个类互相使用? 正确的方法是什么

谢谢

编辑0:感谢您的快速回答/评论

编辑1: 我看到这个问题,我不知道这些星号到底是什么意思,如果我能在php中使用它

编辑2: 关于导致错误的代码,请简单介绍:

test.php:

include_once './number.php';
$number  = new number();
$number->recive();
number.php:

include_once './message.php';
class number {

    public function __construct($numberId = NULL) {
        $this->message = new message();
        $this->pdo = new PDO("mysql:host=localhost;dbname=madb", "root", "root");
    }
    ...
}
message.php:

class message {

    protected $pdo, $rows, $sql, $number;

    public function __construct($messageId = NULL) {
        $this->number = new number();
        $this->pdo = new PDO("mysql:host=localhost;dbname=madb", "root", "root");
    }
    ...
}
Edid 3:

某种解决方案可能是这样的:

向每个类添加
load
方法:

public function load($className) {
    require_once $className . '.php';
    $this->{$className} = new $className();
}

所以你应该调用
$this->load('number')
在我需要的时候从number.php加载number类,然后以这种方式使用它
$this->number->numberMethod()

我建议你——正如jeff在评论中所说的那样——创建第三个使用这两个类的类

但是,您的问题的快速解决方案是:

消息类:

private $number;

public function __construct() {
  $this->number = new Number($this);
}
编号类别:

private $message;

public function __construct($msg) {
  $this->message = $msg;
}

您可以将一个或两个类都设置为singleton,这样就不需要多次构造其中一个。。。将一个静态getInstance()方法添加到这两个方法中,该方法要么返回以前构造的实例,要么返回新实例。。。查找“singleton模式”,您将看到它是如何工作的。

创建一个使用另一个类的第三个类可能?为什么不使用extends?@Webinan您的意思不是说
number->send()
而不是
message->send()
?@pregmatch那么哪一个应该扩展另一个?数字类方法依赖于消息类方法,而消息类方法依赖于数字类方法@Webinan要了解依赖注入的良好解释,请参阅。是的,第三个类。在快速解决方案中,$msg应该是什么?message类的实例?@Webinan如果你遇到致命错误,那是你自己的错,只是不加思考地复制/粘贴。@Bart我知道这是我的错,我没有报告PHP错误!我没有复制/粘贴任何内容,我只是想知道如何拥有这样的功能,而这段代码就是我的方法。@Webinan是的,$msg是Message类的一个实例。你已经试过我的代码了吗?在test.php中,必须实例化消息对象,而不是数字对象!(@Bart:我有没有漏掉任何评论?你为什么评论我的答案?我只是好奇。)我刚上了第三节课!我在PDO实例中查找并使用了singleton模式,在其他一些情况下,感谢您的建议/cc@webinan这是一个可怕的建议,正确的方法是“不要使用,或者”像瘟疫一样避免它们。一旦你更好地掌握了面向对象编程,你就可以用它们进行实验,找出它们不好的原因,但现在就忘了它们的存在。@Webinan,没有一个单例模式意味着给定类只能存在一个实例,并且有效地防止了子类化/替换,这正是任何人想要首先使用OOP的全部原因。