PHP:フレンドクラスと貪欲でない呼び出し側関数/クラス
-
22-09-2019 - |
質問
debug_backtrace() 以外で呼び出し元の関数を取得する方法はありますか?
次のようなスコープをシミュレートする、あまり欲張らない方法を探しています。 友人 または 内部.
クラス A とクラス B があるとします。
今まで使っていたのは、 debug_backtrace()
, 、欲張りすぎます(私見)。
私は次のようなことを考えました。
<?php
class A
{
public function __construct(B $callerObj) {}
}
class B
{
public function someMethod()
{
$obj = new A($this);
}
}
?>
特定の 1 つのクラスに制限したい場合は問題ないかもしれませんが、300 個のクラスがあり、そのうち 25 個に制限したいとします。
1 つの方法は、インターフェースを使用して集約することです。
public function __construct(CallerInterface $callerObj)
しかし、それはまだ 醜いコード.
さらに、あなたは できない そのトリックを使って 静的 クラス。
もっと良いアイデアはありますか?
解決
電話をかけることができます debug_backtrace(FALSE)
, これにより、オブジェクト インデックスが設定されなくなります。これにより、処理速度が少し向上しますが、アプリが速度が問題にならないソフトウェア ツールである場合や、エラー処理に使用する場合を除き、通常、実稼働コードでは debug_backtrace を使用しないでください。
私が理解しているところによると、あなたはそうしたいのです
- 呼び出し先で使用可能な呼び出し元への暗黙的な参照があり、
- 選択したクラスのプライベートおよび保護されたプロパティへの外部アクセス。
どちらも PHP には存在しません (そしてカプセル化が壊れます)。ディスカッションについては、を参照してください。
他のヒント
PHPは本当にあなたにこれを処理するエレガントな方法を提供していません。言語flamewarを開始することを意味しないと、私は恐る恐る自分の設計スキルやニーズは、おそらくあなたのツールの限界を超えていることを示唆するつもりです。 PHPは、その上にボルトで固定機能が、その中核に、それは今までに優雅なエンタープライズ・アーキテクチャ用に設計されていなかったのは、擬似OOPの多くを持っていたこと、軽量スクリプト言語です。