8

PHPのドキュメントを調べていたところ、次のように、クラスのコンストラクターの外部で変数が初期化されたというコメントがいくつか見つかりました。

classMyClass {
    private $count = 0;

    public function __construct() {
        //Do stuff
    }
}

PHPのオブジェクト、パターン、およびプラクティスでは、作成者は、プロパティの初期化にのみ構成を使用し、手間のかかるロジックや複雑なロジックを特殊なメソッドに任せることを推奨しています。このチュートリアル(Googleで見つけた簡単な例)では、コンストラクターを使用してプロパティを初期化することもお勧めします:http ://www.killerphp.com/tutorials/object-oriented-php/php-objects-page-3.php 。

コンストラクターの外部で変数を初期化するのはなぜですか?これはただのずさんなコーディングですか、それともこのようなことをする理由がありますか?最近まで、コンストラクターの外部でデフォルト値を初期化したと言わざるを得ませんが、一方の方法が他方の方法に勝るプログラム上の利点はないようです。

4

3 に答える 3

7

コンストラクターの外部で変数を初期化するときは、定数として初期化する必要があります。初期化する操作はできません。したがって、そのメンバーの初期値は、実際にはクラス署名の一部です。

たとえば、これは無効です。

private $var = $othervar;
private $var = func();

コンストラクターでもそれを行うことができますが、何らかのロジックが実行されていない限り、少し冗長になり、コンストラクターに雑然としたものが追加されます。

于 2012-06-28T16:07:56.720 に答える
2

答えよりもコメントですが、ここで少し詳しく説明してください。

プロパティの初期化にのみコンストラクターを使用することをお勧めします。

誰がこれを言い、なぜですか?私は、デフォルト値を持つプロパティ定義以外のものにのみ関連していると思います。


答えの部分:

PHPのデフォルトでは、変数は書き込みコンテキストで最初にアクセスされたときに定義されるため、変数を定義する必要はありません。未定義の変数を含むすべての変数には、NULLデモ)が含まれます。

class A {}

$a = new A;

var_dump($a->property); # NULL

クラス変数(プロパティ)の導入PHPは、実際に変数を定義できるようにしました。NULLそれらはデフォルトでまだ返されますが、定義されています(デモ):

class A {
    public $property;
}

$a = new A;

var_dump($a->property); # NULL

進化の次のステップでは、この言語構​​造により、定数式を指定することもできます。定義はコンパイル時(コンストラクターが呼び出されるときの実行時ではない)であるため、これは一定です。例(デモ):

class A {
    public $property = 'hello';
}

$a = new A;

var_dump($a->property); # string(5) "hello"

これはコンパイルですが、コンストラクターのランタイムであるため、両方の機能を別の機能と比較するのは難しいと思います。また、コンストラクターを介して初期化することが推奨される理由も明確ではありません。

于 2012-06-28T16:08:04.537 に答える
0

ずさんなことからはほど遠い...それは良いプログラミングの練習です。Java / C ++でも行うように、それらを設定するだけで、コンストラクターで任意の初期化を行うことができます。通常は、デフォルト以外に送信します。

于 2012-06-28T16:08:25.500 に答える