2013-06-22 70 views
0

我是一位嘗試瞭解此PHP行爲的Java開發人員。我已經執行了下面的方法:PHP - 對象的方法

error_log(get_class($a) . "\n", 3, "c:\my-errors.log"); 
error_log(print_r(get_class_methods($a), true) . "\n", 3, "c:\my-errors.log"); 

其中印刷

Mage_Catalog_Model_Product 
Array 
(
    [0] => getStoreId 
    ... 
    [90] => getWeight 
    [91] => getOptionInstance 
    [92] => getProductOptionsCollection 
    [93] => addOption 
    [94] => getOptionById 
    [95] => getOptions 
    [96] => getIsVirtual 
    ... 
    [182] => flagDirty 
) 

但是第二天線執行(沒有錯誤)這顯然不是在我打印的第一方法中的列表的方法:

$a->getOption() 

那麼,它怎麼可能?我怎樣才能知道對象所有的方法?是否有任何方法知道哪個文件將執行「下一行代碼」 - 因爲項目中有幾個「getOption」函數,我無法確定哪個文件將被執行。

也許這可以幫助你,我與Magento的1.7工作,我說的代碼是在

\app\code\core\Mage\Bundle\Model\Product\[email protected] 

非常感謝!

回答

2

您想查看的PHP信息是__call magic method。簡短版本 - 如果您在PHP對象上調用不存在的方法,則會調用__call方法,從而爲PHP開發人員提供實現元編程功能的機會。

您感興趣的Magento功能是魔法設置工具和獲取器。從Varien_Object(通常是模型和塊)繼承的Magento對象具有用上述__call方法實現的魔術getset方法。

你可以抓住一組數據中的對象與

$array = $object->getData(); 

該數組可能看起來像

array(
    'foo'   =>'bar', 
    'another_field' =>'baz' 
) 

您也可以通過調用上述訪問fooanother_field的值魔術獲得者

echo $this->getFoo(); 
echo $this->getAnotherField(); 

你也可以用神奇設置新值setter

$this->setFoo('no longer bar'); 
$this->setAnotherField('no longer baz'); 

制定者也是可鏈接的。

$this->setFoo('again!')->setAnotherField('back to baz'); 

如果未設置數據屬性,吸氣將返回null。這意味着任何時候你看到

$object->get... 
$object->set... 

返回可以從一個真正的方法來,或可從一個神奇的數據setter和getter未來的呼叫。