質問: ### 知りたいこと * このコードが問題ないのかどうか確認したいです * またこれが正しいであろうという確認の手段を知りたいです ### 概要 下記、サンプルコードは自分の思ったような挙動をしているのですが、ふと `Oya` と `KoA` が循環参照しているのではないかと思い、色々調べたのですが決め手になるような答えが見つかりませんでした。 私的には下記のような解釈で循環してエラーになるのではないかと思っています。 * `Oya#execute` は `KoA#eof` を利用するので `KoA` に依存する * `KoA` は `Oya` を継承しているので `Oya` に依存する ### サンプルコード ``` class Oya { public static function execute() { return KoA::eof(); } } class KoA extends Oya { public static function execute() { return 'KoA' . parent::execute(); } public static function eof() { return '-EOF' . PHP_EOL; } } class KoB extends Oya { public static function execute() { return 'KoB' . parent::execute(); } } echo KoA::execute(); // KoA-EOF echo KoB::execute(); // KoB-EOF ``` ### 補足情報(言語/FW/ツール等のバージョンなど) PHP7.1 --- 以下追記 ----- 経緯的にはこのような感じです、ちょっと拙いのでこれでも伝わるか不安ですが。 下記のような構成が存在 * Oyaクラス ... 設定ファイルの読み込み、モデル化を行う抽象クラス * KoAクラス ... Oyaを継承した全般的な設定を持つモデル * KoBクラス ... Oyaを継承した特化した設定を持つモデル(複数クラス存在する) * 上記のモデルを使うための設定ファイルは別のシステムでも利用する **全般設定(KoA)の方に定義している値を使った処理が幾つかの設定モデル(KoB)で必要になった。** * コピペするのは嫌。 Oyaクラスに処理書こう。 * 別システムと同じ設定ファイルを使うので個別で定数にしないで設定ファイルに入れたい。 結果、子に依存する親が出来上がった
回答: どういう意味合いでの「循環参照」を気にしているのかによって、結論が違ってきます。 * ロジック的な意味合いで言うと、親クラスが(名前を決め打ちで)子クラスのメソッドを呼び出すというのは、循環依存となってしまって筋は良くないコードです。 * 一方、メモリ的には、そもそも**インスタンスを生成していない**ので、循環参照が生じる余地もありません。