New Ribbon
用Canva設計超快超質感(第2版):商業設計、簡報、影片、網頁、電子書與AI應用最速技 AI繪圖工具 × AI視覺設計平台,從圖像生成到專業設計! 最強職場助攻!ChatGPT + AI 高效工作術 短影音制霸:打造TikTok、YT Shorts、IG Reels成功方程式與AI高效創作力 Canva+AI創意設計與品牌應用250招:從商業技巧、社群祕技到AI圖文影音特效 快快樂樂學威力導演2024.影音剪輯與AI精彩創作 Power Automate自動化超效率工作術 Midjourney AI圖像魔導書:搭配ChatGPT魔法加倍 超人氣FB+IG+LINE社群經營與行銷力(第二版) 翻倍效率工作術:不會就太可惜的 Excel × ChatGPT 自動化應用 AppInventor2零基礎入門班中文版(第六版) Python零基礎入門班(第四版) C語言學習聖經 用Canva設計超快超質感:平面、網頁、電子書、簡報、影片製作與AI繪圖最速技 PHP8/MySQL網頁程式設計自學聖經 翻倍效率工作術 - 不會就太可惜的Power BI大數據視覺圖表設計與分析(第三版) 社群經營一定要會的影音剪輯與動畫製作術 Notion高效管理250招:筆記×資料庫×團隊協作,數位生活與工作最佳幫手 Office 2021高效實用範例必修16課(附500分鐘影音教學/範例檔) Excel自學聖經(第二版):從完整入門到職場活用的技巧與實例大全

 

  挑戰php5 18章

piggy

piggy
更新時間:2009/8/31 上午 04:22:46

 

非常感謝您在前一篇的講解

但我看完後還是有些不明白的地方

若下面問題或觀念有錯誤的地方希望您能不吝指教


1.
我們使用new類別名稱的方法建立cart物件
請問cart物件裡面的屬性值都是由書上18-15頁的11行來的嗎?(就是每一件商品加入購物車的值都是由這邊來的)
$cart->add_item($_POST['id'],$_POST['qty'],$_POST['price'],$_POST['name']);

2.
執行物件中add_item()方法
購物車中若沒有這個產品就新增產品到購物車的陣列之中
並將商品資訊設定為參數
執行後參數值會變成物件的屬性值
例如:
$cart->add_item(1,1,10,'鉛筆');

$this->items[]=1;
$this->itemqtys[1] = 1;
$this->itemprices[1] = 10;
$this->iteminfo[1] = '鉛筆';

請問執行add_item()方法後參數值會變成物件的屬性值
1,1,10,'鉛筆'是被儲存到那邊了?

var $items = array();
var $itemprices = array();
var $itemqtys = array();
var $iteminfo = array();

是一個一個被儲存在上方類別屬性的陣列裡面嗎?

foreach($cart->items as $value){
echo $value."</br>";
}

所以我才可以在程式裡用foreach()函式取出陣列裡面1這個值嗎?

而其他方法裡面需要某些商品資訊也是來類別屬性的陣列裡面取用嗎(ex.$this->itemqtys[$itemid] = $qty;)?

就像11-7頁21-26行物件名稱->屬性=值 值是被儲存到那邊了呢?
3.
您說函式宣告時可以同時定義所帶的參數的初值,這裡設定FALSE表示這二個參數沒有初值為空。
為什麼function add_item($itemid,$qty=1,$price = FALSE, $info = FALSE)
$price 要給 FALSE 而不給 0
所代表的意義不一樣嗎?



4.
執行add_item()方法後要更新商品數量 _update_total()
if(sizeof($this->items > 0)){
您說sizeof() 可以計算指定的陣列中的元素數目。
但為什麼不是寫成
if(sizeof($this->items) > 0){
先計算陣列中的元素數目 如果大於零再執行以下動作
另外sizeof()函式可以用count()函式取代嗎?


5.
為什麼_update_total()方法$this->total裡面還要再寫一次$this->total +
foreach($this->items as $item)
{
    $this->total = $this->total + ($this->itemprices[$item] * $this->itemqtys[$item]);
    $this->itemcount++;
}

6.
function get_contents()
{
     $items = array();
     foreach($this->items as $tmp_item)
     {
        $item = FALSE;
        $item['id'] = $tmp_item;
        $item['qty'] = $this->itemqtys[$tmp_item];
        $item['price'] = $this->itemprices[$tmp_item];
        $item['info'] = $this->iteminfo[$tmp_item];
        $item['subtotal'] = $item['qty'] * $item['price'];
        $items[] = $item;
      }
      return $items;
}
經過您的說明我還是不太懂 get_contents()方法實際的功用?

為什麼還要將$items 中購物車內容資料時所存取的暫存陣列存到$item裡面呢?

您說get_contents()的功能在取得Session中所記錄的購物車內容
所以get_contents()裡面的$this->items資料不是由
$cart->add_item($_POST['id'],$_POST['qty'],$_POST['price'],$_POST['name']);
傳過來的嗎?

您說使用foreach()函式每次執行都可以取得目前這筆資料在陣列中的索引值

索引值是指每樣商品的$itemid嗎?

而將宣告的itemqtys[]陣列中的值代入暫存的陣列$item['qty']中

itemqtys[]的值又是那邊取得的呢?

cart.php 104-116中所要顯示的資料
因為$items[] = $item;將取得值回存到$items陣列中,再送回程式去顯示
所以foreach($cart->get_contents() as $item) {
就可以看作是foreach($items as $item) { 這樣嗎?
而cart.php裡的產品名稱,數量,單價,小計
<?php echo $item['info'];?>
<?php echo $item['id'];?>
<?php echo $item['qty'];?>
<?php echo number_format($item['price']);?>
<?php echo number_format($item['subtotal']);?>
裡面的$item['info'],$item['id']...跟function get_contents(){

裡面的$item['info'],$item['id']...是一樣的嗎?

為什麼還要再用foreach($cart->get_contents() as $item) {讀取一次呢?

可以麻煩您在詳細說明get_contents()跟foreach($cart->get_contents() as $item)的關連嗎?

文淵閣工作室

文淵閣工作室
更新時間:2009/8/31 下午 05:44:16

 

1.您的頁面似乎有誤,18-15頁沒有看到您所說的部份。不過您所說的地方,可以說是購物車物件的關鍵。購物車內屬性有幾個重的內容,總價、總數,還有最重要的購物車商品內容。而總價、總數都是由每一個商品加總後的結果,所以 add_item() 的功能即是將選擇的商品加入購物車物件中,進而算出總價等屬性。
2.沒錯,是儲存到陣列中,這裡商品的資訊是儲存到陣列中,而您指的11-7頁只是物件中的屬性,那裡並沒有定義陣列,是儲存在該屬性中。
3.一樣,您也可以設定帶初值為0,這是官方提供的碼,它的格式預設是False。
4.if(sizeof($this->items > 0)){ 的確是很奇怪的寫法,合理應是如您所寫if(sizeof($this->items) > 0){,我們有修改過,測試也沒有問題。
sizeof()與count()是相同的。
http://us.php.net/manual/en/function.sizeof.php
sizeof()是count()的別名。
5.每一次執行更新的動作,其實他是將原來的結果歸零,再進行重新計算。

文淵閣工作室

文淵閣工作室
更新時間:2009/8/31 下午 11:03:44

 

6.那是不是可以不透過get_contents()的功能,將購物車內的產品的內容取顯示在頁面呢?當然可以,但是如此一來您每次要一個欄位都要由$cart物件中去取出,程式寫起來較為冗長易錯。所以get_contents()將購物車的內容輸出到$item陣列中,不用透過$cart物件即可取得商品的內容。
我們重新不利用get_contents()功能去取得購物車的內容,而直接使用$cart物件的方式去取得購物車的內容,您可以到
http://www.funp.net/722320
檔名為<cartnew2.php>下載回去對照,放置在原程式下,測試時您可以購物車選多種商品後,切換到這個頁面看看,您會發現與原來的<cart.php>效果是一樣的,但是<cartnew2.php> 103~116之間的程式碼是直接使用取得$cart物件內之中的值,比對原來的<cart.php>是複雜許多。
使用get_contents()會較為簡單,甚至每樣商品的小計都可以直接在get_contents()中計算好,在<cart.php>中就可以直接取用。

ken

ken
更新時間:2014/7/29 上午 08:49:43

 

那請問如果要把[get_contents()]裡面得直送到smilepay金流那裏那要怎麼使用?

文淵閣工作室

文淵閣工作室
更新時間:2014/7/29 上午 10:02:40

 

金流的溝通與連接因為不是本書的範圍,一般刷卡或是金流都有各自公司規劃的端口與安全機制,每一家都不儘相同,這部份要麻煩詢問您的金流公司。

ken

ken
更新時間:2014/7/29 上午 10:13:43

 

那請問要怎麼取得get_contents()裡面得直,因未顯示出來的都是空白的,那請問有辦法用$_POST的方法嗎

文淵閣工作室

文淵閣工作室
更新時間:2014/7/30 上午 11:25:09

 

get_contents()是 wfCart 的方法,使用後會將目前購物車中的內容儲存在一個array陣列中,所以在程式中我們要利用foreach的方法將array的內容取出,例如

<?php
foreach($cart->get_contents() as $item) {
 echo $item['id']; //流水號
 echo $item['info']; //產品名稱
 echo $item['qty']; //購買數量
 echo $item['subtotal']; //小計
}
?>




 

 

Re:挑戰php5 18章

請輸入姓名。

已超出字元數目的最大值。


請輸入電子郵件。

格式無效。


請輸入內容。