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 の機能は、魔法のセッターとゲッターです。(通常はモデルとブロック)から継承する Magento オブジェクトには、前述のメソッドで実装されたVarien_Objectマジックgetとメソッドがあります。 set__call

オブジェクト内のデータの配列を取得するには、

$array = $object->getData();

その配列は次のようになります

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

また、前述のマジック ゲッターを呼び出してfooとの値にアクセスすることもできます。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');

データ プロパティが設定されていない場合、ゲッターは を返しnullます。つまり、あなたがへの電話を見たときはいつでも

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

戻り値は実際のメソッドから来る場合もあれば、魔法のデータ セッターとゲッターから来る場合もあります

于 2013-06-22T00:39:42.563 に答える