看CList源码,问个基础的问题

public function copyFrom($data)

{


	if(is_array($data) || ($data instanceof Traversable))


	{


		if($this->_c>0)


			$this->clear();


		if($data instanceof CList)


			$data=$data->_d;


		foreach($data as $item)


			$this->add($item);


	}


	else if($data!==null)


		throw new CException(Yii::t('yii','List data must be an array or an object implementing Traversable.'));


}

这里

if($data instanceof CList)

			$data=$data->_d;

怎么能调用$data的private成员_d呢?而且我测试居然通过

想不通居然可以直接调用$data->_d这样的private属性

这因该是php的一个特性:你可以在类的内部访问同类实例的private member 和protected member;


if($data instanceof CList)

  $data=$data->_d;

这个特性确实感觉用的很少;正如手册上说的,这个特性也没有在任何地方有讲解:

http://www.php.net/manual/en/language.oop5.visibility.php#75426这是php handbook上所讲述的。

问:在java这种面向对象语言中是否就是这样呢(如果是这样,这就是没有学习面向对象的弱势了)?

[s]另一个问题是:CList继承了CComponent的两个private $_e, $_m?(这是何由-总是一直认为私有属性是不继承的)


$list = new CList(array(1,2,3,4,5));

var_dump($list);

其结果:


object(CList)[70]

  private '_d' => 

    array

      0 => int 1

      1 => int 2

      2 => int 3

      3 => int 4

      4 => int 5

  private '_c' => int 5

  private '_r' => boolean false

  private '_e' => null

  private '_m' => null

[/s]

杯具 :(

是var_dump自身的原因,会输出父类的私有属性。唉…

:rolleyes:

thx

手册里面的评论相当多的精华