Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2002/03/09

counter hits
since 1999/11/06


PHP4のクラスとJavaのクラス - コンストラクタ

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();
$obj = new ClassA("hoge");

//メソッドとしての呼出も不可。。。
//$obj->ClassA();
//こっちはOK
$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 // 継承関係を明示的なコンストラクタがあるclassまで遡る
 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 


About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2002 by Hideyuki SHIMOOKA all rights reserved.