2011年6月14日火曜日

PHP4とPHP5のコンストラクタの動作の違い

PHP4からPHP5へのオブジェクト関連の変更でマジックメソッドが追加されてますが、このマジックメソッドの仕様は不思議な動作をするようでたまに問題が指摘されてます。
多分に漏れず、初心者がはまりそうな部分を書いておきます。

__constructによるコンストラクタの継承による不具合発生。

PHP4までの親コンストラクタの継承は「$this->親クラス名」で継承されていましたが__constructで書こうとすると思わぬエラーが出ることがあります。

Smartyの拡張セットアップも「$this->Smarty();」となっていますね。
http://www.smarty.net/docsv2/ja/installing.smarty.extended.tpl

これを「parent::__construct()」で継承するまではいいのですが、親コンストラクタのほうを__constructに変更するとエラーが出ます。

class Test {
 public function __construct() {
  echo "Testコンストラクタです\n";
 }
}

class TestChild extends Test {
 public function __construct() {
  $this->Test(); //エラー
  echo "TestChildのコンストラクタです\n";
 }
}


冷静に考えれば$thisで親コンストラクタを呼び出すこと自体変なので、新しい親コンストラクタは「parent::__construct()」で呼び出してください。

class Test {
 public function __construct() {
  echo "Testコンストラクタです\n";
 }
/*
        //古い書き方であっても大丈夫です
 public function Test() { 
  echo "Testオブジェクトを生成します\n";
 }
*/
}

class TestChild extends Test {
 public function __construct() {
  parent::__construct();
  echo "TestChildのコンストラクタです\n";
 }
}


であれば親が古い書き方であってもエラーは出ません。

0 件のコメント:

コメントを投稿

Pythonで地図空間データを扱う⑤

ベースの地図が出来た所で、他のデータを被せてみます。 国土地理院の  500mメッシュ別将来推計人口データ  を使用します。 同じく神奈川県のデータ  500m_mesh_suikei_2018_shape_14.zip をダウンロードします。 ベースの地図データと同じ場所に展開...