Reputation: 1315
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?
Upvotes: 0
Views: 2987
Reputation: 165271
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).
Upvotes: 2
Reputation: 14329
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.
Upvotes: 2