|
PHP4からオブジェクト指向的な機能・動作が改善されていますが、オブジェクト指向言語であるJavaとどの程度挙動が異なるか、ちょっとずつまとめてみようかと思います。基本的には、PHPマニュアルに記載されていなくて、「どうなるの?」と思ったことを主にやっています。
今回は、「コンストラクタ」についてです。
PHP4のコンストラクタの定義としては、PHPマニュアル(第13章 クラスとオブジェクト)にもあるとおり「定義されているクラスと同じ名前を有している関数」となっています。
Javaでは複数のコンストラクタを定義できますが、PHPではどうなのか?以下のサンプルで試してみました。
●ConstructorTest.php
<?php
class ClassA
{
function ClassA()
{
echo "ClassA<br>";
}
function ClassA($param)
{
echo "ClassA with param: " . $param . "<br>";
}
}
$obj = new ClassA("hoge");
$obj->ClassA("foobar");
?>
結果、後者が有効でした。では、継承をいくつか行ったクラスではどうか。。。
●ConstructorTest5.php
<?php
1 <?php
2 class ClassA
3 {
4 function ClassC()
5 {
6 echo "in ClassA<br>";
7 }
8 }
9 class ClassB extends ClassA
10 {
11 12 function ClassC($param)
13 {
14 echo "in ClassB<br>";
15 }
16 }
17 class ClassC extends ClassB
18 {
19 20 }
21
22 23 $obj = new ClassC();
24 ?>
●出力結果
Warning: Missing argument 1 for classc() in .../ConstructorTest5.php on line 12 in ClassB
結果、コンストラクタはクラス内(親子関係を含む)で最後に定義された1つのみ有効です。(どこかに記述されていたように記憶しているのですが、失念してしまいました。。。)
ではどうするかというと、引数にデフォルト値を指定することで問題を回避できます。
●ConstructorTest1-2.php
<?php
class ClassA
{
function ClassA($param = "")
{
echo "ClassA with param: " . $param . "<br>";
}
}
$obj = new ClassA();
$obj = new ClassA("hoge");
?>
●出力結果
ClassA with param:
ClassA with param: hoge
|