問題タブ [magic-methods]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
6282 参照

php - __callStatic()、call_user_func_array()、参照、および PHP 5.3.1

私はSOや他の場所で読んでいますが、決定的なものを見つけることができないようです.

以下の例で説明されているように、この呼び出しスタックを介して参照を効果的に実行し、目的の機能を実現する方法はありますか? 例はそれを解決しようとはしませんが、確かに問題を示しています:


潜在的な解決策を提示するために、ここに要約の詳細を追加します。

のみに焦点を当てるとcall_user_func_array()、(少なくとも PHP 5.3.1では) 暗黙的に引数を参照渡しできないことがわかります。

配列要素$testを参照として明示的に渡すことで、これを軽減できます。

を使用してクラスを導入すると__callStatic()、参照による明示的な呼び出し時パラメーターが期待どおりに実行されるように見えますが、非推奨の警告が (私の IDE で) 発行されます。

で参照演算子を省略すると、TestClass::testFunction()結果として$testに値渡しされます。__callStatic()もちろん、 は配列要素としてtestFunction()viaに値渡しされますcall_user_func_array()testFunction()は参照を想定しているため、警告が発生します。

ハッキングすると、いくつかの追加の詳細が明らかになりました。__callStatic()定義が参照によって返されるように記述されている場合 ( ) public static function &__callStatic()、目に見える効果はありません。さらに、$arguments配列の要素を__callStatic()参照として再キャストするとcall_user_func_array()、期待どおりに動作することがわかります。

$test参照によって渡されなくなったため、これらの結果は予期されたものであり、変更はそのスコープに戻されません。ただし、これcall_user_func_array()は実際に期待どおりに機能していること、および問題が呼び出しマジックに限定されていることを確認しています。

さらに読むと、PHP のユーザー関数の処理と__call()/__callStatic()マジックの「バグ」である可能性があります。既存の問題または関連する問題についてバグ データベースを調べたところ、1 つ見つかりましたが、再度見つけることができませんでした。別のレポートを発行するか、既存のレポートの再開を要求することを検討しています。

0 投票する
2 に答える
2014 参照

php - PHP ReflectionClass の hasMethod と __call()

マジック__call()メソッドに応答する動的クラスを作成しています。問題は、既存のフレームワーク (Kohana) の上にこれを構築しているため、 を使用してクラスのメソッドが存在するかどうかを確認し、その存在を確認するための魔法のメソッドReflectionClass::hasMethodをトリガーしていないようです。__call()この場合、どうすればよいですか?メソッドを動的に追加すると(のように$this->{$name} = function(){})、まだ「見る」ことができないようです

0 投票する
3 に答える
191821 参照

python - How does python numpy.where() work?

I am playing with numpy and digging through documentation and I have come across some magic. Namely I am talking about numpy.where():

How do they achieve internally that you are able to pass something like x > 5 into a method? I guess it has something to do with __gt__ but I am looking for a detailed explanation.

0 投票する
5 に答える
3319 参照

php - Php __get および __set マジック メソッド - なぜここで必要なのですか?

ここの Zend クイック スタート ガイドでhttp://framework.zend.com/manual/en/learning.quickstart.create-model.htmlを見ることができます。

私は通常、マジック メソッドを使用せずにゲッターとセッターを作成します。これはクイック ガイドで見たことがありますが、なぜこれが必要なのかわかりません。

誰でも私を助けることができますか?

どうもありがとう

0 投票する
4 に答える
1215 参照

php - Zandstraによる__get()の例

Matt Zandstraは、彼のテキスト「PHP Objects Patterns and Practice」で、__ get()メソッドを説明するために次の例を示しています。

実際には、そのような静的な値を返すためにそのようなメソッド(getNameおよびgetAge)を実際に作成することは決してないことはわかっていますが、代わりに、オブジェクトにnameプロパティとageプロパティを作成し、$this演算子を使用してそれらを返します。

私の質問は、この例が実際に有用性を示しているかどうかです。そうでない場合、誰かが同じ種類の目的で__get()を使用する理由のより良い例を提供できますか?

尋ねる理由

オブジェクトでnameプロパティとageプロパティを使用する場合、これらのプロパティを次のように取得しようとするため、__ get()関数は実行されません。

nameプロパティがパブリックの場合は実際に返されるか、プライベートまたは保護されている場合は可視性エラーが発生します。__get()関数は、これらの「実際の」ケースのいずれでも実行されません...何かが足りませんか?

上記のコードが機能することを十分に認識しています。私はそれが実際的な例であるとは確信していません。

0 投票する
14 に答える
132840 参照

python - Python __call__ 特殊メソッドの実践例

__call__クラスのインスタンスが呼び出されると、クラスのメソッドがトリガーされることを知っています。ただし、この特別なメソッドをいつ使用できるかはわかりません。単純に新しいメソッドを作成し、メソッドで行われたのと同じ操作を実行__call__でき、インスタンスを呼び出す代わりにメソッドを呼び出すことができるからです。

誰かがこの特別な方法の実用的な使い方を教えてくれたら本当にありがたい.

0 投票する
1 に答える
3704 参照

php - __callでis_callableを使用するには?

私は、クロージャを導入した PHP 5.3 を使用しています。アプリ (およびフレームワーク) 全体でクロージャーを使用できるようになったので、 is_callable を使用してハンドラーの種類を確認します$callback

の場合$callback is_callable、私は十分に知っており、その関数/メソッド/クロージャを使用しています。呼び出し可能ではなく、文字列の場合は、おそらく$thisクラス内のメソッドの名前です。存在する場合と存在しない場合があります。PHPに任せると、致命的なエラーが「スロー」されます(私はそれが好きです)。

しかし、ミックスインを使用したいので、魔法のメソッドが必要__callです。__call実際の関数呼び出しの前にロジックを含めることができるため、非常にクールです。しかし...__call呼び出されたメソッドが存在しない場合はどうなりますか? 確かに、例外をスローすることはできますが、それは後でわかります。

問題は、 の有用性ですis_callable。これは、 を実装した後__call、すべてにフォールバックがあるため ( である )、すべてが true を返すため__callです。

動的メソッドと便利な両方を持つ方法はありis_callableますか?

私が見たいのは、呼び出された__is_callableときに PHP が「参照」する、ある種のキャッシュ可能な魔法のメソッドですis_callable(array($object, $method))

php.net では、これについて私と同じように頭を悩ませている人を見つけることができません。これはいけません!使ったらもう__call使えis_callableない!?

私は何か意味がありますか?

PS。私は調べましmethod_existsたが、それは十分ではありません (すべてのクロージャーとグローバル関数を除外できたとしても) パブリックと同様にプライベートおよび保護されたメソッドに対して true を返すためです。

編集ミックスインをチェックする「より良い」is_callableを
作成しましたが、かなり高価だと思います。

0 投票する
3 に答える
1681 参照

php - __get() による参照で null を返す

クイック仕様:

__get()オブジェクト内の任意の深さの配列要素に魔法のようにアクセスするために、参照によるトリックを使用しています。

簡単な例:

が設定されていない場合、これは機能しません。参照によって$key返そうとnullしますが、もちろんスローOnly variable references should be returned by reference ...されます。次のように変更してみました。

それでも機能しませんが、その設定$nullnull本質的にそれであると想定してunset()います。

私に何ができる?ありがとう!


多少関連性があるので、この質問を宣伝したいと思いました(PHPの魔法と参照)。__callStatic()、call_user_func_array()、参照、および PHP 5.3.1。私はまだ答えを見つけていません... PHPコアを変更する以外に。

0 投票する
6 に答える
4269 参照

php - PHP マジック メソッドの実用的なアプリケーション - __get、__set、および __call

PHP のマジック メソッドは、オブジェクトのパブリック インターフェイスを難読化するように見えるため、私は通常、これらのメソッドから離れようとしました。そうは言っても、少なくとも私が読んだコードでは、それらはますます使用されているようです。これらの 3 つの魔法のメソッドを使用するための一般的なパターンはありますか?

0 投票する
2 に答える
6731 参照

php - PHPDoc と __callStatic

tl;dr

を介して実装された関数に (PHPDoc で) 注釈を付ける正しい方法は何__callStaticですか? さらに重要: NetBeansPHPStorm にこれらが静的メソッドであることを理解させる方法はありますか?

動機

全体像が必要な場合は、この質問にたどり着いた方法を次に示します。

問題: 現在のプロジェクトでは、実際にはシングルトン (DB プロキシなど) である必要があるクラスが大量にあります。言うまでもなく、少なくとも数百行はrequire_onceあり$foo = new FooProxy();ます。

解決策:魔法のメソッドLoaderを使用して、これを解決するクラスを作成した__callStaticので、単に$foo = Loader::FooProxy();. 私たちの目的には完璧ですが、

問題: この方法では、チームで使用されるいずれの IDE にも明らかに型ヒントがありません。

解決策: すべてのモジュールは のサブクラスを定義し、Loader単に にルーティングするメソッドを追加し__callStaticます。

問題: オートコンプリートのためだけに、実際に解釈されたコードを追加することは受け入れられません (これは議論の余地がありますが、とりあえず受け入れましょう)。

解決策: 実際のメソッドを追加せず、次のように PHPDoc でメソッドを宣言するだけにしましょう。

問題:FooProxy静的メソッドではありません。次のいずれも静的にしません。

クラスを抽象化しても違いはありません。約 1 時間の Google'ing では解決策が見つかりませんでした。主な目標は、IDE にこれらの機能を認識させることです。正しい PHPDoc を用意する必要はありません。