Reputation: 43
really simple one I'm guessing but why does the below not work? I'm guessing it's a scope thing where class2 isn't visible from within class1. Yes, I'm getting "Call to member function on a non-object" error.
class class1 {
function func1() {
$class2->func3();
}
function func2() {
$this->func1();
}
}
class class2 {
function func3() {
echo "hello!";
}
}
$class1 = new class1();
$class2 = new class2();
$class1->func1;
If anyone can give me a fix for this I'd be very grateful. I've been searching around for a while but I'm getting lots of examples of others trying to instantiate new classes inside other classes and similar and not this particular problem I have.
You'd be right in thinking I don't do a whole lot with classes!
Upvotes: 4
Views: 12357
Reputation: 534
I recommend you take a look at static functions/attributes. Basically you do not need to instantiate class2, you just have to define the function inside it as static. Take a look at the following implementation:
<?php
class class1 {
function func1() {
class2::func3();
}
function func2() {
$this->func1();
}
}
class class2 {
public static function func3() {
echo "hello!";
}
}
$class1 = new class1();
$class1->func1();
?>
Its always nice to avoid instantiating objects as much as possible.
Upvotes: 2
Reputation: 316969
PHP does not bubblescope like JavaScript does, so your $class2
is undefined:
The scope of a variable is the context within which it is defined. For the most part all PHP variables only have a single scope. This single scope spans included and required files as well […] Within user-defined functions a local function scope is introduced. Any variable used inside a function is by default limited to the local function scope.
Source: http://php.net/manual/en/language.variables.scope.php
In other words, there is only the global scope and function/method scope in PHP. So, either pass the $class2
instance into the method as a collaborator
class class1
{
function func1($class2) {
$class2->func3();
}
}
$class1 = new class1();
$class2 = new class2();
$class1->func1($class2);
or inject it via the constructor:
class class1
{
private $class2;
public function __construct(Class2 $class2)
{
$this->class2 = $class2;
}
function func1()
{
$this->class2->func3();
}
}
$class2 = new class2();
$class1 = new class1($class2);
$class1->func1();
Upvotes: 7
Reputation: 23244
Two things:
Add brackets to the function call & use global to get the variable into scope
class class1 {
function func1() {
global $class2; // Get variable into scope
$class2->func3();
}
function func2() {
$this->func1();
}
}
class class2 {
function func3() {
echo "hello!";
}
}
$class1 = new class1();
$class2 = new class2();
$class1->func1(); // Add brackets for function call
Upvotes: 0
Reputation: 6746
class class1 {
function func1() {
//Initialize before using it.
$class2 = new class2();
$class2->func3();
}
function func2() {
$this->func1();
}
}
class class2 {
function func3() {
echo "hello!";
}
}
Upvotes: 0