arrays - PHP-オブジェクトの静的配列を定義する



object (3)

PHPのクラス内のオブジェクトの静的配列を初期化できますか? あなたができるように

class myclass {
    public static $blah = array("test1", "test2", "test3");
}

しかし私がするとき

class myclass {
    public static $blah2 = array(
        &new myotherclass(),
        &new myotherclass(),
        &new myotherclass()
    );
}

myotherclassはmyclassの直上に定義されています。 しかし、それはエラーを投げる。 それを達成する方法はありますか?


Answers

これらの値を持つように初期化することはできませんが、静的メソッドを呼び出して、以下で行ってきたように、それらを内部コレクションにプッシュすることができます。 これはあなたが得るほど近いかもしれません。

class foo {
  public $bar = "fizzbuzz";
}

class myClass {
  static public $array = array();
  static public function init() {
    while ( count( self::$array ) < 3 )
      array_push( self::$array, new foo() );
  }
}

myClass::init();
print_r( myClass::$array );

デモ: http://codepad.org/InTPdUCT : http://codepad.org/InTPdUCT

結果は次のようになります。

Array
(
  [0] => foo Object
    (
      [bar] => fizzbuzz
    )
  [1] => foo Object
    (
      [bar] => fizzbuzz
    )
  [2] => foo Object
    (
      [bar] => fizzbuzz
    )
)

いいえ。 http://php.net/manual/en/language.oop5.static.phpから:

他のPHP静的変数と同様に、静的プロパティはリテラルまたは定数を使用してのみ初期化できます。 式は許されません。 したがって、静的プロパティを整数や配列に初期化することはできますが、別の変数、関数の戻り値、またはオブジェクトに初期化することはできません。

私はnullにプロパティを初期化し、アクセサーメソッドでプライベートにし、アクセサが最初に呼び出されたときに "実際の"初期化を行うようにします。 ここに例があります:

    class myclass {

        private static $blah2 = null;

        public static function blah2() {
            if (self::$blah2 == null) {
               self::$blah2 = array( new myotherclass(),
                 new myotherclass(),
                 new myotherclass());
            }
            return self::$blah2;
        }
    }

    print_r(myclass::blah2());

このベンチマークをチェックアウト: http://jsben.ch/#/bWfk9 : http://jsben.ch/#/bWfk9

スピードが主な関心事だった以前のテストでは、

JSON.parse(JSON.stringify(obj))

オブジェクトを深くクローンする最速の方法です(深いフ​​ラグをtrueに設定してjQuery.extendを10〜20% jQuery.extend )。

ディープフラグがfalse(浅いクローン)に設定されていると、jQuery.extendはかなり高速です。 型バリデーションのための余分なロジックが含まれており、未定義のプロパティなどをコピーしないため、これは良い選択ですが、これによっても少し時間がかかります。

クローンを作成しようとしているオブジェクトの構造を知っていたり、深いネストされた配列を避けることができれば、hasOwnPropertyをチェックしながらオブジェクトをクローンするfor (var i in obj)の単純なfor (var i in obj)ループを書くことができ、jQueryよりもはるかに高速です。

最後に、ホットループで既知のオブジェクト構造を複製しようとすると、クローン手順を単純にインライン化してオブジェクトを手作業で構築するだけで、より多くのパフォーマンスを得ることができます。

JavaScriptトレースエンジンは、 for..inループを最適化するfor..inます。また、hasOwnPropertyをチェックすることで、あなたも遅くなります。 速度が絶対必要である場合、手動クローン。

var clonedObject = {
  knownProp: obj.knownProp,
  ..
}

DateオブジェクトのJSON.parse(JSON.stringify(obj))メソッドを使用することをJSON.parse(JSON.stringify(obj))くださいJSON.parse(JSON.stringify(obj)) JSON.stringify(new Date())は、 JSON.parse() DateオブジェクトにDateます。 詳細については、この回答を参照してください

さらに、少なくともChrome 65では、ネイティブクローニングは行かないことに注意してください。 このJSPerfによれば、新しい機能を作成してネイティブクローニングを実行することは、JSON.stringifyを使用するよりも800倍近く遅くなります。





php arrays object