无法在PHP中调用类的函数

时间:2011-02-02 18:59:29

标签: php oop

我有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();

在每个班级?

http://pastebin.com/HHyQfvhW

2 个答案:

答案 0 :(得分:2)

您可能没有看到错误,因为

class class3 {
    __construct() {
        $this->class2 = new class2;
        $this->class2->sanity();
    }
}

包含解析错误。也就是说,您需要编写function __construct()。因此,打开error_reportingini_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(以防止错误)。