> 백엔드 개발 > PHP 튜토리얼 > foreach循环中$p[] = $MaterialType 的疑问

foreach循环中$p[] = $MaterialType 的疑问

WBOY
풀어 주다: 2016-06-23 14:00:34
원래의
980명이 탐색했습니다.

class so_getMaterialType{	var $CreateTime = '';	var $IsDefault = '';	var $UpdateTime = '';}$p = array();$sql = 'SELECT * from tb where lid<50';$re_materialTypeID = $db->getAll($sql);foreach($re_materialTypeID as $key => $val){		$getMaterialType = new so_getMaterialType ;  //为什么每次循环都要新申请一遍,而不是放在循环外面申请一次即可??				$getMaterialType->CreateTime =  $val['CreateTime'];		$getMaterialType->IsDefault = $val['IsDefault'];		$getMaterialType->UpdateTime = $val['UpdateTime'] ;		$p[] = $getMaterialType ;}var_dump($p);return $p;	/*????????这种写法与上面差别是什么?????????????*/$getMaterialType = array();$getMaterialType[] = new so_getMaterialType ;$sql = 'SELECT * from tb where lid<50';$re_materialTypeID = $db->getAll($sql);foreach($re_materialTypeID as $key => $val){		$getMaterialType[$key]->CreateTime =  $val['CreateTime'];		$getMaterialType[$key]->IsDefault = $val['IsDefault'];		$getMaterialType[$key]->UpdateTime = $val['UpdateTime'] ;}var_dump($getMaterialType);return $getMaterialType;
로그인 후 복사


回复讨论(解决方案)

我在用amf2.1.1 与flex通讯,产生的问题,调试过程中,传递这样类的数组总是有问题

第一段代码
$p 是一个含有若干个 so_getMaterialType 对象的数组

第二段代码
$getMaterialType 的第一个元素是 so_getMaterialType 对象,其余的是 stdClass 对象

显然你需要的是第一种写法的结果
因此可以

class so_getMaterialType {  var $CreateTime = '';  var $IsDefault = '';  var $UpdateTime = '';  function __construct($a) {    foreach($a as $k->$v) $this->$k = $v;  }}$p = array();$sql = 'SELECT * from tb where lid<50';$re_materialTypeID = $db->getAll($sql); foreach($re_materialTypeID as $key => $val) {   $p[] = new so_getMaterialType($val) ;}
로그인 후 복사

比如循环了10次,第一种写法保存了so_getMaterialType的10个对象,第二种写法只保存了一个对象,所以第二种写法里得到的数组值是一样的。

这就好比下面这一段代码:

$value = 10;$array[0] = $value;$value=12;$array[1] = $value;print_r($array);
로그인 후 복사
로그인 후 복사

得到的结果必然是两个12

不好意思,上面的例子错了。只有在对象的赋值中才会有这种,因为对象本质上是一个指针

终于和flex通了一个函数,谢谢楼主。

比如循环了10次,第一种写法保存了so_getMaterialType的10个对象,第二种写法只保存了一个对象,所以第二种写法里得到的数组值是一样的。

这就好比下面这一段代码:

$value = 10;$array[0] = $value;$value=12;$array[1] = $value;print_r($array);
로그인 후 복사
로그인 후 복사

得到的结果必然是两个12

第15行:
$getMaterialType = new so_getMaterialType ; //为什么每次循环都要新申请一遍,而不是放在循环外面申请一次即可??
你的意思是,如果只申请一次new so_getMaterialType 那么数组p中的每个类对象都是一样的值,对吧,我在跟踪过程中的确是这样的,
$p[] = $getMaterialType ; 这里,p[] 理解成数组的指针? ,指向10个类对象,对么?

 $getMaterialType = new so_getMaterialType ;
로그인 후 복사

关键字new会生成一个内存空间,该内存的地址赋给$getMaterialType,即$getMaterialType是一个指向前面内存空间的地址。所以,对象$getMaterialType就是指针。

$p[] = $getMaterialType ;
로그인 후 복사

因为第一种写法没有改变$getMaterialType的值,所有p[]里所有元素指向同一块内存地址,数据当然也就一样了。
而第二种写法中,每次都会生成一个新的内存空间,并把地址赋给$getMaterialType,所以p[]中元素指向的是不同的内存空间。

简单来说:
只有$getMaterialType =  ×××才会改变$getMaterialType值,$getMaterialType->属性 = ×××不会改变$getMaterialType的值

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿