开发者

Cannot call class's function in PHP

I have 4 classes. When someone goes to printHi.php, it prints "hi" twice--from different cl开发者_如何转开发asses. However:

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

No ouput shows (or errors)? What am I doing wrong?

Also, if I wanted to use sanity() in all of my classes, how would I do that without doing

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

in every class?

http://pastebin.com/HHyQfvhW


Errors are being thrown. You might have error_reporting turned off and be seeing a blank screen, but they are being raised. Here's a list of errors from what I can see:

  • Class3's constructor is missing the function declaration. This should be a fatal parse error

    function __construct() {
    
  • Class1's constructor tries to call the method sanity() on the non-object $this->class. This should be a fatal error.

So, obviously this isn't your actual code. Assuming that you're just talking about making Class2 available to all your classes, I'd suggest Dependency Injection. So:

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

That way, everything is passed in. It's far more flexible, easier to understand and debug, and far easier to test.

Edit: Based upon the linked code:

There are a few issues.

  • Inject your dependencies. Don't just create new instances of classes everywhere (hardcoding relationships)

  • Indent your code properly. Readability is king. always indent.

  • require() or die() is pointless. require will end execution for you if it fails. the or die bit is redundent.

  • The sanity() method on Config is declared as static, yet you're trying to call it on an instance. Figure out if it's tied to an instance (needs to use $this) or not, and make it appropriately. Then only call it appropriately. Don't call Foo::bar() if bar is an instance method and vise versa.

  • Your todo is wrong, since require 'foo' or die() is working how it should. OR has the higher precidence, so that's why you get require 1 since it's interpreted as require ('foo' or die())...

  • Finally, don't use require blindly like this. Instead, either autoload you classes, or use require_once in case a file was already required (to prevent errors).


You are not seeing errors likely because

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

contains a parse error. Namely, you need to write function __construct(). Because of this, methods to turn on errors such as error_reporting and ini_set will not work because the script never runs due to the parse error. Therefore, look to your php.ini file and set the error_reporting and display_errors directives there. After having done that, you should see your error messages.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜