2013-08-26 74 views
4

我已經通過一些代碼XDebug的運行和我不斷注意到_underscoreCache爲k v對的數組:什麼是_underscoreCache在Magento

object 
collection 
is_default 
default_group_id 
front 
store_id 
action 
session_hosts 
controller_action 
request 
secure 
visitor_data 
website 
quote 
items_collection 
parent_item_id 
quote_id 
item_id 
product_id 
code 
attributes 
website_id 
attribute_set_id 
additional_attribute_table 
attribute_codes 
is_global 
skip_confirmation_if_email 
confirmation 
visibility 
is_salable 
stock_item 
udropship_vendor 
custom_vars_combined 
password_enc 
vendor_name 
use_local_stock 
is_recurring 
customer_group_id 
date 
product_collection 
product_name 
product_type_id 
product_status_changed 
is_changed_websites 
product_changed_websites 
license_key 
license_key 
license_status 
license_expire 
server_restriction 
products 
module_name 
use_config_manage_stock 
is_in_stock 
stock_status 
product_type 
sku 
name 
weight 
tax_class_id 
cost 
base_cost 
is_qty_decimal 
quote_item 
product 
message 
item 
is_super_mode 
qty_to_add 
is_child_item 
has_error 
item_is_qty_decimal 
has_qty_option_update 
item_qty 
orig_qty 
use_config_min_sale_qty 
use_config_max_sale_qty 
suppress_check_qty_increments 
use_config_enable_qty_increments 
use_config_min_qty 
item_use_old_qty 
item_backorders 
ignore_old_qty 
use_old_qty 
skip_check_required_option 
ud_skip_quote_load_after_event 
order 
has_children 
vendor_sku 
address_type 
address 
postcode 
limit_zipcode 
country_id 
allowed_countries 
stockcheck_method 
true_stock 
udropship_stock_levels 
stock_result 
quote_currency_code 
currency_code 
customer_id 
prefix 
customer_prefix 
firstname 
customer_firstname 
middlename 
customer_middlename 
lastname 
customer_lastname 
suffix 
customer_suffix 
email 
customer_email 
dob 
customer_dob 
taxvat 
customer_taxvat 
gender 
customer_gender 
customer_tax_class_id 
remote_ip 
x_forwarded_for 
items_count 
checkout_method 
checkout_state 
collect_shipping_rates 
totals_collected_flag 
extra_tax_amount 
base_extra_tax_amount 
subtotal 
base_subtotal 
subtotal_with_discount 
base_subtotal_with_discount 
grand_total 
base_grand_total 
quote_address 
is_multi_shipping 
total_qty 
base_virtual_amount 
virtual_amount 
subtotal_incl_tax 
base_subtotal_incl_tax 
applied_rule_ids 
shipping_tax_amount 
base_shipping_tax_amount 
applied_taxes_reset 
free_shipping 
free_method_weight 
region_id 
customer_class_id 
store 
parent_id 
product_class_id 
shipping_amount 
base_shipping_amount 
shipping_incl_tax 
base_shipping_incl_tax 
shipping_taxable 
base_shipping_taxable 
is_shipping_incl_tax 
base_cod_fee 
cod_fee 
cod_tax_amount 
base_cod_tax_amount 
method 
prev_quote_customer_group_id 
discount_amount 
base_discount_amount 
base_calculation_price 
calculation_price 
base_original_price 
original_custom_price 
rate 
row_total 
base_row_total 
coupon_code 
no_discount 
coupon_type 
uses_per_customer 
is_primary 
uses_per_coupon 
use_auto_generation 
usage_limit 
operator_option 
operator_by_input_type 
value_option 
operator_options 
type 
aggregator 
value 
actions 
aggregator_option 
aggregator_options 
rule 
conditions_serialized 
attribute_option 
attribute 
operator 
is_value_parsed 
value_parsed 
actions_serialized 
simple_free_shipping 
stop_rules_processing 
tax_percent 
custom_price 
base_price 
price_incl_tax 
base_price_incl_tax 
row_total_incl_tax 
base_row_total_incl_tax 
taxable_amount 
base_taxable_amount 
is_price_incl_tax 
rounding_deltas 
weee_tax_applied 
base_weee_tax_disposition 
weee_tax_disposition 
base_weee_tax_row_disposition 
weee_tax_row_disposition 
base_weee_tax_applied_amount 
base_weee_tax_applied_row_amount 
weee_tax_applied_amount 
weee_tax_applied_row_amount 
row_weight 
all_items 
dest_country_id 
dest_region_id 
dest_region_code 
dest_street 
city 
dest_city 
dest_postcode 
package_value 
package_value_with_discount 
package_weight 
package_qty 
package_physical_value 
base_currency 
package_currency 
limit_carrier 
orig 
path 
cipher 
mode 
handler 
init_vector 
active_flag 
error 
weight_type 
full_row_weight 
carrier_code 
zip 
ups_pickup 
ups_container 
ups_dest_type 
udropship_calculate_rates 
calculate_rates_by_group_flag 
requests 
website_ids 
system_methods 

這是什麼? 我在想這會是一個類似於法師註冊表的js下劃線窗口? 如何使用? 它是如何填充的?

回答

10

簡版:如果你不知道這是什麼,你不需要使用它。

長版本如下。

這與underscoe.js完全沒有關係。在它是一個JavaScript框架之前,下劃線是一個簡單的ASCII字符_

在Magento的系統,大多數物體從基

Varien_Object 

類繼承。該對象爲Magento的對象提供了特殊功能。例如,在一個Magento對象中,你不需要定義setter和getters。你可以做這樣的事情

$object = new SomeObject; //which inherits form Varien_Object 

$object->setSomeValue('Our Value'); 

echo $object->getSomeValue('Our Value'); 
echo $object->getData('our_value'); 

$data = $object->getData(); 
echo $data['our_value']; 

在上面的例子中,沒有名爲setSomeValue具體方法。 Magento神奇地知道我們只是想設置一個數據屬性。這是在PHP魔術方法__call

#File: lib/Varien/Object.php 
public function __call($method, $args) 
{ 
    ... 
} 

實現。當你調用setSomeValue,Magento的設置對象的命名some_value數據陣列上的一個鍵。也就是說,它需要將駱駝套裝SomeValue轉換成非駱駝套裝some_value。你可以看到,在魔術__call執行此

#File: lib/Varien/Object.php 
public function __call($method, $args) 
{ 
    case 'set' : 
     //Varien_Profiler::start('SETTER: '.get_class($this).'::'.$method); 
     $key = $this->_underscore(substr($method,3)); 
     $result = $this->setData($key, isset($args[0]) ? $args[0] : null); 
     //Varien_Profiler::stop('SETTER: '.get_class($this).'::'.$method); 
     return $result; 
} 

_underscore方法將字符串SomeValue,並將其與下面的行

#File: lib/Varien/Object.php 
$result = strtolower(preg_replace('/(.)([A-Z])/', "$1_$2", $name)); 

在某些時候轉換爲some_value,無論是通過分析或直覺,Magento的開發者每次都意識到調用strToLowerpreg_replace數據被獲取或設置在對象上意味着性能瓶頸。爲了解決這個問題,他們介紹了_underscoeCache。這是一個數組,並在Varien_Object類的靜態屬性

#File: lib/Varien/Object.php 
/** 
* Setter/Getter underscore transformation cache 
* 
* @var array 
*/ 
protected static $_underscoreCache = array(); 

如果你看看整個_underscore方法,你可以看到它是如何使用

protected function _underscore($name) 
{ 
    if (isset(self::$_underscoreCache[$name])) { 
     return self::$_underscoreCache[$name]; 
    } 
    #Varien_Profiler::start('underscore'); 
    $result = strtolower(preg_replace('/(.)([A-Z])/', "$1_$2", $name)); 
    #Varien_Profiler::stop('underscore'); 
    self::$_underscoreCache[$name] = $result; 
    return $result; 
} 

也就是說,Magento的仍然會執行strToLowerpreg_replace轉換,但它只會對每個唯一字符串執行一次。它的完成鍵/值(SomeValuesome_value)後放置在_underscoreCache

self::$_underscoreCache[$name] = $result; 

這樣一來,下一次調用該方法,則返回從緩存中值,而不是

if (isset(self::$_underscoreCache[$name])) { 
    return self::$_underscoreCache[$name]; 
} 

這避免了對通常引用的變量的strToLowerpreg_replace的調用。

+0

有時候,我開始讀的了var像這樣回答,我知道作者將會是誰而不去尋找。 – siliconrockstar

0

完美的澄清,但我可以從前端tamplating系統採取變種。 即使我看到它在$ _underscoreCache

我使用:

Mage::getSingleton('core/session')->getCartWasUpdated(); 

,我想利用這在 cartControlller.php設置

$this->_getSession()->setCartWasUpdated(true); 
+0

聽起來像你想問一個新的問題 - 但我的猜測是_getSession返回一個不同的會話對象。即不是「核心/會話」的那個 –

+0

是的! :)謝謝你,我看到它後!它使用checkout/session,然後我發現我的var:D – aimiliano