[PHP-doc 965] コンストラクタとデストラクタ

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

[PHP-doc 965] コンストラクタとデストラクタ

Kenji Suzuki
Kenji です。


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() のことかと思ったのですが、__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()


// Kenji
_______________________________________________
PHP-doc mailing list
[hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-doc
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

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

Yoshinari Takaoka
高岡です。

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

On Fri, 15 Feb 2013 09:42:44 +0900
Kenji Suzuki <[hidden email]> 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 mailing list
[hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-doc
Loading...