2013-03-06 230 views
0

我呼籲ot_lev_discount從另一個類調用變函數

一類在類我有一個函數:

<?php 
/* 
<<<<<<< ot_lev_discount.php 
    $Id: ot_lev_discount.php,v 1.0 2002/04/08 01:13:43 hpdl Exp $ 
======= 
    $Id: ot_lev_discount.php,v 1.3 2002/09/04 22:49:11 wilt Exp $ 
    $Id: ot_lev_discount.php,v 2.4 2006/02/28 12:10:01 maniac101 Exp $ 
modified to calc discount correctly when tax is included in discount 
>>>>>>> 2.4 

    osCommerce, Open Source E-Commerce Solutions 
    http://www.oscommerce.com 

    Copyright (c) 2002 osCommerce 

    Released under the GNU General Public License 
*/ 

    class ot_lev_discount { 
    var $title, $output; 

    function ot_lev_discount() { 
     $this->code = 'ot_lev_discount'; 
     $this->title = MODULE_LEV_DISCOUNT_TITLE; 
     $this->description = MODULE_LEV_DISCOUNT_DESCRIPTION; 
     $this->enabled = MODULE_LEV_DISCOUNT_STATUS; 
     $this->sort_order = MODULE_LEV_DISCOUNT_SORT_ORDER; 
     $this->include_shipping = MODULE_LEV_DISCOUNT_INC_SHIPPING; 
     $this->include_tax = MODULE_LEV_DISCOUNT_INC_TAX; 
     $this->calculate_tax = MODULE_LEV_DISCOUNT_CALC_TAX; 
     $this->table = MODULE_LEV_DISCOUNT_TABLE; 
//  $this->credit_class = true; 
     $this->output = array(); 
    } 

    function process() { 
     global $order, $ot_subtotal, $currencies; 
     $od_amount = $this->calculate_credit($this->get_order_total()); 
     if ($od_amount>0) { 
     $this->deduction = $od_amount; 
     $this->output[] = array('title' => $this->title . ':', 
           'text' => '<b>' . $currencies->format($od_amount) . '</b>', 
           'value' => $od_amount); 
    $order->info['total'] = $order->info['total'] - $od_amount; 
    if ($this->sort_order < $ot_subtotal->sort_order) { 
     $order->info['subtotal'] = $order->info['subtotal'] - $od_amount; 
    } 
} 
    } 


    function calculate_credit($amount) { 
    global $order; 
    $od_amount=0; 
    $table_cost = split("[:,]" , MODULE_LEV_DISCOUNT_TABLE); 
    for ($i = 0; $i < count($table_cost); $i+=2) { 
      if ($amount >= $table_cost[$i]) { 
      $od_pc = $table_cost[$i+1]; 
      } 
     } 
// Calculate tax reduction if necessary 
    if($this->calculate_tax == 'true') { 
// Calculate main tax reduction 
     $tod_amount = round($order->info['tax']*10)/10*$od_pc/100; 
     $order->info['tax'] = $order->info['tax'] - $tod_amount; 
// Calculate tax group deductions 
     reset($order->info['tax_groups']); 
     while (list($key, $value) = each($order->info['tax_groups'])) { 
     $god_amount = round($value*10)/10*$od_pc/100; 
     $order->info['tax_groups'][$key] = $order->info['tax_groups'][$key] - $god_amount; 
     } 
    } 


    $od_amount = $od_pc; 
    // if you want to use %age instead of flat amount: $od_amount = round($amount*10)/10*$od_pc/100; 


// $od_amount = $od_amount + $tod_amount; 
// maniac101 above line was adding tax back into discount incorrectly for me 
    return $od_amount; 
    } 


    function get_order_total() { 
    global $order, $cart; 
    $order_total = $order->info['total']; 
// Check if gift voucher is in cart and adjust total 
    $products = $cart->get_products(); 
    for ($i=0; $i<sizeof($products); $i++) { 
     $t_prid = tep_get_prid($products[$i]['id']); 
     $gv_query = tep_db_query("select products_price, products_tax_class_id, products_model from " . TABLE_PRODUCTS . " where products_id = '" . $t_prid . "'"); 
     $gv_result = tep_db_fetch_array($gv_query); 
     if (ereg('^GIFT', addslashes($gv_result['products_model']))) { 
     $qty = $cart->get_quantity($t_prid); 
     $products_tax = tep_get_tax_rate($gv_result['products_tax_class_id']); 
     if ($this->include_tax =='false') { 
      $gv_amount = $gv_result['products_price'] * $qty; 
     } else { 
      $gv_amount = ($gv_result['products_price'] + tep_calculate_tax($gv_result['products_price'],$products_tax)) * $qty; 
     } 
     $order_total=$order_total - $gv_amount; 
     } 
    } 
    if ($this->include_tax == 'false') $order_total=$order_total-$order->info['tax']; 
    if ($this->include_shipping == 'false') $order_total=$order_total-$order->info['shipping_cost']; 
    return $order_total; 
    } 



    function check() { 
     if (!isset($this->check)) { 
     $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_LEV_DISCOUNT_STATUS'"); 
     $this->check = tep_db_num_rows($check_query); 
     } 

     return $this->check; 
    } 

    function keys() { 
     return array('MODULE_LEV_DISCOUNT_STATUS', 'MODULE_LEV_DISCOUNT_SORT_ORDER','MODULE_LEV_DISCOUNT_TABLE', 'MODULE_LEV_DISCOUNT_INC_SHIPPING', 'MODULE_LEV_DISCOUNT_INC_TAX','MODULE_LEV_DISCOUNT_CALC_TAX'); 
    } 

    function install() { 
     tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Display Total', 'MODULE_LEV_DISCOUNT_STATUS', 'true', 'Do you want to enable the Order Discount?', '6', '1','tep_cfg_select_option(array(\'true\', \'false\'), ', now())"); 
     tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_LEV_DISCOUNT_SORT_ORDER', '999', 'Sort order of display.', '6', '2', now())"); 
     tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function ,date_added) values ('Include Shipping', 'MODULE_LEV_DISCOUNT_INC_SHIPPING', 'true', 'Include Shipping in calculation', '6', '3', 'tep_cfg_select_option(array(\'true\', \'false\'), ', now())"); 
     tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function ,date_added) values ('Include Tax', 'MODULE_LEV_DISCOUNT_INC_TAX', 'true', 'Include Tax in calculation.', '6', '4','tep_cfg_select_option(array(\'true\', \'false\'), ', now())"); 
     tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function ,date_added) values ('Calculate Tax', 'MODULE_LEV_DISCOUNT_CALC_TAX', 'false', 'Re-calculate Tax on discounted amount.', '6', '5','tep_cfg_select_option(array(\'true\', \'false\'), ', now())"); 
     tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Discount Percentage', 'MODULE_LEV_DISCOUNT_TABLE', '100:7.5,250:10,500:12.5,1000:15', 'Set the price breaks and discount percentages', '6', '6', now())"); 
    } 

    function remove() { 
     $keys = ''; 
     $keys_array = $this->keys(); 
     for ($i=0; $i<sizeof($keys_array); $i++) { 
     $keys .= "'" . $keys_array[$i] . "',"; 
     } 
     $keys = substr($keys, 0, -1); 

     tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in (" . $keys . ")"); 
    } 

    } 
?> 

我想從不同的PHP文件,所以我做了呼應$ od_amount變量以下無濟於事:

require(DIR_WS_MODULES . 'order_total/ot_lev_discount.php'); 
$ot_lev_discount = new ot_lev_discount(); 

echo $ot_lev_discount->od_amount; 

我似乎能夠調用的類中的類函數這樣的全局變量,但不是的。

+0

什麼是構造函數? '$ ot_lev_discount-> od_amount'返回什麼? '$ od_amount'是'ot_lev_discount'的屬性嗎?如果您發佈更多(全部)課程,這將有所幫助。 – MichaelRushton 2013-03-06 15:07:12

+0

類方法中的變量被限定爲該方法的範圍,因此無法在外部訪問;就像正常功能中局部變量的作用範圍與該功能一樣......你爲什麼不這樣想? – 2013-03-06 15:07:20

+0

我添加了整個班級來看看。 $ ot_lev_discount-> od_amount沒有返回任何內容。至少不是當我像我一樣迴應它時?我不確定你的意思是ot_lev_discount – Sackling 2013-03-06 15:11:37

回答

1

global不會使某個變量成爲某個類的屬性,它只會告訴該值可以在其中的任何方法中使用。

你可以解決這個問題,看this example

0

通過調用$ot_lev_discount->od_amount你正在試圖獲得od_amount屬性格式類的,但你的類沒有一個。

您需要修改您的類是這樣的:您將能夠訪問使用$ot_lev_discount->od_amount財產

class ot_lev_discount { 

    ... 

    public $od_amount; 

    function calculate_credit($amount) 
    { 
     ... 
     $this->od_amount = $od_amount; 

     return $od_amount; 
    } 

} 

這樣。當然,除非你調用$ot_lev_discount->calculate_credit()函數,否則它的值將爲空。

花一些時間閱讀關於類,對象,它們的屬性和變量作用域的文檔。它應該闡明你所面臨的問題(這些是面向對象編程的一般主題,而不僅僅是PHP)。

0

函數中的變量具有該函數的局部範圍,並且不能從函數外部調用。您可以通過以下操作使這些變量的作用域類級別和公衆:

class ot_lev_discount { 
    public $od_amount; 
    .... 
} 

然後你就可以訪問該變量爲這樣:

$var = new ot_lev_discount(); 
$var->od_amount; 

雖然,在這種情況下,每次創建一個新對象,該對象將擁有自己的od_amount變量,該變量與同一類的另一個對象不同,並且不會具有相同的值,除非您對其執行相同的計算。

或者,調用函數並獲取返回值。

+0

好吧我試着讓$ od_amount公開,但我得到了T_PUBLIC解析錯誤。我將嘗試調用該函數並獲取返回值,但我不太清楚該怎麼做,因爲它需要$ amount,否則我會得到「缺少參數」錯誤 – Sackling 2013-03-06 15:25:46

+0

您必須在功能,但在課堂上。你不能在函數內部設置一個'public'屬性。 – 2013-03-06 15:28:27

+0

我也試過這樣做,當我從第二類回聲它沒有金額..因此,它需要與您的備選建議,我認爲這樣的金額計算完成,然後我當$ od_amount返回時,我想要回聲說..我只是不知道如何做到這一點 – Sackling 2013-03-06 15:31:01