0

我是一名试图理解这种 PHP 行为的 Java 开发人员。我执行了以下方法:

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\Type.php@shakeSelections

非常感谢!

4

1 回答 1

2

您要查看的 PHP 信息是__call神奇的方法。简短的版本——如果你在一个 PHP 对象上调用一个不存在的方法,该__call方法就会被调用,让 PHP 开发人员有机会实现元编程特性。

您感兴趣的 Magento 功能是 magic setter 和 getter。Varien_Object继承自(通常是模型和块)的Magento 对象具有使用上述方法实现的魔法get和方法。 set__call

您可以使用以下方法获取对象中的数据数组

$array = $object->getData();

该数组可能看起来像

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

您还可以通过调用上述魔术 getter 来访问fooand的值another_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');

如果未设置数据属性,则 getter 将返回null。这意味着任何时候你看到一个电话

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

返回可能来自一个真实的方法,或者可能来自一个神奇的数据设置器和获取器。

于 2013-06-22T00:39:42.563 回答