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:

[pastacode lang=”php” manual=”%24gcm%20%3D%20new%20GCM()%3B%20%0A” message=”Php Code” highlight=”” provider=”manual”/]

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

[pastacode lang=”php” manual=”%24result%20%3D%20%24gcm-%3Esend_notification(%24registatoin_ids%2C%20%24message)%3B%20%0A” message=”Php Code” highlight=”” provider=”manual”/]

That’s where we get the error:

[pastacode lang=”php” manual=”%3Cbr%20%2F%3En%3Cb%3EFatal%20error%3C%2Fb%3E%3A%20Call%20to%20a%20member%20function%20send_notification()%20on%20a%20non-object%20in..%20%0A” message=”Php Code” highlight=”” provider=”manual”/]

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:

[pastacode lang=”php” manual=”%2F%2F%20…%20some%20code%20using%20PDO%0A%24statement%20%3D%20%24pdo-%3Eprepare(‘invalid%20query’%2C%20…)%3B%20%24statement-%3Eexecute(…)%3B%20%0A” message=”Php Code” highlight=”” provider=”manual”/] [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:

[pastacode lang=”php” manual=”class%20Demand()%20%7B%0A%20%2F**%20*%20Declare%20the%20variable%20as%20a%20property%20of%20the%20class%20here%20*%2F%0A%20public%20%24gcm%3B%0A%0A%20…%20%0Afunction%20__construct()%0A%20%7B%20%0A…%20%0A%24this-%3Egcm%20%3D%20new%20GCM()%3B%0A%20…%20%0A%7D%20%0Afunction%20myFunction()%0A%20%7B%20%0A…%20%0A%2F%2F%20You%20can%20access%20the%20GCM%20class%20now%20in%20any%20other%20method%20in%20Demand%20class%20like%20so%3A%0A%20%24result%20%3D%20%24this-%3Egcm-%3Esend_notification(%24registatoin_ids%2C%20%24message)%3B%20…%20%7D%0A%20…%20%7D%20%0A” message=”Php Code” highlight=”” provider=”manual”/]


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

[pastacode lang=”php” manual=”class%20Demand%20%0A%7B%0A%20private%20%24_gcm%3B%20function%20__construct()%20%0A%7B%20%0A%24this-%3E_gcm%20%3D%20new%20GCM()%3B%20%0A%7D%20%0Afunction%20youWantToUseGcmIn()%0A%20%7B%0A%20%24this-%3E_gcm-%3Esend_notification(…..)%3B%0A%20%2F%2F%20access%20it%20like%20this%0A%20%7D%20%0A%7D%20%0A” message=”Php Code” highlight=”” provider=”manual”/] [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: