2016-06-30 7 views
0

私は親クラスとそれを継承する複数の子を持っています。入れ子になったオブジェクトの作成を追跡する方法

子供の中には、自分の中の他の子供たちに電話する人もいます。しかし、必ずしもネストされているとは限りません。

class Parent { } 

class Child extends Parent { 
    public function run() { 
     // Kid nested inside Child. Do not open DB transaction 
     $a = (new Kid())->run(); 
    } 
} 

class Kid extends Parent { 
    public function run() { 
     // @todo Open DB transaction if not nested 
    } 
} 

// Kid not nested. Open DB transaction 
(new Kid())->run(); 

それは内部またはChildの外でインスタンス化されたかどうか(手動で私が言われずに)知るKidオブジェクトのための効率的な方法はありますか?

+0

は?おそらくそうではありません。多分あなたが達成しようとしていることを説明すれば、別の方法で助けてくれるかもしれません... – FirstOne

+0

@FirstOne 'run'メソッドの中でトップレベルの子クラスがDBトランザクションを開き、閉じたいと思っています。しかし、いくつかのケースで見ることができるように、「キッド」はトップレベルであり、それ以外の場合はそうではありません。 – andrewtweber

+0

あなたは[$ GLOBALS](http://php.net/manual/en/reserved)で何かを試すことができました。 variables.globals.php)。外出先の子供が本当にすべてから外れている場合、あなたは試してみることができます:あなたが持っているものは、あなたがグローバルから得たものと同じものです。 **編集:**これは変数をグローバルとして設定することではないことに注意してください。変数が存在するかどうかを確認することです。 – FirstOne

答えて

1

あなたのコードがどのように構造化されているかわからなくても、私が考えることができる唯一の方法は2つの子クラスを作ることです(私たちはKid1Kid2と呼ぶでしょう)。彼らはどうしたらすべては、あなたははい、あなたはまだそれを何と呼ばれるKidを言っているが、OOPをトレースに

0

使用debug_backtrace機能を実践し、それが収まる

class Child extends Parent { 
    public function run() { 
     // Kid nested inside Child. Do not open DB transaction 
     $a = (new Kid1())->run(); 
    } 
} 

class Kid extends Parent { 
    public function run() { 
     // @todo Open DB transaction if not nested 
     if($this instanceof Kid2) // Open DB 
    } 
} 

を呼ぶだろう

class Kid1 extends Kid {} 

ですrunメソッド呼び出し。
debug_backtrace()から返される可能性のある要素のうち、classの項目をトレースする必要があります。
スタックトレース内に複数のclass項目がある場合 - それは、「ネストされた」呼び出しです:自動的に

class Parent { } 

class Child extends Parent { 
    public function run() { 
     // Kid nested inside Child. Do not open DB transaction 
     $a = (new Kid())->run(); 
    } 
} 

class Kid extends Parent { 
    public function run() { 
     $trace = debug_backtrace(); 
     // Note that 'array_column' function is available since PHP 5.5   
     if (count(array_column($trace, 'class')) > 1) { 
      // Do not open DB transaction 
      // do another job 
     } else { 
      // Open DB transaction 
     } 
     unset($trace); 
    } 
} 

// Kid not nested. Open DB transaction 
(new Kid())->run(); 

(new Child())->run(); // Kid nested inside Child. Do not open DB transaction 

http://php.net/manual/en/function.debug-backtrace.php

+0

トレースは高価です。例外的なコードパス以外をトレースすることはお勧めできません。 –

+0

@JoeWatkins、それにもかかわらず、それは最も正確な情報を与えるでしょう – RomanPerekhrest

関連する問題