rfc:catchable-call-to-member-of-non-object

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
rfc:catchable-call-to-member-of-non-object [2014/04/28 01:02] thekidrfc:catchable-call-to-member-of-non-object [2014/04/29 07:29] – Reference Return type hinting RFC thekid
Line 1: Line 1:
  
 ====== PHP RFC: Catchable "call to a member function of a non-object" ====== ====== PHP RFC: Catchable "call to a member function of a non-object" ======
-  * Version: 1.0+  * Version: 1.1
   * Date: 2014-04-26   * Date: 2014-04-26
   * Author: Timm Friebe <thekid@php.net>   * Author: Timm Friebe <thekid@php.net>
Line 82: Line 82:
 ==== Differences from Past RFCs ==== ==== Differences from Past RFCs ====
 This proposal doesn't go as far as the controversial RFC [[engine_exceptions|RFC: Engine exceptions]]. This proposal doesn't go as far as the controversial RFC [[engine_exceptions|RFC: Engine exceptions]].
 +
 +==== Inner workings ==== 
 +
 +Taken this code:
 +
 +<PHP>
 +function a($comparator) {
 +  $result= $comparator->compare(1, 2);
 +  // ...
 +}
 +</PHP>
 +
 +You can unwind this to something like:
 +
 +  function a($comparator) {
 +    1: ZEND_INIT_METHOD_CALL $comparator 'compare'
 +    2: ZEND_SEND_VAL         1
 +    3: ZEND_SEND_VAL         2
 +    4: ZEND_DO_FCALL_BY_NAME
 +    5: ZEND_ASSIGN           $result
 +    // ...
 +  }
 +
 +The handling on checking whether the method is callable happends inside
 +the opline #1 (''ZEND_INIT_METHOD_CALL''). The opcode handler for it 
 +checks its first argument (here: ''$comparator'') whether it is an object
 +or not. In case it's not, the following happens:
 +
 +  - A recoverable error is triggered. Should the script exit here, there's nothing more to be done, this is just as it was before.
 +  - In case the script continues, all the oplines are skipped until we find the ''FCALL_BY_NAME'' opcode. This is comparable to jumping forward just as, e.g., the ''ZEND_JMP'' instruction would.
 +  - The return value is set to ''ZVAL_NULL()''.
 +  - The control is handed back to the executor, which then continutes with the ''ASSIGN'' opcode.
  
 ===== Other Impact ===== ===== Other Impact =====
Line 116: Line 148:
   * HHVM [[https://github.com/facebook/hhvm/blob/master/hphp/test/quick/method-non-object.php.expectf|throws a BadMethodCallException]] in these situations    * HHVM [[https://github.com/facebook/hhvm/blob/master/hphp/test/quick/method-non-object.php.expectf|throws a BadMethodCallException]] in these situations 
   * [[http://news.php.net/php.internals/73814|Mailing list announcement]]   * [[http://news.php.net/php.internals/73814|Mailing list announcement]]
 +  * [[rfc/returntypehinting|Return type hinting RFC]] - related work: Some fatal errors can be prevented by setting return types.
rfc/catchable-call-to-member-of-non-object.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1