Skip to content

Instantly share code, notes, and snippets.

@klkvsk
Created March 21, 2014 11:45
Show Gist options
  • Save klkvsk/9684458 to your computer and use it in GitHub Desktop.
Save klkvsk/9684458 to your computer and use it in GitHub Desktop.
extdoc.php - generate .php from extension
<?php
if ($argc < 2) {
die('Usage: php extdoc.php <extension_name>' . PHP_EOL);
}
$extension = $argv[1];
$keywords = array('__halt_compiler', 'abstract', 'and', 'array', 'as', 'break', 'callable', 'case', 'catch',
'class', 'clone', 'const', 'continue', 'declare', 'default', 'die', 'do', 'echo', 'else', 'elseif', 'empty',
'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile', 'eval', 'exit', 'extends', 'final',
'for', 'foreach', 'function', 'global', 'goto', 'if', 'implements', 'include', 'include_once', 'instanceof',
'insteadof', 'interface', 'isset', 'list', 'namespace', 'new', 'or', 'print', 'private', 'protected',
'public', 'require', 'require_once', 'return', 'static', 'switch', 'throw', 'trait', 'try', 'unset', 'use',
'var', 'while', 'xor');
$re = new ReflectionExtension($extension);
$code = '<?php' . PHP_EOL;
$code .= '// Header file for: ' . $re->getName() . ' ' . $re->getVersion() . PHP_EOL . PHP_EOL;
$code .= '// -- INI settings:' . PHP_EOL;
foreach ($re->getINIEntries() as $var => $val) {
$code .= '// ' . sprintf('%-20s', $var) . ' = ' . var_export($val, 1) . PHP_EOL;
}
$code .= '// --' . PHP_EOL;
foreach ($re->getConstants() as $var => $val) {
$code .= 'const ' . $var . ' = ' . var_export($val, 1) . ';' . PHP_EOL;
}
$code .= PHP_EOL;
foreach ($re->getFunctions() as $func) {
$code .= 'function ' . $func->getName() . '(' ;
$params = array();
foreach ($func->getParameters() as $param) {
$paramString = '';
if ($param->getClass()) {
$paramString .= $param->getClass()->getName() . ' ';
}
if ($param->isPassedByReference()) {
$paramString .= '&';
}
$paramString .= '$' . $param->getName();
if ($param->isOptional()) {
$paramString .= ' = ';
if ($param->isDefaultValueAvailable()) {
$paramString .= var_export($param->getDefaultValue(), 1);
} else {
$paramString .= 'null';
}
}
$params[]= $paramString;
}
$code .= implode(', ', $params);
$code .= ') {}' . PHP_EOL;
}
$code .= PHP_EOL;
foreach ($re->getClasses() as $class) {
// header
if ($class->getDocComment()) {
$code .= '/**' . PHP_EOL;
$code .= $class->getDocComment();
$code .= PHP_EOL . '*/' . PHP_EOL;
}
if ($class->isAbstract()) {
$code .= 'abstract ';
}
if ($class->isFinal()) {
$code .= 'final ';
}
if ($class->isInterface()) {
$code .= 'interface ';
} else {
$code .= 'class ';
}
$code .= $class->getName() . ' ';
if ($class->getParentClass()) {
$code .= 'extends ' . $class->getParentClass()->getName() . ' ';
}
if ($class->getInterfaceNames()) {
$code .= 'implements ' . implode(', ', $class->getInterfaceNames()) . ' ';
}
$code .= '{' . PHP_EOL;
// constants
foreach ($class->getConstants() as $var => $val) {
$code .= "\t" . 'const ' . $var . ' = ' . var_export($val, 1) . ';' . PHP_EOL;
}
if ($class->getConstants()) {
$code .= PHP_EOL;
}
// properties
$defaults = $class->getDefaultProperties();
foreach ($class->getProperties() as $prop) {
$code .= "\t";
if ($prop->isPrivate()) {
$code .= 'private ';
}
if ($prop->isProtected()) {
$code .= 'protected ';
}
if ($prop->isPublic()) {
$code .= 'public ';
}
$code .= '$' . $prop->getName();
if ($prop->isDefault() ) {
$code .= ' = ' . var_export($defaults[$prop->getName()], 1);
}
$code .= ';' . PHP_EOL;
}
if ($class->getProperties()) {
$code .= PHP_EOL;
}
// methods
foreach ($class->getMethods() as $method) {
if ($class->getParentClass() && $class->getParentClass()->hasMethod($method->getName())) {
continue;
}
if ($method->getDocComment()) {
$code .= "\t" . '/**' . PHP_EOL;
$code .= "\t" . $method->getDocComment();
$code .= "\t" . PHP_EOL . '*/' . PHP_EOL;
}
$code .= "\t";
if ($method->isFinal()) {
$code .= 'final ';
}
if ($method->isAbstract()) {
$code .= 'abstract ';
}
if ($method->isStatic()) {
$code .= 'static ';
}
if ($method->isPrivate()) {
$code .= 'private ';
}
if ($method->isProtected()) {
$code .= 'protected ';
}
if ($method->isPublic()) {
$code .= 'public ';
}
$name = $method->getName();
if (in_array($name, $keywords)) {
$name = $name . '_BITCH';
}
$code .= 'function ' . $name . '(';
$params = array();
foreach ($method->getParameters() as $param) {
$paramString = '';
if ($param->getClass()) {
$paramString .= $param->getClass()->getName() . ' ';
}
if ($param->isPassedByReference()) {
$paramString .= '&';
}
$paramString .= '$' . $param->getName();
if ($param->isOptional()) {
$paramString .= ' = ';
if ($param->isDefaultValueAvailable()) {
$paramString .= var_export($param->getDefaultValue(), 1);
} else {
$paramString .= 'null';
}
}
$params[]= $paramString;
}
$code .= implode(', ', $params);
$body = '';
if ($name == '__toString') {
$body = ' return "string"; ';
}
$code .= ') {' . $body . '}' . PHP_EOL;
}
// footer
$code .= '}' . PHP_EOL . PHP_EOL;
}
if (php_sapi_name() == 'cli') {
echo $code;
} else {
highlight_string($code);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment