問題タブ [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.
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 つ見つかりましたが、再度見つけることができませんでした。別のレポートを発行するか、既存のレポートの再開を要求することを検討しています。
php - PHP ReflectionClass の hasMethod と __call()
マジック__call()
メソッドに応答する動的クラスを作成しています。問題は、既存のフレームワーク (Kohana) の上にこれを構築しているため、 を使用してクラスのメソッドが存在するかどうかを確認し、その存在を確認するための魔法のメソッドReflectionClass::hasMethod
をトリガーしていないようです。__call()
この場合、どうすればよいですか?メソッドを動的に追加すると(のように$this->{$name} = function(){}
)、まだ「見る」ことができないようです
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.
php - Php __get および __set マジック メソッド - なぜここで必要なのですか?
ここの Zend クイック スタート ガイドでhttp://framework.zend.com/manual/en/learning.quickstart.create-model.htmlを見ることができます。
私は通常、マジック メソッドを使用せずにゲッターとセッターを作成します。これはクイック ガイドで見たことがありますが、なぜこれが必要なのかわかりません。
誰でも私を助けることができますか?
どうもありがとう
php - Zandstraによる__get()の例
Matt Zandstraは、彼のテキスト「PHP Objects Patterns and Practice」で、__ get()メソッドを説明するために次の例を示しています。
実際には、そのような静的な値を返すためにそのようなメソッド(getNameおよびgetAge)を実際に作成することは決してないことはわかっていますが、代わりに、オブジェクトにnameプロパティとageプロパティを作成し、$this演算子を使用してそれらを返します。
私の質問は、この例が実際に有用性を示しているかどうかです。そうでない場合、誰かが同じ種類の目的で__get()を使用する理由のより良い例を提供できますか?
尋ねる理由
オブジェクトでnameプロパティとageプロパティを使用する場合、これらのプロパティを次のように取得しようとするため、__ get()関数は実行されません。
nameプロパティがパブリックの場合は実際に返されるか、プライベートまたは保護されている場合は可視性エラーが発生します。__get()関数は、これらの「実際の」ケースのいずれでも実行されません...何かが足りませんか?
上記のコードが機能することを十分に認識しています。私はそれが実際的な例であるとは確信していません。
python - Python __call__ 特殊メソッドの実践例
__call__
クラスのインスタンスが呼び出されると、クラスのメソッドがトリガーされることを知っています。ただし、この特別なメソッドをいつ使用できるかはわかりません。単純に新しいメソッドを作成し、メソッドで行われたのと同じ操作を実行__call__
でき、インスタンスを呼び出す代わりにメソッドを呼び出すことができるからです。
誰かがこの特別な方法の実用的な使い方を教えてくれたら本当にありがたい.
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を
作成しましたが、かなり高価だと思います。
php - __get() による参照で null を返す
クイック仕様:
__get()
オブジェクト内の任意の深さの配列要素に魔法のようにアクセスするために、参照によるトリックを使用しています。
簡単な例:
が設定されていない場合、これは機能しません。参照によって$key
返そうとnull
しますが、もちろんスローOnly variable references should be returned by reference ...
されます。次のように変更してみました。
それでも機能しませんが、その設定$null
はnull
本質的にそれであると想定してunset()
います。
私に何ができる?ありがとう!
多少関連性があるので、この質問を宣伝したいと思いました(PHPの魔法と参照)。__callStatic()、call_user_func_array()、参照、および PHP 5.3.1。私はまだ答えを見つけていません... PHPコアを変更する以外に。
php - PHP マジック メソッドの実用的なアプリケーション - __get、__set、および __call
PHP のマジック メソッドは、オブジェクトのパブリック インターフェイスを難読化するように見えるため、私は通常、これらのメソッドから離れようとしました。そうは言っても、少なくとも私が読んだコードでは、それらはますます使用されているようです。これらの 3 つの魔法のメソッドを使用するための一般的なパターンはありますか?
php - PHPDoc と __callStatic
tl;dr
を介して実装された関数に (PHPDoc で) 注釈を付ける正しい方法は何__callStatic
ですか? さらに重要: NetBeansとPHPStorm にこれらが静的メソッドであることを理解させる方法はありますか?
動機
全体像が必要な場合は、この質問にたどり着いた方法を次に示します。
問題: 現在のプロジェクトでは、実際にはシングルトン (DB プロキシなど) である必要があるクラスが大量にあります。言うまでもなく、少なくとも数百行はrequire_once
あり$foo = new FooProxy();
ます。
解決策:魔法のメソッドLoader
を使用して、これを解決するクラスを作成した__callStatic
ので、単に$foo = Loader::FooProxy();
. 私たちの目的には完璧ですが、
問題: この方法では、チームで使用されるいずれの IDE にも明らかに型ヒントがありません。
解決策: すべてのモジュールは のサブクラスを定義し、Loader
単に にルーティングするメソッドを追加し__callStatic
ます。
問題: オートコンプリートのためだけに、実際に解釈されたコードを追加することは受け入れられません (これは議論の余地がありますが、とりあえず受け入れましょう)。
解決策: 実際のメソッドを追加せず、次のように PHPDoc でメソッドを宣言するだけにしましょう。
問題:FooProxy
静的メソッドではありません。次のいずれも静的にしません。
クラスを抽象化しても違いはありません。約 1 時間の Google'ing では解決策が見つかりませんでした。主な目標は、IDE にこれらの機能を認識させることです。正しい PHPDoc を用意する必要はありません。