Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.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/9/security/4.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中的s函数_Php_Oop - Fatal编程技术网

无法调用类';PHP中的s函数

无法调用类';PHP中的s函数,php,oop,Php,Oop,我有四节课。当有人访问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;

我有四节课。当有人访问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();
在每节课上


您不会看到错误,因为

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

包含一个分析错误。也就是说,您需要编写
function\uu-construct()
。因此,启用错误的方法(如
error\u reporting
ini\u set
)将不起作用,因为由于解析错误,脚本永远不会运行。因此,请查看php.ini文件,并在其中设置error_reporting和display_errors指令。完成此操作后,您应该会看到错误消息。

您不会看到错误,因为

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

包含一个分析错误。也就是说,您需要编写
function\uu-construct()
。因此,启用错误的方法(如
error\u reporting
ini\u set
)将不起作用,因为由于解析错误,脚本永远不会运行。因此,请查看php.ini文件,并在其中设置error_reporting和display_errors指令。完成此操作后,您应该会看到错误消息。

正在抛出错误。您可能已经看到了一个空白屏幕,但它们正在被提升。以下是我看到的错误列表:

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

    function __construct() {
    
  • Class1的构造函数试图对非对象
    $this->class
    调用方法
    sanity()。这应该是一个致命的错误

所以,很明显,这不是您的实际代码。假设您只是在谈论如何使
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()或die()
    是没有意义的<代码>要求
    如果失败,将为您结束执行。
    或die
    位为redundent

  • Config
    上的
    sanity()
    方法声明为
    static
    ,但您试图在实例上调用它。弄清楚它是否绑定到实例(需要使用
    $this
    )并适当地进行设置。那就只适当地称呼它。如果bar是实例方法,不要调用
    Foo::bar()
    ,反之亦然

  • 您的todo是错误的,因为
    需要'foo'或die()
    正在按它应该的方式工作
    具有更高的精确度,这就是为什么您会得到
    require 1
    ,因为它被解释为
    require('foo'或die())

  • 最后,不要像这样盲目地使用
    require
    。相反,要么自动加载类,要么在已经需要文件的情况下使用一次
    require\u
    (以防止错误)


  • 正在抛出错误。您可能已经看到了一个空白屏幕,但它们正在被提升。以下是我看到的错误列表:

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

      function __construct() {
      
    • Class1的构造函数试图对非对象
      $this->class
      调用方法
      sanity()。这应该是一个致命的错误

    所以,很明显,这不是您的实际代码。假设您只是在谈论如何使
    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()或die()
      是没有意义的<代码>要求
      如果失败,将为您结束执行。
      或die
      位为redundent

    • Config
      上的
      sanity()
      方法声明为
      static
      ,但您试图在实例上调用它。弄清楚它是否绑定到实例(需要使用
      $this
      )并适当地进行设置。那就只适当地称呼它。如果bar是实例方法,不要调用
      Foo::bar()
      ,反之亦然

    • 您的todo是错误的,因为
      需要'foo'或die()
      正在按它应该的方式工作
      具有更高的精确度,这就是为什么您会得到
      require 1
      ,因为它被解释为
      require('foo'或die())

    • 最后,不要像这样盲目地使用
      require
      。相反,要么自动加载类,要么在已经需要文件的情况下使用一次
      require\u
      (以防止错误)


    错误报告(0)
    添加到应用程序的第一行若要查看错误,在ini文件中默认情况下似乎是错误报告。将
    错误报告(0)
    添加到应用程序的第一行若要查看错误,在ini文件中默认情况下似乎是错误报告。这是我的真实代码。我不想把它放在原来的帖子里,因为它很长,但是有一些打字错误