刚开始研究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>re</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'];?>

解决方案 »

  1.   

    php5 以上是引用传递类的.变量不是引用传递的.
      

  2.   

    $cart = new cart; //这里的$cart是一个reference
    $str是变量。$_SESSION['cart'] = $cart; //这个是让$_SESSION['cart']和$cart指向同一块数据。
    $_SEESION['str' = $str; //是两个变量;具体可以参看PHP手册“Classes and Objects (PHP 5)”部分。
      

  3.   

    <?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>re</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 的用法.