PHP: Calling Methods on Non-Objects

PHP has subtly changed the wording of this error between various versions of the language, which can trip up your log aggregators when you upgrade so I thought I’d give a quick rundown of the changes around the “call to member function on non-object” error in PHP, up to and including PHP 7 which has an entirely new error handling approach.

As an example I’m using this piece of nonsense which just sets $a to be a number and then attempts to call a method on it:

<?php

$a = 1;
$a->grow();

This doesn’t work but the exact output varies between versions of PHP.

In PHP 5.5 (and maybe earlier, I don’t seem to have any of the dead versions compiled on this machine for some reason), the error message reads like this:

Fatal error: Call to a member function grow() on a non-object in /home/lorna/.../method_non_object.php on line 7

So far, so familiar.

In PHP 5.6 the error message got a bit more specific and tells us what kind of a non-object we’re dealing with:

PHP Fatal error: Call to a member function grow() on integer in /home/lorna/.../method_non_object.php on line 7

However in PHP 7, everything changes. Look at the error message output by the exact same sample code:

Fatal error: Uncaught Error: Call to a member function grow() on integer in /home/lorna/.../method_non_object.php:7

This message looks completely different because PHP 7 has a whole new way of handling errors. Not every part of PHP has switched over to the new way but it’s both excellent and quite a big change. The clue in the message which starts with the word “Uncaught”. Usually we’d expect the next word to be “Exception” but in PHP 7 there is a new Error object, which can be intercepted using the catch construct that we’re already familiar with.

I’ll write more about the errors in PHP 7 in a separate post but in the meantime you can read more about them in the manual (this might be my favourite manual page URL): http://php.net/error

2 thoughts on “PHP: Calling Methods on Non-Objects

  1. Pingback: PHP Annotated Monthly – November 2015 | JetBrains PhpStorm Blog

Leave a Reply

Please use [code] and [/code] around any source code you wish to share.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

To respond on your own website, enter the URL of your response which should contain a link to this post's permalink URL. Your response will then appear (possibly after moderation) on this page. Want to update or remove your response? Update or delete your post and re-enter your post's URL again. (Find out more about Webmentions.)