不能在PHP中调用类的功能我有4个类,在PHP中是

问题描述:

。当有人去printHi.php时,它会打印两次“hi” - 来自不同的类。但是:不能在PHP中调用类的功能我有4个类,在PHP中是

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(); 
    } 
} 

不输出显示(或错误)?我究竟做错了什么?

另外,如果我想用理智()在所有我的班,我将如何做,没有在每个班级做

$this->class2 = new class2; 
$this->class2->sanity(); 

?可能

http://pastebin.com/HHyQfvhW

+0

将`error_reporting(0)`添加到应用程序的第一行以查看错误,它看起来像ini文件中的默认错误报告。 – RobertPitt 2011-02-02 19:09:34

错误正在抛出。您可能有error_reporting turned off,并且看到一个空白屏幕,但它们正在提出。以下是我可以看到的错误列表:

  • Class3的构造函数缺少function声明。这应该是一个致命解析错误

    function __construct() { 
    
  • 1类的构造函数试图调用该方法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位是重复的。

  • Config上的sanity()方法声明为static,但您试图在实例上调用它。找出它是否与实例绑定(需要使用$this),并将其适当地设置。然后只适当地调用它。如果bar是实例方法,则不要调用Foo::bar(),反之亦然。

  • 你的待办事项是错误的,因为require 'foo' or die()正在工作应该如何。 OR具有较高的precidence,所以这就是为什么你require 1因为它解释为require ('foo' or die()) ...

  • 最后,不要使用require一味这样。相反,要么自动加载您的课程,要么在文件已被要求的情况下使用require_once(以防止错误)。

+0

这是我的真实代码。我不想将它放在原始文章中,因为它很长,但是您提到的一些拼写错误不在我的真实代码中。 http://pastebin.com/HHyQfvhW – 2011-02-02 19:13:00

您没有看到错误,因为

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

包含语法错误。即,您需要编写function __construct()。因此,打开错误(如error_reportingini_set)的方法将不起作用,因为脚本从未因分析错误而运行。因此,请查看您的php.ini文件,并在其中设置error_reporting和display_errors指令。完成后,你应该看到你的错误信息。