类和变量放入Session的差别

iamyuqing 2010-06-23 03:52:38
刚开始研究OOP,发现一个问题,不知道哪里可以求证到原理
比如下面的代码,定义一个cart类$cart,并将其放入$_SESSION['cart']中,当$cart发生变动时,$_SESSION['cart']也随之变动,但是如果把变量$str放入$_SESSION['str']时,$str的变动就不影响$_SESSION['str']了。

在PHP手册里面没找到关于这个差别的说明,哪位老大知道PHP是以什么样的机制来处理自定义类和变量在SESSION中的存储么?谢谢!

<?php
session_start();
class cart{
var $items;
var $total;
var $sum;

function add_item($id,$num,$price){
$this->items[$id]+=$num;
$this->total+=$num*$price;
$this->sum+=$num;
}

function remove_item($id,$num,$price){
$this->items[$id]-=$num;
$this->total-=$num*$price;
$this->sum-=$num;
}

function view_items(){
$rs=$this->items;
$keys=array_keys($rs);
print "<table border=1><caption>Item List</caption><tr align=center><td>Item</td><td>Number</td><td>remark</td></tr>";
foreach($keys as $key){
print "<tr><td>".$key."</td><td>".$rs[$key]."</td><td>-</td></tr>";}
print "<tr><td colspan=3>Total:".$this->total."</td></tr></table>";}
}
/*
$cart=new cart;
$cart->add_item("cake",10,25);
$cart->add_item("candy",10,15);
$cart->add_item("apple",10,25);
$cart->add_item("orange",10,25);
$cart->add_item("wine",10,25);
$_SESSION['cart']=$cart;
$cart->view_items();
$cart->remove_item("bay",5,25);
$cart->remove_item("apple",5,3);
$cart->view_items();
*/
print "sum from session:".$_SESSION['cart']->sum."<br>";
print_r($_SESSION['cart']);
$str="aaa";
$_SESSION['str']=$str;
$str="bbb";
print $_SESSION['str'];

?>
...全文
79 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jlzan1314 2010-06-23
  • 打赏
  • 举报
回复
<?php
session_start();
class cart{
var $items;
var $total;
var $sum;

function add_item($id,$num,$price){
$this->items[$id]+=$num;
$this->total+=$num*$price;
$this->sum+=$num;
}

function remove_item($id,$num,$price){
$this->items[$id]-=$num;
$this->total-=$num*$price;
$this->sum-=$num;
}

function view_items(){
$rs=$this->items;
$keys=array_keys($rs);
print "<table border=1><caption>Item List</caption><tr align=center><td>Item</td><td>Number</td><td>remark</td></tr>";
foreach($keys as $key){
print "<tr><td>".$key."</td><td>".$rs[$key]."</td><td>-</td></tr>";}
print "<tr><td colspan=3>Total:".$this->total."</td></tr></table>";}
}

$cart=new cart;
$cart->add_item("cake",10,25);
$cart->add_item("candy",10,15);
$cart->add_item("apple",10,25);
$cart->add_item("orange",10,25);
$cart->add_item("wine",10,25);
$_SESSION['cart']=clone $cart;
#$_SESSION['cart']=$cart;
$cart->remove_item("bay",5,25);
$cart->remove_item("apple",5,3);

$_SESSION['cart']->view_items();
$cart->view_items();

print "sum from session:".$_SESSION['cart']->sum."<br>";
print_r($_SESSION['cart']);
$str="aaa";
$_SESSION['str']=$str;
$str="bbb";
print $_SESSION['str'];

?>

注意clone 的用法.
CunningBoy 2010-06-23
  • 打赏
  • 举报
回复
$cart = new cart; //这里的$cart是一个reference
$str是变量。

$_SESSION['cart'] = $cart; //这个是让$_SESSION['cart']和$cart指向同一块数据。
$_SEESION['str' = $str; //是两个变量;

具体可以参看PHP手册“Classes and Objects (PHP 5)”部分。
iamyuqing 2010-06-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jlzan1314 的回复:]
php5 以上是引用传递类的.变量不是引用传递的.
[/Quote]

谢谢!那么如果要引用传递类,让类作为变量保存时处于静态,有什么办法么?
jlzan1314 2010-06-23
  • 打赏
  • 举报
回复
php5 以上是引用传递类的.变量不是引用传递的.

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧