2011-10-26 8 views
13

なぜこのようなコードを使用できないのですか?PHPにデフォルトコンストラクタがないのはなぜですか?

<?php 

class NoConstructor { 
} 

class ChildWithConstructor extends NoConstructor { 
    public function __construct() { 
     parent::__construct(); 
     // do something 
    } 
} 

$foo = new ChildWithConstructor(); 
// **Fatal error: Cannot call constructor in file.php on line 8** 

例: Javaクラスには、デフォルトでargsコンストラクタはありません。明示的に定義されていなくても呼び出すことができます。

PHPの動作は、親クラスからargsコンストラクタを削除しないと問題を引き起こす可能性があります。私たちはそれがもう必要ではないと思うとき。

PHPクリエイターがこのようにした理由を知っている人はいますか?

+1

あなたの質問に加えて、これを回避することができることに言及する必要があります:コールする前に関数の存在を確認してください。 –

+6

PHPクリエイターは、愚かな意思決定の*ロット*を作った... –

+1

http://www.php.net/manual/en/function.is-callable.php:if(is_callable( 'parent :: __ construct')){ parent :: __ construct(); } –

答えて

20

Javaクラスはデフォルト、無引数のコンストラクタを持っています。

PHPクリエイターがこのようにした理由を知っている人はいますか?

Javaは計画された言語でした。それは厳密に検討され、正式に指定されました。これは、開発者と実装者の両方に簡単にするために、後方互換性と前方互換性のために最小限の変更で可能な限り長く続くことを意図していました。彼らが望んだ程度まで成功したわけではありませんが、Java 1.0のコードをコンパイルして最新のVM上で実行することは可能です。

PHPのデザイナーは、このような極端な言語を計画したことはありません。彼らは彼らが進むにつれてそれを作ります。より良いか悪いかにかかわらず、彼らは言語を捨てて、次のバージョンでそれを再構築しようとしています。最近のPHP 5では、オブジェクトのバイナリからセマンティクスへの劇的な変化がありました。一貫性のない(そして頻繁に名前が変更された)関数と、たとえヒントがなくても(error_reporting(-1);でさえ)、090として賢く解釈するという、魔法の引用、Unicodeの欠如。

PHPの動作は、親クラスからargsコンストラクタを削除しても問題を引き起こす可能性があります。私たちはそれがもう必要ではないと思うとき。

あなたはbugs.php.netに変更することがこれを要求することができるが、チャンスは、彼らはそれを無視するかであなたをオフにフォブ「申し訳ありませんが、あなたの問題は、PHP自体に問題を意味するものではありませんでしょうが... "

+2

+1、これが問題に対処する唯一の回答です。 – Brad

1

PHP 5より前では、コンストラクタはJAVAのようにクラスと同じ名前でした。 PHP 5では、クラスはクラスと同じ名前(名前空間にない場合)または__constructという名前のコンストラクタメソッドを持つことができます。 おそらくそれはそれと関係があるでしょう。

4

5.3.7 disasterで見たように、PHPの開発にはさらに安定性が必要でした。 PHPはそれ以外にも多くの点で異なっています。

  • エンタープライズバックアップは
  • PHPが古い、時には矛盾している(何もオラクル、ノーIBM、など)と同じリーグではないん
  • PHPのインタプリタ(Zendのエンジンは)すごく行うことができなければなりません非常に多くのレガシー構造とプログラミングパラダイムをサポートすることで、
  • PHPの起源は、愛好家のための簡単なスクリプト言語です。

私は本当にPHPが好きで、毎日使っていますが、時にはちょっとしたことです。一方、__construct()を削除した場合、考慮すべき2つのことがあります。あなたはフレームワークを構築している場合

  1. それを行うことはありません、ただコンストラクタ
  2. を空にするこれらも良い練習しているので、initはコアコンセプトを機能させます。

私はこの意味:

class BaseClass { 
    public function __construct() { 
     if(method_exists($this, 'init') { 
      $this->init(); 
     } 
    } 
} 
1

ライン

parent::__construct(); 

は、親クラスのコンストラクタを明示的に呼び出しです。 "PHP"は存在しないためエラーを出しています。

実際にJavaで親の存在しないコンストラクタを明示的に呼び出すことはできますが、エラーは発生しませんか?

親クラスを拡張するクラスのコンストラクタは、拡張クラスが構築されるときに親クラスのコンストラクタをオーバーライドすることに注意してください。親コンストラクタを呼び出すと、何かすることを期待していることを意味します。コンストラクタが存在しない場合は、インタプリタがエラーを出すかどうかに関係なく、コードへの呼び出しはコードに属しません。

+0

Javaでは、コンストラクタを持たないクラスはありません。コンパイラは、ソースコードに記述されていない場合は、コンパイラを追加します。 https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.9を参照してください。 – bdsl

関連する問題