web-dev-qa-db-ja.com

PHP5。配列をクラスメンバーとして宣言する2つの方法

配列をクラスメンバーとして宣言する場合、どの方法で実行する必要がありますか?

class Test1 {
    private $paths = array();

    public function __construct() {
        // some code here
    }
}

または

class Test2 {
    private $paths;

    public function __construct() {
        $this->paths = array();
        // some code here
    }
}

どちらが優れた実践とパフォーマンスの点で優れていますか?あなたは何をお勧めします?

22
ezpresso

クラス変数を宣言するときにこれを行うことをお勧めします。拡張クラスでコンストラクターをオーバーライドすることができます。これにより、関数が配列であるこの変数(空のものでも)に依存している場合、E_NOTICEsまたはE_WARNINGが発生する可能性があります。

10
Mchl

初期化中に配列に動的にデータを追加する場合は、コンストラクターでそれを行います。固定値が含まれている場合は、プロパティ宣言で行います。

宣言内で配列を動的に(たとえば、特定の関数またはメソッドの戻り値を使用して)設定しようとすると、解析エラーが発生します。

// Function call is not valid here
private $paths = get_paths();

それぞれに独自のユースケースがあるため、ここではパフォーマンスはそれほど重要ではありません。

6
BoltClock

一般的に、PHP以外の言語で主に書くので、コンストラクターの外でインスタンス変数を宣言します。これで、クラスのトップを見て、コードを読まなくても、すべてのプロパティとそのアクセス修飾子のアイデアを取得できます。

たとえば、私はこのような方法が本当に好きではありません

// ...
// whole bunch of code
// ...
public function initialize() {
    $this->foo = array();
    // some other code to add some stuff to foo
}

さて、私がクラスを見ただけでは、変数fooがあるかどうか確信が持てません。ある場合、インスタンスの外部からアクセスできるかどうかはわかりません。

代わりに私が持っている場合:

public $foo = array();

クラスの先頭で、fooはインスタンスプロパティであり、どこからでもアクセスできることを知っています。

6
sberry

パフォーマンスへの影響はありません。重要ではないものにとりつかれるのをやめましょう。そこにあるパフォーマンスの問題に集中してください。最初に測定し、上位の違反者のみを最適化します。

1
Alex Weinstein