[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 メーリングリストの案内