PHPでは、4つのクラスA、B、C、Dがあるとします。それらのクラスはいずれも他のクラスを継承しません。彼らはすべて独立したクラスです。クラスAのオブジェクトを作成することができます。PHPで特定のクラスのみのクラスのオブジェクト作成を許可する方法はありますか?
これはPHPで行うことができますか?だから、どう?オブジェクト指向の概念をリフレッシュしようとしましたが、PHPで適切な答えを見つけることができないようです。
少しお手伝いします。
PHPでは、4つのクラスA、B、C、Dがあるとします。それらのクラスはいずれも他のクラスを継承しません。彼らはすべて独立したクラスです。クラスAのオブジェクトを作成することができます。PHPで特定のクラスのみのクラスのオブジェクト作成を許可する方法はありますか?
これはPHPで行うことができますか?だから、どう?オブジェクト指向の概念をリフレッシュしようとしましたが、PHPで適切な答えを見つけることができないようです。
少しお手伝いします。
ここでは機能がdebug_backtraceだと思います。下の例を見てください。ここでは、あなたの要件に応じて条件を置くことができA
クラスの__construct
で
class A
{
public function __construct()
{
echo debug_backtrace()[1]['class'];
}
}
class B
{
public function createObj()
{
$obj = new A();
}
}
class C
{
public function createObj()
{
$obj = new A();
}
}
class D
{
public function createObj()
{
$obj = new A();
}
}
$o = new B();
$o->createObj(); //echo B
$o = new C();
$o->createObj(); //echo C
$o = new D();
$o->createObj(); //echo D
。
しかし、IMHOの継承と抽象化は、タスクのためのより良いオプションです。
これはgnnaの仕事のように見え、@arkaschaが#2で彼の答えを指摘したものです。私はそれを試してみると、戻ってきます。 –
PHPでは、このような制限のための明示的な手段は提供していません。
この質問は私に(は1がそれをしたいと思う理由を?)奇妙に聞こえるが、私は深刻な欠点の両方、ここでは2つの可能なアプローチを想像することができます
あなたはへのアクセスを制限しようとすることができクラス定義: 特定のクラスのオブジェクトをインスタンス化する前に、そのクラス定義を知っていなければなりません。
a)必要に応じてクラス定義をロードする明示的な包含ステートメント。これは、明らかにベースシステムによってブロックすることができます。いずれかブルートのアクセス許可の拒否によって、あなたはファイルのアクセス許可を持っている場合は、実行時エラーが発生します。または、必要に応じて変更されたシンボリックリンクのカスケードを使用するなどして、実際のファイルを置き換えます。
b)一部の自動読み込みメカニズム。このシナリオでは、偽のクラス定義をロードしたり、ターゲットクラスへのアクセスを拒否する必要がある場合にエラーを投げたりする追加のフィルタステップを実装することは明らかです。
アクティブな方法でオブジェクトの作成を積極的に防ぐことができます。再び2つの変種:
a)クラスコンストラクタ内で例外をスローします。かなり無礼なこと...
b)ファクトリパターンに従い、クラスコンストラクタを非公開宣言し、クラスのオブジェクトをインスタンス化する唯一の方法としてスタティックジェネレータメソッドを提供します。これはより透過的で、メソッドは例外を発生させたり、期待される結果を返すことを拒否することができます。
これは、リクエストを許可する必要があるかどうかを決定するための情報が必要です。実行スタックを評価して、オブジェクトの作成がどのコードセクションからトリガされたかを検出することが可能でなければなりません。その情報の字句解析やカタログとの比較によって、決定の基盤が形成される可能性があります。
しかし、最初に述べたように、すべてのアプローチには欠点があります。これは、可能性のミス使い方のように聞こえる...しかし...可能性は探検されるべきでしょうか? ;-)
ありがとうございます。私はあなたが言及した第二のポイントで遊んでいきます。そして、私はこの分野であなたと同じくらい経験していないので、あなたの最初の点はちょうど私の頭を越えました。理解のために、私が読むことができるリンクを提供してもらえますか? –
その最初の点であなたが理解していないことを正確に述べることができますか? – arkascha
「あるクラスのオブジェクトをインスタンス化する前にクラス定義を知っておく必要があります」と言ったらどういう意味ですか? –
投票した男のために、なぜ私に知らせてください? –
私は関数 'debug_backtrace()'がここで助けてくれると思います –
@ChetanAmeta Ok Lemmiがチェックアウトしています。ありがとう –