問題タブ [late-static-binding]
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 はかなり些細な継承を行うことができますか?
次のコードがあります。
を呼び出すSpecificClass::test()
と、次のエラーが表示されます。
したがって、私が基本的に望んでいるのは、これが呼び出されたクラスをインスタンス化することです(したがって、私の例では、インスタンス化しますAbstractParent
)。test()
test()
SpecificClass
php - PHP サブクラスにプロパティ (静的とインスタンスの両方) を継承させる方法はありますか?
次のように基本クラスを宣言するとします。
そしてそれを拡張します:
そして、これを行います:
メソッドだけでなく、最初のクラスから継承する 2 番目のクラスにもプロパティを継承させる方法はありますか?
PHP の後期静的バインディングと、これを可能にする継承について何かがあるかどうか疑問に思っています。私はすでにこれを回避しています...しかし、宣言されていない静的プロパティが値のためにその親にフォールバックすることは意味がないようです!?
php - PHPでレイトスタティックバインディングを使いすぎることは可能ですか?
バージョン5.3以降、PHPは静的メソッドの遅延バインディングをサポートしています。これは間違いなく便利な機能ですが、実際に使用する必要があるのはごくわずかです(たとえば、Active Recordパターン)。
次の例を検討してください。
1.コンビニエンスコンストラクター(::create()
)
このクラスが拡張される可能性がある場合(ただし、同じパッケージ内のどのクラスによっても拡張されない場合)、拡張を容易にするためだけに(::create()
メソッドを書き直さずに、さらに重要なことに、覚えておく必要なしに)遅延静的バインディングを使用する必要があります。それをするために)?
注:このイディオムは、構築されたばかりのオブジェクトでメソッドを呼び出すことができないことを回避するために使用されますnew SimpleObject()->doStuff()
。PHPでは無効です。
2.クラス定数
この例で使用する理由static::
は、前の例と同様です。これは、このクラスを拡張して定数をオーバーライドするだけで、異なる形式のタグに一致させることができるという理由だけで使用されます。
それで、それをすべてまとめると、後期静的バインディングのこれらの使用法(および同様の使用法)はやり過ぎですか?目立ったパフォーマンスの低下はありますか?また、遅延バインディングを頻繁に使用すると、オペコードキャッシュによる全体的なパフォーマンスの向上が低下しますか?
php - PHPの遅延静的バインディングとは正確には何ですか?
PHPの遅延静的バインディングとは正確には何ですか?
php - 遅い静的バインディングを忘れてください、私は遅い静的__FILE__が必要です
私はget_called_class()
同等のものを探してい__FILE__
ます...多分何かのようなものget_included_file()
ですか?
私はそれらがどのディレクトリに存在するかを知りたいクラスのセットを持っています。このようなもの:
そして、他のファイル、他のフォルダに...
今、私はすべての拡張クラスに追加するなど、何かゲットーを行うことができ$this->baseDir = dirname(__FILE__)
ましたが、それは少し...ゲットーのようです。結局のところ、PHP 5.3について話しているのですよね?これは未来ではないですか?
クラスが宣言されたファイルへのパスを取得する別の方法はありますか?
php - 再宣言せずにサブクラスの静的プロパティを継承しますか?
私は今書いているアプリケーションでこの男と同じ問題を抱えています。問題は、静的プロパティがサブクラスに継承されないことです。そのため、メイン クラスで static:: キーワードを使用すると、メイン クラスでも変数が設定されます。
サブクラスで静的変数を再宣言すると機能しますが、多数の静的プロパティとサブクラスがあると予想され、コードの重複を避けたいと考えています。私がリンクしたページの最高評価の応答には、いくつかの「回避策」へのリンクがありますが、404 になっているようです。誰かが私に助けを貸してくれるか、おそらく上記の回避策の方向に私を向けることができますか?
php - get_called_class ハックが eval-code で機能しない
ge_called_class
PHP バージョン 5.2 で遅延静的バインディングを許可するためにハックを使用しています (ここにあります)。
私のコードには次のものがあります。
これは、何らかの理由でphp 5.2では機能しないため、次のようにしました。
一方、これは関数ではget_called_class
機能しません。file
関数がコードの評価されたセクションを読み取れないというエラーが表示されます。
php - PHP < 5.3 では抽象ファクトリは使用できませんか?
いくつかのクラスのコードを節約するために、抽象クラスに取り組んでいました。これらのクラスはすべて、さまざまな静的呼び出しを通じて自身をインスタンス化するファクトリです。これらすべてのメソッドを抽象クラスに入れることで、いくつかのコードを節約できました。
しかし、遅い静的バインディングの問題に遭遇しました... 私たちの Web ホストは 5.3 以降を使用していないため、get_called_class にアクセスできません。私が持っている場合
抽象クラスで__CLASS__
は、呼び出されたクラスを実際に使用したい場合の抽象クラスの名前です。
子クラスが独自のインスタンス化メソッドを持ち、抽象化された親に依存していない Web 上の抽象ファクトリの例を見てきました。ただし、この場合、抽象クラスを使用する唯一の理由はコードを保存することなので、そこでそれができなければ、その価値は大幅に低下します。
PHP < 5.3 で回避策はありますか? debug_backtrace()
?
編集:
私はテストを行いましたが、うまくいかdebug_backtrace()
ないようです!これがlate static bindingが必要な理由だと思います。
そして結果:
objective-c - Objective-Cのレイトスタティックバインディング
よろしければ、私は自分自身にObjective-Cを有罪の喜びとして教えています。私はJava言語を強く理解していると自称しているので、それほど難しい移行ではありませんが、確かに楽しいです。しかし、悲しいかな、私の質問です!
PHPに存在するものを再現しようとしています:LateStaticBinding。PHPでは、メソッド呼び出しを「static ::」で修飾できます。これにより、実行時にそのメソッドが呼び出し元に動的にバインドされます。一方、キーワード「self ::」が使用されている場合、バインディングは静的であり、どの子クラスが呼び出すかに関係なく、それが存在するクラスに関連付けられます。
Obj-Cでは、このパラダイムを再現するのに苦労しています。私は私の大君主であるグーグルに、ココアで静的にバインドするのを遅らせる方法を尋ねましたが、それは可能ではないと思います。それは別の名前で呼ばれることもあれば、非常に頭の痛い回避策が必要になることもあります。これが私が今していることです:
親クラスメソッド:
子クラスChildClassは、ParentClassを拡張し、インスタンスメソッドwhoAmIをオーバーライドしません。
各クラスオブジェクトにメッセージを送信すると、動的バインディングは本来の動作を実行し、NSLog()から次のようになります。
2010-09-21 11:39:07.484 WhoAmI [4803:a0f]親からの呼び出し:親
2010-09-21 11:39:07.486 WhoAmI [4803:a0f]子供からの呼び出し:子
最終的には、可能であれば、Cocoaに動的なバインドを停止させて、whoAmIメソッドが常にそれが存在するオブジェクト(常にParent)を返すようにする方法を学びたいと思います。また、インスタンスメソッドにしたいです。どうすればこれを行うことができますか?
-ショーン
php - PHP 5.3:子クラスで欠落しているときに親クラスで定義されている場合、プロパティに対してレイトスタティックバインディングが機能しません
この例を見て、示されている出力に注目してください。
私の理解では、staticキーワードを使用すると子クラスが参照されますが、子クラスにない場合は常に親クラスに魔法のように適用されるようです。(これは、PHPにとって一種の危険な動作です。詳細については、以下で説明します。)
私がこれをやりたい理由について、私は次の2つのことを念頭に置いています。
- すべての子クラスのすべてのプロパティを定義する冗長性は必要ありません。
- プロパティを親クラスのデフォルトとして定義し、子クラスの定義で必要に応じてこれらのプロパティをオーバーライドできるようにしたい。子クラスは、デフォルトが意図されている場合は常にプロパティを除外する必要があります。そのため、上記の例では子クラスのプロパティを定義していません。
ただし、実行時に(initメソッドを介して)プロパティをオーバーライドする場合は、親クラスに対してプロパティをオーバーライドします。その時点から、以前に初期化された子クラス(Brotherの場合のように)が予期せず変更されます。
明らかに、これは、子クラス内で明示的に定義されていない場合は常に静的プロパティの独自のコピーを持たない子クラスの結果ですが、エラーをスローする代わりに、静的の動作を切り替えて親にアクセスします。したがって、親クラスが子クラス定義内に表示されることなく、子クラスに属するプロパティを動的に作成できる方法はありますか?このようにして、子クラスは静的プロパティの独自のコピーを持つことができ、staticキーワードはそれを適切に参照でき、親プロパティのデフォルトを考慮に入れるように記述できます。
それとも、良い、悪い、または醜い他の解決策がありますか?