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:26] – Add inner workings 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 66: Line 66:
  
 ==== Example: Without exceptions ==== ==== Example: Without exceptions ====
-This could be a way for people preferring not to use exceptions and instead to exit the script directly, but get a clean stacktrace instead of just the fatal error message:+This could be a way for people preferring not to use exceptions and instead to exit the script directly, but get a stacktrace instead of just the fatal error message:
  
 <PHP> <PHP>
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 =====
rfc/catchable-call-to-member-of-non-object.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1