Lee Ward
Lee Ward

Reputation: 43

Calling a PHP class from within another class

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

Answers (4)

iNDicator
iNDicator

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

Gordon
Gordon

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

zaf
zaf

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

jturolla
jturolla

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

Related Questions