I have 4 classes. When someone goes to printHi.php, it prints “hi” twice–from different classes. 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?
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
functiondeclaration. This should be a fatal parse errorClass1’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
Class2available to all your classes, I’d suggest Dependency Injection. So: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.requirewill end execution for you if it fails. theor diebit is redundent.The
sanity()method onConfigis declared asstatic, 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 callFoo::bar()if bar is an instance method and vise versa.Your todo is wrong, since
require 'foo' or die()is working how it should.ORhas the higher precidence, so that’s why you getrequire 1since it’s interpreted asrequire ('foo' or die())…Finally, don’t use
requireblindly like this. Instead, either autoload you classes, or userequire_oncein case a file was already required (to prevent errors).