You have a GCM class which includes a send_notification function. In a different class, Demand.php, we trying to use the send_notification function.

So we have a constructor in Demand.php which points to  GCM class:

Php Code
$gcm = new GCM(); 

This $gcm variable is used in a function inside that class :

Php Code
$result = $gcm->send_notification($registatoin_ids, $message); 

That’s where we get the error:

Php Code
<br />n<b>Fatal error</b>: Call to a member function send_notification() on a non-object in.. 

Inside our function it worked correctly. But is there no other way of doing this? That means should it not be alright only by creating $gcm in the constructor of Demand.php?

Happens with code similar to xyz->method() where xyz is not an object and therefore that method can not be called.

This is a fatal error which will stop the script (forward compatibility notice: It will become a catchable error starting with PHP 7).

Most often this is a sign that the code has missing checks for error conditions. Validate that an object is actually an object before calling its methods.

Example:

Php Code
// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...); $statement->execute(...);
[ad type=”banner”]

In the example above, the query cannot be prepared and prepare() will assign false to $statement.
Trying to call the execute() method will then result in the Fatal Error because false is a “non-object” because the value is a boolean.

Figure out why your function returned a boolean instead of an object. For example, check the $pdo object for the last error that occurred.
Details on how to debug this will depend on how errors are handled for the particular function/object/class.

If even the ->prepare is failing then your $pdo database handle object didn’t get passed into the current scope.
Find where it got defined. Then pass it as a parameter, store it as property, or share it via the global scope.

If we place $gcm = new GCM(); in the constructor of our Demand class, then the variable $gcm will only be available in the constructor method.

If we want to be able to access the $gcm variable throughout the Demand class we will need to set it as a property of the class like so:

Php Code
class Demand() {
/** * Declare the variable as a property of the class here */
public $gcm;

...
function __construct()
{
...
$this->gcm = new GCM();
...
}
function myFunction()
{
...
// You can access the GCM class now in any other method in Demand class like so:
$result = $this->gcm->send_notification($registatoin_ids, $message); ... }
... }


gcm will only be available in the scope of the constructor unless you initialize it as a instance variable.

Php Code
class Demand 
{
private $_gcm; function __construct()
{
$this->_gcm = new GCM();
}
function youWantToUseGcmIn()
{
$this->_gcm->send_notification(.....);
// access it like this
}
}
[ad type=”banner”]

This means $gcm is not an object, probably it’s NULL or false in some cases (nothing found) due to it’s not accessible. Out of scope

Categorized in: