324 lines
8.6 KiB
PHP
324 lines
8.6 KiB
PHP
<?php
|
|
/**
|
|
* Zend Framework
|
|
*
|
|
* LICENSE
|
|
*
|
|
* This source file is subject to the new BSD license that is bundled
|
|
* with this package in the file LICENSE.txt.
|
|
* It is also available through the world-wide-web at this URL:
|
|
* http://framework.zend.com/license/new-bsd
|
|
* If you did not receive a copy of the license and are unable to
|
|
* obtain it through the world-wide-web, please send an email
|
|
* to license@zend.com so we can send you a copy immediately.
|
|
*
|
|
* @category Zend
|
|
* @package Zend_CodeGenerator
|
|
* @subpackage PHP
|
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
|
* @version $Id: DefaultValue.php 18951 2009-11-12 16:26:19Z alexander $
|
|
*/
|
|
|
|
/**
|
|
* @see Zend_CodeGenerator_Php_Abstract
|
|
*/
|
|
require_once 'Zend/CodeGenerator/Php/Abstract.php';
|
|
|
|
/**
|
|
* @category Zend
|
|
* @package Zend_CodeGenerator
|
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
|
*/
|
|
class Zend_CodeGenerator_Php_Property_DefaultValue extends Zend_CodeGenerator_Php_Abstract
|
|
{
|
|
/**#@+
|
|
* Constant values
|
|
*/
|
|
const TYPE_AUTO = 'auto';
|
|
const TYPE_BOOLEAN = 'boolean';
|
|
const TYPE_BOOL = 'bool';
|
|
const TYPE_NUMBER = 'number';
|
|
const TYPE_INTEGER = 'integer';
|
|
const TYPE_INT = 'int';
|
|
const TYPE_FLOAT = 'float';
|
|
const TYPE_DOUBLE = 'double';
|
|
const TYPE_STRING = 'string';
|
|
const TYPE_ARRAY = 'array';
|
|
const TYPE_CONSTANT = 'constant';
|
|
const TYPE_NULL = 'null';
|
|
const TYPE_OTHER = 'other';
|
|
/**#@-*/
|
|
|
|
/**
|
|
* @var array of reflected constants
|
|
*/
|
|
protected static $_constants = array();
|
|
|
|
/**
|
|
* @var mixed
|
|
*/
|
|
protected $_value = null;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $_type = self::TYPE_AUTO;
|
|
|
|
/**
|
|
* @var int
|
|
*/
|
|
protected $_arrayDepth = 1;
|
|
|
|
/**
|
|
* _init()
|
|
*
|
|
* This method will prepare the constant array for this class
|
|
*/
|
|
protected function _init()
|
|
{
|
|
if(count(self::$_constants) == 0) {
|
|
$reflect = new ReflectionClass(get_class($this));
|
|
self::$_constants = $reflect->getConstants();
|
|
unset($reflect);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* isValidConstantType()
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isValidConstantType()
|
|
{
|
|
if ($this->_type == self::TYPE_AUTO) {
|
|
$type = $this->_getAutoDeterminedType($this->_value);
|
|
}
|
|
|
|
// valid types for constants
|
|
$scalarTypes = array(
|
|
self::TYPE_BOOLEAN,
|
|
self::TYPE_BOOL,
|
|
self::TYPE_NUMBER,
|
|
self::TYPE_INTEGER,
|
|
self::TYPE_INT,
|
|
self::TYPE_FLOAT,
|
|
self::TYPE_DOUBLE,
|
|
self::TYPE_STRING,
|
|
self::TYPE_CONSTANT,
|
|
self::TYPE_NULL
|
|
);
|
|
|
|
return in_array($type, $scalarTypes);
|
|
}
|
|
|
|
/**
|
|
* setValue()
|
|
*
|
|
* @param mixed $value
|
|
* @return Zend_CodeGenerator_Php_Property_DefaultValue
|
|
*/
|
|
public function setValue($value)
|
|
{
|
|
$this->_value = $value;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* getValue()
|
|
*
|
|
* @return mixed
|
|
*/
|
|
public function getValue()
|
|
{
|
|
return $this->_value;
|
|
}
|
|
|
|
/**
|
|
* setType()
|
|
*
|
|
* @param string $type
|
|
* @return Zend_CodeGenerator_Php_Property_DefaultValue
|
|
*/
|
|
public function setType($type)
|
|
{
|
|
$this->_type = $type;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* getType()
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getType()
|
|
{
|
|
return $this->_type;
|
|
}
|
|
|
|
/**
|
|
* setArrayDepth()
|
|
*
|
|
* @param int $arrayDepth
|
|
* @return Zend_CodeGenerator_Php_Property_DefaultValue
|
|
*/
|
|
public function setArrayDepth($arrayDepth)
|
|
{
|
|
$this->_arrayDepth = $arrayDepth;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* getArrayDepth()
|
|
*
|
|
* @return int
|
|
*/
|
|
public function getArrayDepth()
|
|
{
|
|
return $this->_arrayDepth;
|
|
}
|
|
|
|
/**
|
|
* _getValidatedType()
|
|
*
|
|
* @param string $type
|
|
* @return string
|
|
*/
|
|
protected function _getValidatedType($type)
|
|
{
|
|
if (($constName = array_search($type, self::$_constants)) !== false) {
|
|
return $type;
|
|
}
|
|
|
|
return self::TYPE_AUTO;
|
|
}
|
|
|
|
/**
|
|
* _getAutoDeterminedType()
|
|
*
|
|
* @param mixed $value
|
|
* @return string
|
|
*/
|
|
public function _getAutoDeterminedType($value)
|
|
{
|
|
switch (gettype($value)) {
|
|
case 'boolean':
|
|
return self::TYPE_BOOLEAN;
|
|
case 'integer':
|
|
return self::TYPE_INT;
|
|
case 'string':
|
|
return self::TYPE_STRING;
|
|
case 'double':
|
|
case 'float':
|
|
case 'integer':
|
|
return self::TYPE_NUMBER;
|
|
case 'array':
|
|
return self::TYPE_ARRAY;
|
|
case 'NULL':
|
|
return self::TYPE_NULL;
|
|
case 'object':
|
|
case 'resource':
|
|
case 'unknown type':
|
|
default:
|
|
return self::TYPE_OTHER;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* generate()
|
|
*
|
|
* @return string
|
|
*/
|
|
public function generate()
|
|
{
|
|
$type = $this->_type;
|
|
|
|
if ($type != self::TYPE_AUTO) {
|
|
$type = $this->_getValidatedType($type);
|
|
}
|
|
|
|
$value = $this->_value;
|
|
|
|
if ($type == self::TYPE_AUTO) {
|
|
$type = $this->_getAutoDeterminedType($value);
|
|
|
|
if ($type == self::TYPE_ARRAY) {
|
|
$rii = new RecursiveIteratorIterator(
|
|
$it = new RecursiveArrayIterator($value),
|
|
RecursiveIteratorIterator::SELF_FIRST
|
|
);
|
|
foreach ($rii as $curKey => $curValue) {
|
|
if (!$curValue instanceof Zend_CodeGenerator_Php_Property_DefaultValue) {
|
|
$curValue = new self(array('value' => $curValue));
|
|
$rii->getSubIterator()->offsetSet($curKey, $curValue);
|
|
}
|
|
$curValue->setArrayDepth($rii->getDepth());
|
|
}
|
|
$value = $rii->getSubIterator()->getArrayCopy();
|
|
}
|
|
|
|
}
|
|
|
|
$output = '';
|
|
|
|
switch ($type) {
|
|
case self::TYPE_BOOLEAN:
|
|
case self::TYPE_BOOL:
|
|
$output .= ( $value ? 'true' : 'false' );
|
|
break;
|
|
case self::TYPE_STRING:
|
|
$output .= "'" . addcslashes($value, "'") . "'";
|
|
break;
|
|
case self::TYPE_NULL:
|
|
$output .= 'null';
|
|
break;
|
|
case self::TYPE_NUMBER:
|
|
case self::TYPE_INTEGER:
|
|
case self::TYPE_INT:
|
|
case self::TYPE_FLOAT:
|
|
case self::TYPE_DOUBLE:
|
|
case self::TYPE_CONSTANT:
|
|
$output .= $value;
|
|
break;
|
|
case self::TYPE_ARRAY:
|
|
$output .= 'array(';
|
|
$curArrayMultiblock = false;
|
|
if (count($value) > 1) {
|
|
$curArrayMultiblock = true;
|
|
$output .= PHP_EOL . str_repeat($this->_indentation, $this->_arrayDepth+1);
|
|
}
|
|
$outputParts = array();
|
|
$noKeyIndex = 0;
|
|
foreach ($value as $n => $v) {
|
|
$v->setArrayDepth($this->_arrayDepth + 1);
|
|
$partV = $v->generate();
|
|
$partV = substr($partV, 0, strlen($partV)-1);
|
|
if ($n === $noKeyIndex) {
|
|
$outputParts[] = $partV;
|
|
$noKeyIndex++;
|
|
} else {
|
|
$outputParts[] = (is_int($n) ? $n : "'" . addcslashes($n, "'") . "'") . ' => ' . $partV;
|
|
}
|
|
|
|
}
|
|
$output .= implode(',' . PHP_EOL . str_repeat($this->_indentation, $this->_arrayDepth+1), $outputParts);
|
|
if ($curArrayMultiblock == true) {
|
|
$output .= PHP_EOL . str_repeat($this->_indentation, $this->_arrayDepth+1);
|
|
}
|
|
$output .= ')';
|
|
break;
|
|
case self::TYPE_OTHER:
|
|
default:
|
|
require_once "Zend/CodeGenerator/Php/Exception.php";
|
|
throw new Zend_CodeGenerator_Php_Exception(
|
|
"Type '".get_class($value)."' is unknown or cannot be used as property default value."
|
|
);
|
|
}
|
|
|
|
$output .= ';';
|
|
|
|
return $output;
|
|
}
|
|
}
|