4

KVP-arrays は問題なく動作しますが、OOP を実行するときは、私の意見$foo->bar->fooよりもきれいに見えるのでオブジェクトを好みます。$foo->bar['foo']

$foo = array('foo' => 'bar');PHP には、新しい 5.4 ブラケット構文( : )を使用して事前に入力されたデータを含む配列を作成する優れた方法があり$foo = ['foo' => 'bar']ますが、オブジェクト ( ) には同じ構文が存在しないようですstdClass

配列のデモ:

<?php
    class Foo {
        public $bar = array(
            'foo' => 'bar',
            'bar' => 'foo'
        );
    }

    $foo = new Foo;
    var_dump($foo->bar);
    /*
        array(2) {
          ["foo"]=>
          string(3) "bar"
          ["bar"]=>
          string(3) "foo"
        }
    */
?>

素晴らしい -を使用せず__constructにオブジェクトで同じことをしたい場合はどうすればよいですか?


#1を試してください-オブジェクトへのキャスト-いいえ; クラス変数の宣言でキャストすることはできません:

<?php
    class Foo {
        public $bar = (object)array(
            'foo' => 'bar',
            'bar' => 'foo'
        );
    }

    /*
        Parse error: syntax error, unexpected T_OBJECT_CAST on line 4
    */
?>

#2を試してください-使用json_decodeしてjson_encode -いいえ; クラス変数の宣言で関数を呼び出すことはできません:

<?php
    class Foo {
        public $bar = json_decode(json_encode(array(
            'foo' => 'bar',
            'bar' => 'foo'
        )));
    }

    /*
        Parse error: syntax error, unexpected '(', expecting ',' or ';' on line 3
    */
?>

#3を試してください-JavaScriptスタイルの括弧を使用してください-いいえ; は[]PHP 5.4 で追加されましたが、オブジェクト ブラケットはまだ存在しません* :

*配列ブラケットの RFC

<?php
    class Foo {
        public $bar = {
            'foo' => 'bar',
            'bar' => 'foo'
        };
    }

    /*
        Parse error: syntax error, unexpected '{' on line 3
    */
?>

動作するように見える唯一の方法は、 を使用し__constructて KVP 配列をオブジェクトに変換することですが、変数を 1 つのものとして宣言し、それを使用する前にそれを別のものにキャストするのは完全に逆に思えます。

__constructデモ:

<?php
    class Foo {
        public $bar = array(
            'foo' => 'bar',
            'bar' => 'foo'
        );

        public function __construct() {
            $this->bar = (object)$this->bar;
        }
    }

    $foo = new Foo;
    var_dump($foo->bar);
    /*
        object(stdClass)#2 (2) {
          ["foo"]=>
          string(3) "bar"
          ["bar"]=>
          string(3) "foo"
        }
    */
?>

  • 見つけられなかった簡単な構文はありますか?
  • そうでない場合; 将来の PHP バージョンで追加される予定はありますか?
  • そうでない場合/それまで; __construct毎回 追加するよりも良い方法はありますか?
  • 代わりに、この状況で配列を使用する方が良いという事実に対処する必要がありますが、私の意見では、それは面倒に思えますか?

なんで?:

会社の新しい DB クラスに取り組んでいましたが、コードの後でさらに検査するために DB 資格情報の保存を管理するために、現在のコードに頼らなければなりませんでした。もちろん、 、 などの別のデザイン パターンでも$connectionHost問題$connectionDatabaseなく動作しますが、私には雑然としています。

<?php
    class DB {
        public $connection = array(
            'host'     => null,
            'database' => null,
            'user'     => null,
            'engine'   => null
        );
        public function __construct($host, $database, $user, $engine = 'mysql') {
            //Essentially I'd like the following line not to be needed:
            $this->connection = (object)$this->connection;

            $this->connection->host     = $host;
            $this->connection->database = $database;
            $this->connection->user     = $user;
            $this->connection->engine   = $engine;
        }
    }

    $db = new DB('127.0.0.1', 'server_db', 'my_user');
    var_dump($db->connection->host);
?>

http://codepad.org/vwy1y9NP

4

1 に答える 1

1

ええ、配列に固執してください。オブジェクトを宣言する簡単な方法はありません。ただし、どうしても必要な場合は、中間オブジェクトを自分でインスタンス化せずに、ネストされたプロパティを直接割り当てることができます。

php > $x = new StdClass;
php > $x->foo->bar = 'baz';
php > var_dump($x);
object(stdClass)#2 (1) {
  ["foo"]=>
  object(stdClass)#1 (1) {
    ["bar"]=>
    string(3) "baz"
  }
}
于 2013-07-30T16:00:07.567 に答える