Current File : //opt/RZphp72/includes/CodeGen/PECL/Element/Interface.php |
<?php
/**
* Class describing a PHP interface within a PECL extension
*
* PHP versions 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Tools and Utilities
* @package CodeGen
* @author Hartmut Holzgraefe <hartmut@php.net>
* @copyright 2005-2008 Hartmut Holzgraefe
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id: Interface.php,v 1.6 2006/10/09 21:27:05 hholzgra Exp $
* @link http://pear.php.net/package/CodeGen
*/
/**
* includes
*/
require_once "CodeGen/PECL/Element.php";
require_once "CodeGen/PECL/Element/Method.php";
require_once "CodeGen/PECL/Element/ObjectInterface.php";
require_once "CodeGen/Tools/Indent.php";
/**
* Class describing a PHP interface within a PECL extension
*
* @category Tools and Utilities
* @package CodeGen
* @author Hartmut Holzgraefe <hartmut@php.net>
* @copyright 2005-2008 Hartmut Holzgraefe
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: @package_version@
* @link http://pear.php.net/package/CodeGen
*/
class CodeGen_PECL_Element_Interface
extends CodeGen_PECL_Element
implements CodeGen_PECL_Element_ObjectInterface
{
/**
* The class name
*
* @var string
*/
protected $name = "unknown";
/**
* name set()er
*
* @param string
*/
function setName($name)
{
if (!self::isName($name)) {
return PEAR::raiseError("'$name' is not a valid interface name");
}
$this->name = $name;
return true;
}
/**
* name get()er
*
* @return string
*/
function getName()
{
return $this->name;
}
/**
* A short description
*
* @var string
*/
protected $summary = "";
/**
* summary set()er
*
* @param string
*/
function setSummary($text)
{
$this->summary = $text;
return true;
}
/**
* A long description
*
* @var string
*/
protected $description = "";
/**
* description set()er
*
* @param string
*/
function setDescription($text)
{
$this->description = $text;
return true;
}
/**
* Documentation
*
* TODO: isn't this in Element base class already?
*
* @var string
*/
protected $documentation = "";
/**
* description set()er
*
* @param string
*/
function setDocumentation($text)
{
$this->documentation = $text;
}
/**
* Extents which interface?
*
* @var string
*/
protected $extends = "";
/**
* extends set()er
*
* @param string
*/
function setExtends($parent)
{
if (!self::isName($parent)) {
return PEAR::raiseError("'$parent' is not a valid parent interface name");
}
$this->extends = $parent;
}
/**
* Member Functions
*
* @var array
*/
protected $methods = array();
/**
* Add a method to the interface
*
* @param object
*/
function addMethod(CodeGen_PECL_Element_Method $method)
{
$name = $method->getName();
if (isset($this->functions[$name])) {
return PEAR::raiseError("method '$name' already exists");
}
/* TODO
if (!$method->isAbstract || !$method->isInterface) {
return PEAR::raiseError("an interface method has to be declated both abstract and interface");
}
*/
$this->methods[$name] = $method;
return true;
}
/**
* Create C header entry for interface
*
* @access public
* @param class Extension extension the function is part of
* @return string C header code snippet
*/
function hCode($extension)
{
$code = "";
foreach ($this->methods as $method) {
$code.= $method->hCode($extension);
}
if ($code) {
$code = $this->ifConditionStart() . $code . $this->ifConditionEnd();
}
return $code;
}
/**
* Generate global scope code
*
* @access public
* @return string
*/
function globalCode($extension)
{
ob_start();
echo "/* {{{ Interface {$this->name} */\n\n";
echo $this->ifConditionStart();
echo "static zend_class_entry * {$this->name}_ce_ptr = NULL;\n\n";
echo "static zend_function_entry {$this->name}_methods[] = {\n";
foreach ($this->methods as $method) {
echo " ".$method->methodEntry()."\n";
}
echo " { NULL, NULL, NULL }\n";
echo "};\n\n";
echo "static void interface_init_{$this->name}(void)\n{\n";
echo " zend_class_entry ce;\n";
if ($this->extends) {
echo " zend_class_entry **parent_ce;\n";
}
echo "\n";
echo " INIT_CLASS_ENTRY(ce, \"{$this->name}\", {$this->name}_methods);\n";
echo " {$this->name}_ce_ptr = zend_register_internal_interface(&ce TSRMLS_CC);\n";
if ($this->extends) {
echo sprintf(" if (SUCCESS == zend_hash_find(CG(class_table), \"%s\", %d, (void **)&parent_ce)) {\n",
strtolower($this->extends), strlen($this->extends) + 1);
echo "";
echo " if (parent_ce) {\n";
echo " zend_do_inheritance({$this->name}_ce_ptr, *parent_ce TSRMLS_CC);\n";
echo " }\n";
}
echo "}\n\n";
echo $this->ifConditionEnd();
echo "/* }}} Class {$this->name} */\n\n";
return ob_get_clean();
}
/**
* MINIT code fragment
*
* @access public
* @return string
*/
function minitCode($extension)
{
return $this->ifConditionStart() . "interface_init_{$this->name}();\n" . $this->ifConditionEnd();
}
/**
* DocBook documentation fragment
*
* @access public
* @return string
*/
function docEntry($base)
{
$xml = "";
return $xml;
}
function getPayloadType()
{
return "";
}
}
?>