15

このようなコードを使用できないのはなぜですか?

<?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 コンストラクターはありません。明示的に定義されていなくても呼び出すことができます。

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

PHP の作成者がなぜこのような方法をとったのか、誰か知っていますか?

4

4 に答える 4

24

Java クラスにはデフォルトがあり、args コンストラクターはありません。

PHP の作成者がなぜこのような方法をとったのか、誰か知っていますか?

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

PHP の設計者は、言語をそれほど極端に計画したことはありません。彼らは一緒に行くにつれてそれを補います。良くも悪くも、言語をバラバラにして、次のバージョンで再構築することをある程度喜んでいます。PHP 1 および 2 以降、認識できないほど変更されています。最近でも、PHP 5 で、オブジェクトのセマンティクスが値渡しから参照渡しに劇的に変更されました。魔法の引用符、Unicode の欠如、一貫性のない名前の (そして頻繁に名前が変更された) 関数、エラーのヒントさえなく ( であっても) 数値リテラルを陽気に として解釈するパーサーをもたらしたのと同じ素晴らしい方法論error_reporting(-1);です。090

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

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

于 2011-10-26T21:50:43.807 に答える
4

5.3.7 の災害で見たように、PHP 開発にはもう少し安定性が必要になる可能性があります。それに加えて、PHP はさらに多くの点で異なります。

  • エンタープライズ バックアップは同じリーグに属していません (Oracle や IBM などはありません)。
  • PHP は古く、一貫性がない場合があります
  • PHP のインタープリター (Zend Engine) は、非常に多くのレガシー構造とプログラミング パラダイムをサポートすることで、非常に多くのことを実行できなければなりません。
  • PHP の起源は、愛好家向けの単純なスクリプト言語です。

私は PHP がとても好きで、毎日使っていますが、ちょっと変わったことがあります。一方、__construct() を削除する場合は、考慮すべき点が 2 つあります。

  1. コンストラクタを空にするだけです
  2. フレームワークを構築している場合は、init 関数をコア コンセプトにします。

私はこれを意味します:

class BaseClass {
  public function __construct() {
      if(method_exists($this, 'init') {
          $this->init();
      }
  }
}
于 2011-10-26T21:40:21.597 に答える
1

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

于 2011-10-26T21:38:32.930 に答える
1

この線

parent::__construct();

親クラスのコンストラクターへの EXPLICIT 呼び出しです。「PHP」が存在しないため、エラーが発生しています。

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

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

于 2011-10-26T22:08:24.530 に答える