我有4节课。当有人去printHi.php时,它会打印两次“hi” - 来自不同的类。但是:
printHi.php
include('main.php');
$main = new Main;
main.php:
class Main {
function __construct() {
include('class2.php');
include('class3.php');
$this->class2 = new class2;
$this->class3 = new class3;
$this->class2->sanity();
}
}
class2.php
class class2 {
public function sanity() {
echo "Hi.";
}
}
class3.php
class class3 {
function __construct() {
$this->class2 = new class2;
$this->class2->sanity();
}
}
没有输出显示(或错误)?我做错了什么?
另外,如果我想在所有课程中使用sanity(),那么如果不这样做我会怎么做呢
$this->class2 = new class2;
$this->class2->sanity();
在每个班级?
答案 0 :(得分:2)
您可能没有看到错误,因为
class class3 {
__construct() {
$this->class2 = new class2;
$this->class2->sanity();
}
}
包含解析错误。也就是说,您需要编写function __construct()
。因此,打开error_reporting
和ini_set
等错误的方法将无效,因为脚本由于解析错误而永远不会运行。因此,请查看php.ini文件并在其中设置error_reporting和display_errors指令。完成后,您应该会看到错误消息。
答案 1 :(得分:2)
正在抛出错误。您可能有error_reporting turned off并且看到一个空白屏幕,但它们正在被提升。以下是我可以看到的错误列表:
Class3的构造函数缺少function
声明。这应该是一个致命的解析错误
function __construct() {
Class1的构造函数尝试在非对象sanity()
上调用方法$this->class
。这应该是一个致命的错误。
所以,显然这不是你的实际代码。假设您刚刚讨论的是为所有课程提供Class2
,我建议使用依赖注入。所以:
class Main {
public function __construct(class2 $class2, Class3 $class3) {
$this->class2 = $class2;
$this->class3 = $class3;
$this->class2->sanity();
}
}
class Class2 {
public function sanity() {...}
}
class Class3 {
public function __construct(Class2 $class2) {
$this->class2 = $class2;
}
}
这样,所有内容都会传入。它更灵活,更易于理解和调试,远更容易测试。
修改:根据链接代码:
有一些问题。
注入您的依赖项。不要只是在各处创建新的类实例(硬编码关系)
正确缩进代码。可读性是王道。 始终缩进。
require() or die()
毫无意义。如果失败,require
将结束执行。 or die
位是redundent。
sanity()
上的Config
方法被声明为static
,但您尝试在实例上调用它。弄清楚它是否与实例绑定(需要使用$this
),并使其适当。然后只适当地调用它。如果bar是实例方法,请不要调用Foo::bar()
,反之亦然。
你的待办事项是错误的,因为require 'foo' or die()
正在发挥作用。 OR
具有较高的预测性,因此您获得require 1
因为它被解释为require ('foo' or die())
...
最后,不要盲目地使用require
。相反,要么自动加载类,要么在需要文件时使用require_once
(以防止错误)。