[PHP-doc 966] Re: コンストラクタとデストラクタ

Yoshinari Takaoka mumumu @ mumumu.org
2013年 2月 16日 (土) 21:43:56 JST


高岡です。

Kenji さん、いつもご指摘ありがとうございます。

On Fri, 15 Feb 2013 09:42:44 +0900
Kenji Suzuki <kenji.uui @ gmail.com> wrote:

> http://www.php.net/manual/ja/language.oop5.decon.php
> 
> 原文
> 
> For backwards compatibility, if PHP 5 cannot find a __construct() function for a given class, and the class did not inherit one from a parent class, it will search for the old-style constructor function, by the name of the class. 
> 
> 翻訳
> 
> 下位互換性を維持するため、PHP 5 が指定されたクラスの __construct() 関数をみつけられなくて、 かつそれが何かの親クラスを継承したものでない場合には、 古い形式のコンストラクタ関数、つまり、そのクラスの名前と同じ関数が探されます。
> 
> 
> 「それが何かの親クラスを継承したものでない場合」という訳がちょっと違う
> 感じではないでしょうか。

後で指摘されているように、 one は __construct() のことだと思います。よって
以下のように直してみました。

----

   下位互換性を維持するため、PHP 5 が指定されたクラスの
   <link linkend="object.construct">__construct()</link> 関数をみつけられなくて、
   かつそれが親クラスのコンストラクタを継承していない場合には、
   古い形式のコンストラクタ関数、つまり、そのクラスの名前と同じ関数が探されます。

----

> ところで one は __construct() のことかと思ったのですが、__construct() が
> 継承されていても古い形式のコンストラクタが呼ばれるようです。私が何か誤解してます
> でしょうか?
> 
> <?php
> 
> class A
> {
>   public function __construct()
>   {
>     echo 'A::__construct()';
>   }
> }
> 
> class B extends A
> {
>   public function B()
>   {
>     echo 'B::B()';
>   }
> }
> 
> $obj = new B(); // B::B()

「子クラスがコンストラクタを有している場合、親クラスのコンストラクタが暗黙のうちにコール
されることはない」という仕様に従っているのではないでしょうか。

ここでいう「コンストラクタ」には **古い形式のコンストラクタも含んでいる** のだと思います。
古いコンストラクタから parent::__construct() を明示的に呼ぶと、親も呼ぶことが出来ます。

#以下のように混ぜられるのって気持ち悪いんですけど、それがPHPなんだと思っています(´ー`; )

----

<?php

class A
{
  public function __construct()
  {
    echo "A::__construct()\n";
  }
}

class B extends A
{
  public function B()
  {
    parent::__construct();
    echo "B::B()\n";
  }
}

//
//   on PHP 5.4.10 
//   A::__construct()
//   B::B()
//
$obj = new B(); 

----

どうぞ宜しくお願い致します。

-- 
Yoshinari Takaoka (mumumu @ IRC)
reversethis -> gro tod umumum ta umumum


PHP-doc メーリングリストの案内