Magento - getEmail() 在哪里定义?

Magento - where is getEmail() defined?

您可以使用以下代码找到登录用户的电子邮件:

$customer = Mage::getSingleton('customer/session')->getCustomer();
$mail = $customer->getEmail();

如何找出getEmail()定义的地方?

我在 app\code\core\Mage\Customer\Model\Resource\Customer.php 中搜索但没有名为 getEmail() 的函数。

我只找到了这个:

所以我用 NetBeans 追踪它,并在 lib\Varien\Object.php.

中找到了 Varien_Object 的定义

但是里面也没有函数getEmail()

我在整个项目中搜索了字符串 public function getEmail()

这是结果:

$ grep -iR "public function getEmail()"
app/code/core/Mage/Catalog/Block/Product/Send.php:    public function getEmail()
app/code/core/Mage/Newsletter/Model/Subscriber.php:    public function getEmail()
app/code/core/Mage/Sendfriend/Block/Send.php:    public function getEmail()
app/code/core/_193_Mage/Catalog/Block/Product/Send.php:    public function getEmail()
app/code/core/_193_Mage/Newsletter/Model/Subscriber.php:    public function getEmail()
app/code/core/_193_Mage/Sendfriend/Block/Send.php:    public function getEmail()
app/code/_core/Mage/Catalog/Block/Product/Send.php:    public function getEmail()
app/code/_core/Mage/Newsletter/Model/Subscriber.php:    public function getEmail()
app/code/_core/Mage/Sendfriend/Block/Send.php:    public function getEmail()
lib/Payone/Api/Request/Parameter/Authorization/PersonalData.php:    public function getEmail()
lib/Payone/Api/Request/Parameter/CreateAccess/PersonalData.php:    public function getEmail()
lib/Payone/Api/Request/Parameter/ManageMandate/PersonalData.php:    public function getEmail()
lib/Payone/Api/Request/Parameter/Vauthorization/PersonalData.php:    public function getEmail()
lib/Zend/Gdata/App/Extension/Person.php:    public function getEmail()
lib/Zend/Gdata/Extension/Who.php:    public function getEmail()
lib/Zend/Service/ReCaptcha/MailHide.php:    public function getEmail()
lib/Zend/View/Helper/Gravatar.php:    public function getEmail()

您找不到 getEmail() 定义,因为它不存在。

正如您在共享的代码片段中看到的那样,$customerVarien_Object 的一个实例。 class 定义在 lib\Varien\Object.php.

如果你偷看那里,你会发现该方法也没有定义...但这是因为无论好坏,Magento 都利用了 PHP 的 magic methods

当在此 $customer 实例上调用不存在的方法时,将改为执行 __call()

这是 Varien_Object::_call() 的方法定义:

/**
 * Set/Get attribute wrapper
 *
 * @param   string $method
 * @param   array $args
 * @return  mixed
 */
public function __call($method, $args)
{
    switch (substr($method, 0, 3)) {
        case 'get' :
            $key = $this->_underscore(substr($method,3));
            $data = $this->getData($key, isset($args[0]) ? $args[0] : null);
            return $data;
        case 'set' :
            $key = $this->_underscore(substr($method,3));
            $result = $this->setData($key, isset($args[0]) ? $args[0] : null);
            return $result;
        case 'uns' :
            $key = $this->_underscore(substr($method,3));
            $result = $this->unsetData($key);
            return $result;
        case 'has' :
            $key = $this->_underscore(substr($method,3));
            return isset($this->_data[$key]);
    }
    throw new Varien_Exception("Invalid method ".get_class($this)."::".$method."(".print_r($args,1).")");
}

从这里开始,逻辑就很简单了。由于 $method 将是 getEmail,switch 的第一个分支将被执行,并且 $key 将从方法名称中获取(跳过前三个字符,因为它们必须是 "get"、"set"、"uns" 或 "has"),在这种情况下,它将变为 "email".