Constructor in PHP
いくらかのモジュールは、 Cube Legacy 2.1
上で動作することができないでしょう。原因のうちの 1
つは、継承クラスのコンストラクタがその基底クラスのコンストラクタを隠蔽することです。
Marijuana
氏は、この問題を指摘しました。しかし、私が思うに、そのようなコードを書いた開発者は、それを隠蔽することを意図していなかったでしょう。つまり、彼らは、
PHP
の、ある仕様を知らなかったのではないかと思います。
class A {
var $mFuncB;
function A() {
$this->mFuncB =& new XCube_Delegate();
}
function funcB() {
$this->mFuncB->call();
}
}
class B extends A {
var $mFlag;
function B() {
$this->mFlag =& new Flag();
}
}
$instance =& new B();
$instance->funcB();
多くの開発者は、上記プログラムにおいて全く問題を感じないでしょう。しかし、 funcB()
が呼ばれるとき、そのプログラムは、致命的エラーを上げます。mFuncB
が初期化されないことが、その原因です。実は、他の一般のプログラミング言語と異なり、 PHP
言語では基底クラスのコンストラクタは自動的に実行されません。私は何度もこの問題にはまりました。
あなたがコンスラクタを書くとき、あなたは、規定クラスのコンストラクタを parent
キーワードを使って明示的に呼ばなければなりません。
class B extends A {
function B() {
parent::A();
}
}
それは、奇妙なコードです !
しかし、あなたが継承クラスに特定の初期化コードを持っていないならば、あなたは、コンストラクタを省略することができます。空のコンストラクタは必ず
parent
を呼ばなくてはいけないので、この仕様は、非常に有益です。私は、コンストラクタをしばしば省略します。
XOOPS Cube Legacy 2.1
において、いくらかのクラスは、それらのコンストラクタに追加の初期化コードを持ち始めました。従って、サブクラスが基底クラスのコンストラクタを隠す場合、それは、不互換性問題の原因であるかもしれません。開発者は、
PHP
の仕様、及び、他の一般の言語の間の差異に注意する必要があります。
基底クラスのコンストラクタは、隠蔽されるべきでありません(たとえ PHP
でそれをすることが可能であるとしても)。従って、 XOOPS Cube
のコーディング規則は、モジュール開発者のために、この問題に言及するでしょう。
- PHP において、あなたは、必ずしも C++
等々のようにコンストラクタをを書く必要がありません。
-
あなたがコンストラクタを書かなければならない場合は、他の言語との融和性のために、コンストラクタの先頭部分へ
parentコールを挿入してください。
私は、プロフェッショナルのウェブプログラミングを知りません。しかし、コンストラクタを隠蔽することは、
PHP
プログラマのための一般のチップではないでしょう。継承クラスのコンストラクタがその基底クラスのコンストラクタを隠蔽することは、継承の否定です。