function _self() { $stack = stack(); if (!isset($stack['class'])) { trigger_error("Using self in wrong context", E_USER_ERROR); } elseif (func_num_args() == 0) { return $stack['class']; } $func_args = func_get_args(); $storage = storage(); if (sizeof($tmp = explode('()', $func_args[0])) > 1) { $function = trim($tmp[0]); $function_l = strtolower($function); unset($func_args[0]); if (!isset($storage['classes'][$stack['class']]['methods'][$function_l])) { if (isset($storage['classes'][$stack['class']]['methods']['__callstatic'])) { _self('__callstatic()', $function, array_values($func_args)); } trigger_error("Call to undefined method {$storage['classes'][$stack['class']]['class']}::" . "{$function}()", E_USER_ERROR); } elseif ($storage['classes'][$stack['class']]['methods'][$function_l]['access'][0] > 1 && isset($storage['classes'][$stack['class']]['methods'][$function_l]['extended']) && (!isset($storage['classes'][$stack['class']]['methods'][$stack['method']]['extended']) || strcasecmp($storage['classes'][$stack['class']]['methods'][$stack['method']]['extended'], $storage['classes'][$stack['class']]['methods'][$function_l]['extended']))) { trigger_error("Call to private method {$storage['classes'][$stack['class']]['methods'][$function_l]['extended']}::" . "{$function}()", E_USER_ERROR); } stack(array('class' => $stack['class'], 'method' => $function_l)); $result = call_user_func_array($storage['classes'][$stack['class']]['methods'][$function_l]['value'], array_values($func_args)); stack(true); return $result; } else { $key = strtolower(trim((string) $func_args[0])); sizeof($func_args) > 1 && ($value = $func_args[1]); if (!isset($storage['classes'][$stack['class']]['properties'][$key]) || !$storage['classes'][$stack['class']]['properties'][$key]['static']) { trigger_error("Access to undeclared static property {$storage['classes'][$stack['class']]['class']}::{$key}", E_USER_ERROR); } elseif (isset($value)) { $storage['classes'][$stack['class']]['properties'][$key]['value'] = $value; storage($storage); } return $storage['classes'][$stack['class']]['properties'][$key]['value']; } }
<?php require __DIR__ . '/../vendor/autoload.php'; tick(3); // tick 1, false tick(3); // tick 2, false echo 'b'; xdebug_break(); echo 'a'; tick(3); // tick 3, true do { stack('a'); } while (!tick(5)); // tick 4, tick 5
function stackb() { stack('b'); }