問題タブ [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 - 必要に応じて、PHP クラスでプロパティとして定義されたオブジェクトをインスタンス化します (遅延読み込み)
簡単にするために、Web アプリケーションで使用される User と UserStatus の 2 つのクラスがあるとします。
ほとんどの HTTP リクエストでは、ステータス オブジェクトは使用されないため、必要に応じてのみインスタンス化する方法を探しています (遅延読み込みと呼びます)。status->method()
呼び出しをインターセプトしてそのオブジェクトをオンザフライで作成するにはどうすればよいですか?
重要な注意点は、 UserStatus クラスで利用できる必要$user_id
があることです。そうしないと、fetchDataFromDB()
メソッドはどのユーザーにデータを取得する必要があるかわかりません。これはどのように行うべきですか?
Fabien Potencier のWhat is Dependency Injection?のようなこの問題に関する興味深いものを見てきました。Pimple - PHP 5.3 の依存性注入コンテナとProxy Patternに関するいくつかの記事がありますが、それらを実装するには、現在のコードをかなりいじる必要があるようです。もっと簡単な方法はありますか?
php - PHPオブザーバーパターン/マジックセッター/プロキシ
クラスの変数がいつ設定されるかを監視する方法を探しています。
たとえば、次のクラスがある場合:
そして、私のコードのどこかで私はします:
myVariableのセッターに「フック」できるようにしたいと思います。したがって、$ class-> myVariable="Value";を呼び出すと 新しい値が「Value」と等しいかどうかをチェックするフィルターが開始され、等しい場合は例外がスローされます。
php - get/set 関数を使用した PHP プロパティ
他の言語の便利な機能の 1 つは、プロパティの get メソッドと set メソッドを作成できることです。この機能を PHP で複製する良い方法を見つけようとして、私はこれに出くわしました: http://www.php.net/manual/en/language.oop5.magic.php#98442
そのクラスの内訳は次のとおりです。
私の計画は、このクラスを拡張し、この拡張クラスで適切なget_someproperty()
andを定義することでした。set_someproperty()
問題は、 の基底クラスが のObjectWithGetSetProperties
メソッドを認識できないことget_someproperty()
ですSomeNewClass
。「キーが利用できません」というエラーが常に表示されます。
これを解決して、の基本クラスが機能するようにする方法はありますか、または各クラスでそれらと魔法のメソッドObjectWithGetSetProperties
を作成する必要がありますか?__get()
__set()
php - このphpの例で使用しているテクニックを認識して名前を付けるのを手伝ってください
さて、作業中に、関連するデータ/オブジェクトをフェッチするこの方法が素晴らしいものであることがわかりました。
例として、私はいくつかの関連オブジェクトを内部に持つこのクラスを持っています:
アイデアは次のとおりです。
Country のインスタンスが必要ですが、その言語と地域は今は必要ありません。
別のケースではそれらが必要なので、それらをプロパティとして主張し、魔法のメソッドがそれらを初めて取得します。
このオンデマンドメソッド (関連オブジェクトのネストされたループも回避する) には名前がありますか? 多分プロパティの遅延読み込み?オンデマンド プロパティ?
php - PHPでインターフェースとマジックメソッドを使用する方法
インターフェイスを使用したいのですが、実装の中には__invokeや__callなどの魔法のメソッドに依存しているものがあります。インターフェイスから(任意の実装で)魔法のように呼び出される可能性のあるメソッドのシグネチャを削除する必要があります。これはアンチパターンのEmptyInterfaceにつながります(ええ、私はそれを作りました)。
PHPでインターフェースとマジックメソッドをどのように組み合わせますか?
python - Python クラスの __dict__ 属性としてカスタム dict クラスを使用する奇妙な動作
カスタム動作を追加するために辞書から継承するクラスがあります。この場合、検証のために各キーと値を関数に渡します。以下の例では、「検証」は単純にメッセージを出力します。
ディクショナリへの割り当ては期待どおりに機能し、アイテムがディクショナリに追加されるたびにメッセージが出力されます。しかし、カスタム辞書タイプを__dict__
クラスの属性として使用しようとすると、属性の割り当てにより、キー/値がカスタム辞書クラスに入れられ、どういうわけか完全にバイパスしながら辞書に値を挿入することができます__setitem__
(および他のメソッドは私がキーを追加できるように定義されています)。
カスタム辞書:
__dict__
クラスの属性として使用すると、理解できない動作が発生します。
誰かが私が期待したように動作しない理由を説明できますか? それは私が試みているように機能しますか、それとも機能しませんか?
php - __toString魔法と型強制
Template
ビューとそれに関連するデータを管理するためのクラスを作成しました。とを実装Iterator
しArrayAccess
、次のように簡単に使用できるように「サブテンプレート」を許可します。
hash()
とにかく、やなどのインラインコア関数を使用するのではなく、テンプレートに格納されているデータのラッパーとして機能する、date()
というクラスを作成すると便利だと思いました。TemplateData
このようにして、フォーマットの一般的な方法のリストを追加できます。次に例を示します。
$template['foo'] = 'bar';
コントローラでを介して値を設定すると、の値はそれ自体のオブジェクト'bar'
に格納されます。TemplateData
私は魔法を使った__toString()
ので、オブジェクトをエコーすると、その値TemplateData
にキャストし(string)
てダンプします。ただし、マントラコントローラーとビューにもかかわらず、次のようなことを行うときはいつでも、データを変更しないでください。
それはで死ぬObject of class TemplateData could not be converted to int
; 文字列にリキャスト しない限り$template['foo']
:
ある種、そのフープを飛び越えなければならないという目的を打ち負かします。この種の動作の回避策はありますか?それとも、ビューでのデータ変更の偶発的な防止として、これをそのまま使用する必要がありますか?
php - プロパティが終了しない場合のデフォルトの getter 動作へのデフォルト設定
現在、クラスを拡張して機能を追加する必要があります (基本クラスにアクセスして変更することはできません)。問題が発生しています。
基本的に、要求された場合はプライベート変数のセットを返す魔法のゲッター関数が必要ですが、それ以外の場合はデフォルトの動作にデフォルト設定されます。マジック セッター関数を使用して一部のデータを自動的に同期するには、これらのプロパティを非公開にする必要があります。
とはいえ、ここにいくつかのサンプルコードがあります:
getProperty/setProperty 関数を使用できることはわかっていますが、そのような操作を実行することは直感に反するという議論にもかかわらず、これをできるだけ直感的なものにしたいと考えています。2 つの私有財産は互いに密接に関連しています。それらの1つが設定されると、論理的に他のものに影響を与えます。
現時点では、これが getter/setter 関数を回避し、プロパティ間の密接な同期を維持するために考えられる唯一の論理的な方法です。他に実行可能な解決策が思いつく場合は、お気軽にオプションを提案してください:)
python - スプーフィング Python 演算子の優先順位
2 つのオブジェクトを比較しlhs == rhs
、両方が defineを返すとき、が返されるか、のサブクラスでない限り__eq__
、単に呼び出されることを知っています。lhs.__eq__
NotImplemented
rhs
lhs
arbitrary_object.__eq__
ただし、実装の詳細に関係なく、比較ステートメントの位置に関係なく、インスタンスが任意のオブジェクトと比較しながら、言いたいことを言う機会が与えられるクラスを実装したいと思います。少しぎこちなく聞こえるかもしれませんが、私はちょっとしたテスト指向のプロジェクトに取り組んでいtestmania.expect
ます。
__instancecheck__
私の最初のアイデアは、メタクラス マジックとを使用して、自分のクラスを他のクラスのサブクラスにすることでした__subclasscheck__
。ただし、単純な比較の場合は呼び出されません。
誰かが新しいアイデアを持っていますか?
php - PHPで配列のようなオブジェクトを実装することは可能ですか?
配列のように動作するオブジェクトを実装したいと考えています。次のように使用する必要があります。
魔法のメソッドまたは別のメカニズムを使用して、PHPでこれを行うことはできますか?