On Wed, Mar 20, 2013 at 3:37 PM, Richard Bradley < richard.brad...@softwire.com> wrote:
> I'd like to patch PHP to make "Call to a member function on a non-object" > an E_RECOVERABLE_ERROR instead of an E_ERROR. > > I have not been able to find any previous discussion of making this > change, but there are several PHP bugs requesting it: > * #51882<https://bugs.php.net/bug.php?id=51882> Call To Member > Function on Non-Object Should Throw An Exception > * #46601<https://bugs.php.net/bug.php?id=46601> > E_RECOVERABLE_ERROR for "Call to a member function on a non-object" > * #51848<https://bugs.php.net/bug.php?id=51848> Non-object method > call errors should be catchable with set_error_handler() > * #63538<https://bugs.php.net/bug.php?id=63538> "Call to > undefined function" should be catchable > > I have read > https://blogs.oracle.com/opal/entry/the_mysterious_php_rfc_process > > I would like to know: > > 1. Do I need to create an RFC for this change, or could I just > create a pull request in GitHub? > > 2. Would anyone object to this change? For example on > backwards-compatibility grounds? > > 3. If I put the effort in to create the RFC and a patch, would it be > likely to be accepted? > > 4. Has anyone attempted this change before and had it rejected, or > given up? > > Technical summary: > > If you make a member function call on a null value (or any other > non-object), a fatal error is raised. This makes it completely impossible > to recover from null-ref errors. > For example, in a Behat test suite, you might write: > $session->getPage()->find('css', '#next')->click() > > If the "find" function returns NULL, then the "->click()" call is fatal. > Your test suite will not be able to continue at the next test, and all > further output will be lost. > > The simple workaround is to check the value before invoking a function, > i.e.: > $button = $session->getPage()->find('css', '#next'); > if (empty($button)) { > throw new Exception("Could not find #next > button"); > } > $button->click() > > However, this is laborious and easy to overlook. The consequences of > forgetting this manual null check seem disproportionately and unnecessarily > severe. > > It would be more convenient if the null dereference was an > E_RECOVERABLE_ERROR, which would allow scripts to convert the error into an > exception, and continue the script at the next suitable point, via a > "catch". > > The documentation for E_ERROR at > http://php.net/manual/en/errorfunc.constants.php says that these errors > are "Fatal run-time errors. These indicate errors that can not be recovered > from, such as a memory allocation problem. Execution of the script is > halted." > > It doesn't seem to me that dereferencing "null" with "->" would be an > error that "can not be recovered from, such as a memory allocation > problem". In fact, the interpreter should be in a very predictable state, > and quite capable of continuing if the user's script requests it. > This error is a much better match for the description of > E_RECOVERABLE_ERROR from the same page: "a probably dangerous error > occurred, but did not leave the Engine in an unstable state" > > See also > http://stackoverflow.com/questions/15502559/php-turn-call-to-a-member-function-on-a-non-object-into-exception > > Thanks for your time, > > > Rich > > > > > Richard Bradley > Tel : 020 7485 7500 ext 3230 | Fax : 020 7485 7575 > > softw i re > Sunday Times Best Small Companies 2012 - 6th in the UK > Web : www.softwire.com<http://www.softwire.com/> | Addr : 325 Highgate > Studios, 53-79 Highgate Road, London NW5 1TL > Softwire Technology Limited. Registered in England no. 3824658. Registered > Office : 13 Station Road, London N3 2SB > 1, yes 2, yes 3, depends on the patch 4, yes, at least there were a couple of discussions in general about removing/converting some of the fatals to recoverable fatas In general there are cases where the cause of the error isn't a fatal one, but it would leave the engine in a half-baked state and usually it is easier to fatal out than implement a proper state recover/reset so that the whole thing won't blow up to your face at the next execution step. ps: there were also https://bugs.php.net/bug.php?id=54195&edit=2 -- Ferenc Kovács @Tyr43l - http://tyrael.hu