关于CList的一点点疑问

没有实际的应用过yii. 只是对代码有所拜读.

发现代码里面对一些数据缺乏验证. 比如 CList 类. 如果 $a = new CList; $a[‘string’] = ‘string’; 这样貌似也是可以的.

我不是高手. 只是请教为什么不验证这个键是否表达一个正整数. 而只是拿来就用上了. 是为了性能还是另有考虑.

请高手赐教! 万分感谢.

这个问题为什么没有人回答.

没看明白

我得意思是说.

CList.insertAt 这个方法的 $index 参数如果传递了字符串也是合法的. 虽然 insertAt("1") 也可以

但是起码要对 insertAt("abc") 有一个验证啊.

类似的还有很多. removeAt 之类的. 还有 CListIterator 的构造函数也没有数据验证.

甚至如果传递一个 Traversable 的实现. 他也没有作出转换操作.

这样写会不会太薄弱了. 还是这种地方根本不用考虑这么多呢? 万望赐教.

应该只是当 字符串索引的数组下标来操作,放弃了 复杂的 数字下标计算吧?

或者还有其他方法

CList 是一个列表啊. 看代码也不是字符串操作啊. 连起码的 (integer) $index 也没有… 这是为啥呢.

$a = new CList; $a[‘string’] = ‘string’

这个代码你真的运行过吗?这段代码一运行就抛出异常了

看API吧楼主 http://www.yiiframework.com/doc/api/1.1/CList

如楼上所说. $list[‘string’] = ‘string’; 确实会异常. 这是removeAt方法抛出来的.

我确实没有运行过代码. 我只是读了一些代码. API没有看. 因为它的注释很全.

但是insertAt方法确实没有判断$index是否是一个整数. $index用字符串的结果估计跟array_unshift是一样的.




public function insertAt($index,$item)

{

	if(!$this->_r)

	{

		if($index===$this->_c)

			$this->_d[$this->_c++]=$item;

		else if($index>=0 && $index<$this->_c)

		{

			array_splice($this->_d,$index,0,array($item));

			$this->_c++;

		}

		else

			throw new CException(Yii::t('yii','List index "{index}" is out of bound.',

				array('{index}'=>$index)));

	}

	else

		throw new CException(Yii::t('yii','The list is read only.'));

}



is_int 函数不能判断类似 "1", "+1", "001" 这样的. 我写了一个自定义的函数来检查. 代码如下.




class test

{

	function isint($var)

	{

		return is_int($var) ? true : (is_numeric($var) ? (int)$var == $var : false);

	}

}



测试结果是这个函数的效率比is_int函数慢了9倍. 我只想知道没有去检查是因为这个原因么. 还是另有考虑.

PHP是一种弱类型语言,虽然我们可以通过代码做类型检查,但更多的时候是需要使用者自觉遵守API的约定,否则不仅代码冗余,而且性能低下。

多谢qiang哥和各位的耐心解答. :lol:

Java对我的影响还是很深的. 只是这样来写. 会不会在不经意间污染了数据而出现了难以调试的问题?

按照经验来说这个性能损耗能有多大呢.

array_splice让$index成了0. 如果数据被污染. 岂不是很难找到究竟是哪里出了问题?

还有一个问题就是. 为什么removeAt失败要抛出异常? 因为简单的bool值就能知道结果. 抛出异常是不是增加了在使用这个方法时要写得代码量? 返回被删除的值个人感觉也没有必要. 他既然知道index. 那必然可以知道值啊.

学习了!