2013-03-18 7 views
5

コード:静的プロパティが親クラスの子クラスに存在するかどうかを確認します(遅延静的バインディング)。親クラスの

foreach(static::$_aReadOnlyDatabaseTables AS $TableName => $aColumns){ 
    // Do something 
} 

これは$ _aReadOnlyDatabaseTablesは、子クラスで定義されているときに動作しますが、$ _aReadOnlyDatabaseTablesが存在しない場合にエラーをスローします。このプロパティが最初に存在するかどうかを確認する必要があります。

if(property_exists(static,$_aReadOnlyDatabaseTables)){ 
    foreach(static::$_aReadOnlyDatabaseTables AS $TableName => $aColumns){ 
     // Do something 
    } 
} 

しかし、これは構文エラーをスローし、unexpected ',', expecting T_PAAMAYIM_NEKUDOTAYIM

私はそれがこのような何かを行くべきだと思います。 staticの代わりに$thisを使用すると、どちらも機能しません。常にfalseを評価します。

これにはどのような構文が適していますか?

答えて

7

あなたはこの試してみてください:

if(property_exists(get_called_class(), '_aReadOnlyDatabaseTables')) { 
    foreach(static::$_aReadOnlyDatabaseTables AS $TableName => $aColumns){ 
     // Do something 
    } 
} 
+0

これは、それが後半の静的バインディングでどのように行われるかです。 – nickb

+3

@ニック親クラスの配列を宣言し、子クラスでオーバーライドするだけで、より高速で効率的になります。その後、プロパティのチェックをスキップすることができます。オーバーライドはコンパイル時に1回実行され、メソッドが呼び出されるたびに追加のオーバーヘッドが発生することはありません。 –

+0

@ CorinMorelli、ありがとう、それもやっていますが、私の目標は、このプロパティがまだ実装されていない子クラスを検出することでした。 – Nick

3

正しい方法は、親クラスの正常なデフォルト値(空の配列)で値を初期化することです。そうすれば、その物件が存在することを確かめることができます。

1つのクラスでアクセスするものはすべて、そのクラスを単独で使用しているときに適切に定義して利用できるようにしてください。あなたが代わりにstaticキーワードのget_class()を使用して、この迅速かつ汚いを行うことができるはず

+0

をこれは、一般的には良いアドバイスですが、それはdoesnの質問された質問に答えません。また、配列が存在することをテストし、配列をループさせる前に実際に配列であるかどうかをテストすることをお勧めします。 – Nick

0

if (property_exists(get_class($this), '_aReadOnlyDatabaseTables')) { ... } 
+0

'$ this'は静的メソッドでは使用できないはずです.OPは彼の質問にコードを入れます。 –

+0

私はOPで言及しませんでしたが、これはインスタンス化されたクラスであり、静的プロパティ – Nick

+0

この場合、 '$ this'参照が利用可能です。 –

関連する問題