0

这是场景:您正在使用 magento 中的某个模型,并且您想知道哪些方法可用于检索 magento 中对象的各种参数。

让我们做一个例子:

$order = `Mage::getModel('sales/order')->loadByIncrementId($session->getLastRealOrderId());`

在这个例子中,我们正在使用一个订单对象。

通过对各种主题的搜索,我发现这个特定对象有许多不同的方法可用,例如:

getCustomer()
getCustomerName()
getGrandTotal()
getId()

我会假设(可能不正确)前 3 个示例方法实际上是在 mage_core_model_sales_order 类或其扩展的类之一中定义的getId() 是一种特殊情况

它是一种自动魔术方法,与 __call() 魔术方法一起使用,即使该方法未在任何地方定义,也可以从对象返回数据。

请解释 Magento 自动方法的命名约定

以及确定给定模型或集合中可用的所有可用自动方法的最简单方法是什么。

4

2 回答 2

2

简而言之(因为这在互联网上的其他各个地方都有记录),魔术方法用于设置和获取数据。这些电话

$this->setSomeThing('value');
$this->getSomeThing();

相当于这些调用

$this->setData('some_thing','value');
$this->getData('some_thing');

字符串'some_thing'是数据键。使用魔术方法设置和获取数据是这个键是 CamelCased 到 'SomeThing'。

您可以通过对“getData”的无参数调用查看所有数据属性(并因此派生魔术方法)

var_dump( $this->getData() );

var_dump如果您不使用,请小心xDebug,并且许多 Magento 对象太大和/或太圆而无法完全显示。如果你遇到这个问题,你可以用

var_dump( array_keys($this->getData()) );

这就是 Magento 中所有的神奇方法——获取和设置数据。

使用 varien 对象来解决这个问题,这是 Magento 中所有模型和块继承的对象。

$o = new Varien_Object;
$o->setData('foo','bar');
var_dump($o->getData('foo'));
var_dump($o->getFoo('foo'));
var_dump($o->getData());

最后要记住的一件事:如果一个对象的类定义了一个与魔术方法同名的方法,那么魔术方法将被忽略。有时,确定某个东西是魔术方法还是真正的方法的唯一方法是查看类定义。

于 2012-12-06T21:47:01.597 回答
0

如果您需要以编程方式确定 PHP 类中可用的方法,有多种方法可供您使用。

如果您没有该类的实例,但可能只有类名,您可以使用 PHP 的反射功能: http: //php.net/manual/en/book.reflection.php

或者,如果您实际上有一个类的实例,您可以get_class_methods()在该实例上使用该实例来获取当前范围内该实例可用的方法列表(包括已定义的魔术方法)。

于 2012-12-06T21:36:33.280 回答