135 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| Symfony Debug Extension for PHP 5
 | |
| =================================
 | |
| 
 | |
| This extension publishes several functions to help building powerful debugging tools.
 | |
| It is compatible with PHP 5.3, 5.4, 5.5 and 5.6; with ZTS and non-ZTS modes.
 | |
| It is not required thus not provided for PHP 7.
 | |
| 
 | |
| symfony_zval_info()
 | |
| -------------------
 | |
| 
 | |
| - exposes zval_hash/refcounts, allowing e.g. efficient exploration of arbitrary structures in PHP,
 | |
| - does work with references, preventing memory copying.
 | |
| 
 | |
| Its behavior is about the same as:
 | |
| 
 | |
| ```php
 | |
| <?php
 | |
| 
 | |
| function symfony_zval_info($key, $array, $options = 0)
 | |
| {
 | |
| 
 | |
|     // $options is currently not used, but could be in future version.
 | |
| 
 | |
|     if (!array_key_exists($key, $array)) {
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
|     $info = array(
 | |
|         'type' => gettype($array[$key]),
 | |
|         'zval_hash' => /* hashed memory address of $array[$key] */,
 | |
|         'zval_refcount' => /* internal zval refcount of $array[$key] */,
 | |
|         'zval_isref' => /* is_ref status of $array[$key] */,
 | |
|     );
 | |
| 
 | |
|     switch ($info['type']) {
 | |
|         case 'object':
 | |
|             $info += array(
 | |
|                 'object_class' => get_class($array[$key]),
 | |
|                 'object_refcount' => /* internal object refcount of $array[$key] */,
 | |
|                 'object_hash' => spl_object_hash($array[$key]),
 | |
|                 'object_handle' => /* internal object handle $array[$key] */,
 | |
|             );
 | |
|             break;
 | |
| 
 | |
|         case 'resource':
 | |
|             $info += array(
 | |
|                 'resource_handle' => (int) $array[$key],
 | |
|                 'resource_type' => get_resource_type($array[$key]),
 | |
|                 'resource_refcount' => /* internal resource refcount of $array[$key] */,
 | |
|             );
 | |
|             break;
 | |
| 
 | |
|         case 'array':
 | |
|             $info += array(
 | |
|                 'array_count' => count($array[$key]),
 | |
|             );
 | |
|             break;
 | |
| 
 | |
|         case 'string':
 | |
|             $info += array(
 | |
|                 'strlen' => strlen($array[$key]),
 | |
|             );
 | |
|             break;
 | |
|     }
 | |
| 
 | |
|     return $info;
 | |
| }
 | |
| ```
 | |
| 
 | |
| symfony_debug_backtrace()
 | |
| -------------------------
 | |
| 
 | |
| This function works like debug_backtrace(), except that it can fetch the full backtrace in case of fatal errors:
 | |
| 
 | |
| ```php
 | |
| function foo() { fatal(); }
 | |
| function bar() { foo(); }
 | |
| 
 | |
| function sd() { var_dump(symfony_debug_backtrace()); }
 | |
| 
 | |
| register_shutdown_function('sd');
 | |
| 
 | |
| bar();
 | |
| 
 | |
| /* Will output
 | |
| Fatal error: Call to undefined function fatal() in foo.php on line 42
 | |
| array(3) {
 | |
|   [0]=>
 | |
|   array(2) {
 | |
|     ["function"]=>
 | |
|     string(2) "sd"
 | |
|     ["args"]=>
 | |
|     array(0) {
 | |
|     }
 | |
|   }
 | |
|   [1]=>
 | |
|   array(4) {
 | |
|     ["file"]=>
 | |
|     string(7) "foo.php"
 | |
|     ["line"]=>
 | |
|     int(1)
 | |
|     ["function"]=>
 | |
|     string(3) "foo"
 | |
|     ["args"]=>
 | |
|     array(0) {
 | |
|     }
 | |
|   }
 | |
|   [2]=>
 | |
|   array(4) {
 | |
|     ["file"]=>
 | |
|     string(102) "foo.php"
 | |
|     ["line"]=>
 | |
|     int(2)
 | |
|     ["function"]=>
 | |
|     string(3) "bar"
 | |
|     ["args"]=>
 | |
|     array(0) {
 | |
|     }
 | |
|   }
 | |
| }
 | |
| */
 | |
| ```
 | |
| 
 | |
| Usage
 | |
| -----
 | |
| 
 | |
| To enable the extension from source, run:
 | |
| 
 | |
| ```
 | |
|     phpize
 | |
|     ./configure
 | |
|     make
 | |
|     sudo make install
 | |
| ```
 | 
