container.php

来自「视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.」· PHP 代码 · 共 764 行 · 第 1/2 页

PHP
764
字号
        if ($item) {            return $item->getContent();        }        return false;    } // end func getDirectiveContent    /**    * Returns how many children this container has    *    * @param  string    $type    type of children counted    * @param  string    $name    name of children counted    * @return int  number of children found    */    function countChildren($type = null, $name = null)    {        if (is_null($type) && is_null($name)) {            return count($this->children);        }        $count = 0;        if (isset($name) && isset($type)) {            for ($i = 0, $children = count($this->children); $i < $children; $i++) {                if ($this->children[$i]->name == $name &&                     $this->children[$i]->type == $type) {                    $count++;                }            }            return $count;        }        if (isset($type)) {            for ($i = 0, $children = count($this->children); $i < $children; $i++) {                if ($this->children[$i]->type == $type) {                    $count++;                }            }            return $count;        }        if (isset($name)) {            // Some directives can have the same name            for ($i = 0, $children = count($this->children); $i < $children; $i++) {                if ($this->children[$i]->name == $name) {                    $count++;                }            }            return $count;        }    } // end func &countChildren    /**    * Deletes an item (section, directive, comment...) from the current object    * TODO: recursive remove in sub-sections    * @return mixed  true if object was removed, false if not, or PEAR_Error if root    */    function removeItem()    {        if ($this->isRoot()) {            return PEAR::raiseError('Cannot remove root item in Config_Container::removeItem.', null, PEAR_ERROR_RETURN);        }        $index = $this->getItemIndex();        if (!is_null($index)) {            array_splice($this->parent->children, $index, 1);            return true;        }        return false;    } // end func removeItem    /**    * Returns the item index in its parent children array.    * @return int  returns int or null if root object    */    function getItemIndex()    {        if (is_object($this->parent)) {            // This will be optimized with Zend Engine 2            $pchildren =& $this->parent->children;            for ($i = 0, $count = count($pchildren); $i < $count; $i++) {                if ($pchildren[$i]->_id == $this->_id) {                    return $i;                }            }        }        return;    } // end func getItemIndex    /**    * Returns the item rank in its parent children array    * according to other items with same type and name.    * @return int  returns int or null if root object    */    function getItemPosition()    {        if (is_object($this->parent)) {            $pchildren =& $this->parent->children;            for ($i = 0, $count = count($pchildren); $i < $count; $i++) {                if ($pchildren[$i]->name == $this->name &&                    $pchildren[$i]->type == $this->type) {                    $obj[] =& $pchildren[$i];                }            }            for ($i = 0, $count = count($obj); $i < $count; $i++) {                if ($obj[$i]->_id == $this->_id) {                    return $i;                }            }        }        return;    } // end func getItemPosition    /**    * Returns the item parent object.    * @return object  returns reference to parent object or null if root object    */    function &getParent()    {        return $this->parent;    } // end func &getParent    /**    * Returns the item parent object.    * @return mixed  returns reference to child object or false if child does not exist    */    function &getChild($index = 0)    {        if (!empty($this->children[$index])) {            return $this->children[$index];        } else {            return false;        }    } // end func &getChild    /**    * Set this item's name.    * @return void    */    function setName($name)    {        $this->name = $name;    } // end func setName    /**    * Get this item's name.    * @return string    item's name    */    function getName()    {        return $this->name;    } // end func getName    /**    * Set this item's content.    * @return void    */    function setContent($content)    {        $this->content = $content;    } // end func setContent        /**    * Get this item's content.    * @return string    item's content    */    function getContent()    {        return $this->content;    } // end func getContent    /**    * Set this item's type.    * @return void    */    function setType($type)    {        $this->type = $type;    } // end func setType    /**    * Get this item's type.    * @return string    item's type    */    function getType()    {        return $this->type;    } // end func getType    /**    * Set this item's attributes.    * @param  array    $attributes        Array of attributes    * @return void    */    function setAttributes($attributes)    {        $this->attributes = $attributes;    } // end func setAttributes    /**    * Set this item's attributes.    * @param  array    $attributes        Array of attributes    * @return void    */    function updateAttributes($attributes)    {        if (is_array($attributes)) {            foreach ($attributes as $key => $value) {                $this->attributes[$key] = $value;            }        }    } // end func updateAttributes    /**    * Get this item's attributes.    * @return array    item's attributes    */    function getAttributes()    {        return $this->attributes;    } // end func getAttributes        /**    * Get one attribute value of this item    * @param  string   $attribute        Attribute key    * @return mixed    item's attribute value    */    function getAttribute($attribute)    {        if (isset($this->attributes[$attribute])) {            return $this->attributes[$attribute];        }        return null;    } // end func getAttribute    /**    * Set a children directive content.    * This is an helper method calling getItem and addItem or setContent for you.    * If the directive does not exist, it will be created at the bottom.    *    * @param  string    $name        Name of the directive to look for    * @param  mixed     $content     New content    * @param  int       $index       Index of the directive to set,    *                                in case there are more than one directive    *                                with the same name    * @return object    newly set directive    */    function &setDirective($name, $content, $index = -1)    {        $item =& $this->getItem('directive', $name, null, null, $index);        if ($item === false || PEAR::isError($item)) {            // Directive does not exist, will create one            unset($item);            return $this->createDirective($name, $content, null);        } else {            // Change existing directive value            $item->setContent($content);            return $item;        }    } // end func setDirective    /**    * Is this item root, in a config container object    * @return bool    true if item is root    */    function isRoot()    {        if (is_null($this->parent)) {            return true;        }        return false;    } // end func isRoot    /**    * Call the toString methods in the container plugin    * @param    string  $configType  Type of configuration used to generate the string    * @param    array   $options     Specify special options used by the parser    * @return   mixed   true on success or PEAR_ERROR    */    function toString($configType, $options = array())    {        $configType = strtolower($configType);        if (!isset($GLOBALS['CONFIG_TYPES'][$configType])) {            return PEAR::raiseError("Configuration type '$configType' is not registered in Config_Container::toString.", null, PEAR_ERROR_RETURN);        }        $includeFile = $GLOBALS['CONFIG_TYPES'][$configType][0];        $className   = $GLOBALS['CONFIG_TYPES'][$configType][1];        include_once($includeFile);        $renderer = new $className($options);        return $renderer->toString($this);    } // end func toString    /**    * Returns a key/value pair array of the container and its children.    *    * Format : section[directive][index] = value    * If the container has attributes, it will use '@' and '#'    * index is here because multiple directives can have the same name.    *    * @param    bool    $useAttr        Whether to return the attributes too    * @return array    */    function toArray($useAttr = true)    {        $array[$this->name] = array();        switch ($this->type) {            case 'directive':                if ($useAttr && count($this->attributes) > 0) {                    $array[$this->name]['#'] = $this->content;                    $array[$this->name]['@'] = $this->attributes;                } else {                    $array[$this->name] = $this->content;                }                break;            case 'section':                if ($useAttr && count($this->attributes) > 0) {                    $array[$this->name]['@'] = $this->attributes;                }                if ($count = count($this->children)) {                    for ($i = 0; $i < $count; $i++) {                        $newArr = $this->children[$i]->toArray($useAttr);                        if (!is_null($newArr)) {                            foreach ($newArr as $key => $value) {                                if (isset($array[$this->name][$key])) {                                    // duplicate name/type                                    if (!is_array($array[$this->name][$key]) ||                                        !isset($array[$this->name][$key][0])) {                                        $old = $array[$this->name][$key];                                        unset($array[$this->name][$key]);                                        $array[$this->name][$key][0] = $old;                                    }                                    $array[$this->name][$key][] = $value;                                } else {                                    $array[$this->name][$key] = $value;                                }                            }                        }                    }                }                break;            default:                return null;        }        return $array;    } // end func toArray        /**    * Writes the configuration to a file    *     * @param  mixed  $datasrc        Info on datasource such as path to the configuraton file or dsn...    * @param  string $configType     Type of configuration    * @param  array  $options        Options for writer    * @access public    * @return mixed     true on success or PEAR_ERROR    */    function writeDatasrc($datasrc, $configType, $options = array())    {        $configType = strtolower($configType);        if (!isset($GLOBALS['CONFIG_TYPES'][$configType])) {            return PEAR::raiseError("Configuration type '$configType' is not registered in Config_Container::writeDatasrc.", null, PEAR_ERROR_RETURN);        }        $includeFile = $GLOBALS['CONFIG_TYPES'][$configType][0];        $className = $GLOBALS['CONFIG_TYPES'][$configType][1];        include_once($includeFile);        $writeMethodName = (version_compare(phpversion(), '5', '<')) ? 'writedatasrc' : 'writeDatasrc';        if (in_array($writeMethodName, get_class_methods($className))) {            $writer = new $className($options);            return $writer->writeDatasrc($datasrc, $this);        }        // Default behaviour        $fp = @fopen($datasrc, 'w');        if ($fp) {            $string = $this->toString($configType, $options);            $len = strlen($string);            @flock($fp, LOCK_EX);            @fwrite($fp, $string, $len);            @flock($fp, LOCK_UN);            @fclose($fp);            return true;        } else {            return PEAR::raiseError('Cannot open datasource for writing.', 1, PEAR_ERROR_RETURN);        }    } // end func writeDatasrc} // end class Config_Container?>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?