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