コンストラクタの呼ばれ方

PHP4では、コンストラクタの扱いに注意が必要。

単独クラスの場合

PHP:
  1. class ClassA {
  2.   function ClassA() {
  3.     print 'ClassA';
  4.   }
  5.   function ClassA($arg) {
  6.     print "ClassA with $arg";
  7.   }
  8. }
  9.  
  10. // Fatal error : Cannot redeclare classa()

オーバーロードの項目で述べた様に、コンストラクタも複数定義できません。
よって、引数のデフォルト値を使う事で対応可能です。

PHP:
  1. class ClassA {
  2.   function ClassA($arg='') {
  3.     print "ClassA with $arg";
  4.   }
  5. }
  6. // どちらもOK
  7. $obj = new ClassA();
  8. $obj = new ClassA('arg');

継承した場合

PHP:
  1. class ClassA {
  2.   function ClassA() {
  3.     print 'ClassA';
  4.   }
  5. }
  6. class ClassB extends ClassA {
  7.   function ClassB($arg) {
  8.     print "ClassB with $arg";
  9.   }
  10. }
  11.  
  12. // ClassBオブジェクト作成
  13. $obj = new ClassB();// 引数ないぞエラー
  14. $obj = new ClassB('arg');// OK
  15.  
  16. // メソッドとして呼ぶ事は可能
  17. $obj->ClassA();

この場合、親の引数なしコンストラクタは一切呼ばれません。
親のコンストラクタを真っ先に呼びたい場合、Parent::(JAVAで言うsuper)を使って明示的に呼ぶ必要があります。オブジェクト作成後は普通に呼ぶ事ができます。

PHP:
  1. class ClassA {
  2.   function ClassA() {
  3.     print 'ClassA';
  4.   }
  5. }
  6. class ClassB extends ClassA {
  7.   function ClassB($arg) {
  8.     print "ClassB with $arg";
  9.   }
  10. }
  11. class ClassC extends ClassB {
  12. // コンストラクタ未定義
  13. }
  14.  
  15. $obj = new ClassC();// 引数ないぞエラー
  16. $obj = new ClassC('arg');// OK

コンストラクタは継承関係がある場合、階層を遡り最後に定義された1つだけが呼ばれます。

  • Search

Copyright (c) 2004-2008 MT312 All Rights Reserved.
Powered by WordPress ME