/** * Compiles all the data for a given class and its properties and methods. */ function getClass($package, $cls) { $app = array_shift(explode('.', $package)); if ($app == 'saf') { $prefix = 'saf/lib/'; } else { $prefix = 'inc/app/' . $app . '/lib/'; } if (@is_dir($prefix . str_replace($app . '.', '', $package))) { $files = Dir::find('*.php', $prefix . str_replace($app . '.', '', $package), true); } else { $files = array(); } if (@file_exists($prefix . str_replace($app . '.', '', $package) . '.php')) { $files[] = $prefix . str_replace($app . '.', '', $package) . '.php'; } elseif (@file_exists($prefix . '_' . str_replace($app . '.', '', $package) . '.php')) { $files[] = $prefix . '_' . str_replace($app . '.', '', $package) . '.php'; } $out = array('name' => $cls, 'package' => $package, 'info' => array(), 'vars' => array(), 'methods' => array(), 'params' => array()); $class = false; $class_name = false; $class_count = 0; $count = 0; foreach ($files as $file) { $src = file_get_contents($file); $tokens = token_get_all($src); foreach ($tokens as $k => $token) { if (is_string($token)) { if (strpos($token, '{') !== false) { $count++; } elseif (strpos($token, '}') !== false) { $count--; if ($class !== false && $count <= $class_count) { $class = false; $class_count = 0; } } continue; } if ($token[0] == T_CLASS) { $class = true; $class_count = $count; $class_name = $tokens[$k + 2][1]; if ($class_name == $cls) { $info = Docs::_getClass($k, $tokens); $out['extends'] = $info->class_extends; $out['comment'] = $info->comment; $out['code'] = $info->code; $out['params'] = $info->params; } } if ($token[0] == T_VAR && count($out['methods']) == 0) { $out['vars'][$tokens[$k + 2][1]] = Docs::_getVar($k, $tokens); } if ($token[0] == T_FUNCTION) { if ($class && $class_name == $cls) { if ($tokens[$k + 2] == '&') { $out['methods'][$tokens[$k + 3][1]] = Docs::_getFunction($k, $tokens); } else { $out['methods'][$tokens[$k + 2][1]] = Docs::_getFunction($k, $tokens); } } } } } return $out; }