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 + -
显示快捷键?