class so_getmaterialtype{ var $createtime = ''; var $isdefault = ''; var $updatetime = '';}$p = array();$sql = 'select * from tb where lidgetall($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 lidgetall($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 lidgetall($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的值