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 errorfunction __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. theor die
bit is redundent.The
sanity()
method onConfig
is 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.OR
has the higher precidence, so that's why you getrequire 1
since it's interpreted asrequire ('foo' or die())
...Finally, don't use
require
blindly like this. Instead, either autoload you classes, or userequire_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.
精彩评论