0

私は非常に特定の目的のために一種のショッピング カートを作成しており、2 つの基本的なクラスを作成しています。1 つのクラスはカート内の製品を記述するために作成され、もう 1 つのクラスはカートです。

私の CartItem クラスは次のようになります。

class CartItem
{
    private $id         =   null;        //  This is the product id
    private $qty        =   0;           //  This is the product Quantity
    private $price      =   0;           //  This is the product price
    private $name       =   '';          //  This is the product name
    private $options    =   array();     //  This array contains the product options
    private $rowid      =   null;        //  This is the product id in the cart
    private $subtotal   =   0;           //  This is the product sub total

    public function __construct(
        $id = null, 
        $qty = null, 
        $price = null, 
        $name = null, 
        $options = array()
    )
    {
        $this->id       =   $id;            
        $this->qty      =   (float)$qty;
        $this->price    =   (float)$price;
        $this->name     =   $name;
        $this->options  =   $options;
    }

    public function __get($name)
    {
        return $this->{$name};
    }

    ...

    public function setQty($qty = 0)
    {
        $this->qty      =   (float)$qty;
        return $this->qty;
    }

    ...

}

私のカートクラスは次のとおりです。

class Cart
{
    protected $cart_contents    =   array();
    protected $cart             =   null;

    protected function __construct()
    {
        $this->cart             =   new SessionContainer('cart_contents');
        $this->cart_contents    =   $this->cart->offsetGet('contents');

        if(count($this->cart_contents)  <=  2)
        {
            $this->cart_contents    =   array(
                'cart_total'    =>  0,
                'total_items'   =>  0
            );
        }
    }

    public function insert(CartItem $item)
    {
        $save_cart  =   false;

        if(($rowid  =   $this->_insert($item)))
        {
            $save_cart  =   true;
        }

        if($save_cart   ===    true)
        {
            $this->_save_cart();

            return isset($rowid) ? $rowid : true;
        }

        return false;
    }

    protected function _insert(CDOCartItem $item)
    {
        if($item->qty   ==  0)
        {
            return false;
        }

        if(is_array($item->options) && count($item->options) > 0)
        {
            $rowid  =   md5($item->id . serialize($item->options));
        }
        else
        {
            $rowid  =   md5($item->id);
        }

        $old_quantity   =   isset($this->cart_contents[$rowid]->qty) ? $this->cart_contents[$rowid]->qty : 0;

        $item->setRowId($rowid);
        $item->setQty($item->qty + $old_quantity);

        $this->cart_contents[$rowid]    =   $item;
        return $rowid;
    }

    public function update(CDOCartItem $item)
    {
        $save_cart  =   false;

        if($this->_update($item) === true)
        {
            $save_cart  =   true;
        }

        if($save_cart === true)
        {
            $this->_save_cart();
            return true;
        }

        return false;
    }

    protected function _update(CartItem $item)
    {
        echo "Is this empty : " . empty($item->qty) . " : " . $item->qty;

        if(empty($item->qty) || empty($item->rowid) || !isset($this->cart_contents[$item->rowid]))
        {
            return false;
        }

        $item->setQty((float)$item->qty);

        if($item->qty    <=  0)
        {
            unset($this->cart_contents[$item->rowid]);
        }
        else
        {
            $this->cart_contents[$item->rowid]->qty = $item->qty;
        }

        return true;
    }
}

次に、この構造で遊んでみます。

$item    =     new CartItem('SKU-12321', 12, 47.82, 'Name');
$cart    =     Cart::Instance(); // I have apply the singleton patternt in my local files
$itemRID =     $cart->insert($item);
$newItem =     $cart->get_item($itemRID); // This method return the object based on ID and 100% works in my code
$newItem->setQty(25);
$cart->update($newItem);

しかし、問題は、次の結果が得られることです。

Is it empty : 1 : 25

上記の行は update メソッドの Cart クラスに出力されます。

ご覧のとおり、$item->qty が空であるかどうかをテストしています。テストは true を返します。同じ値で、現在のアイテムの数量が 25 であることをエコーし​​ているので、実際のプロパティは空ではありません。

私は何か間違っていますか?PHP ドキュメントでは、関数 empty を使用して変数の空または null 値をテストできると説明していますが、それがプロパティで機能するかどうかはわかりません。

誰か助けてくれませんか?

4

1 に答える 1

3

問題はあなたから来ていると思いますCartItem::__get()。説明します:$qtyはプライベートなのでempty($item->qty)、要素の外部からアクセスできないため、 a は true を返しますが、 だけ$item->qtyでアクセスすると、変数は (プライベートであるため) 存在しないと見なされるため、__get()メソッドが呼び出されて返されますクラス内でアクセスするため、正しい値です。

于 2013-07-04T09:40:52.657 に答える