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 で追加されましたが、オブジェクト ブラケットはまだ存在しません* :
<?php
class Foo {
public $bar = {
'foo' => 'bar',
'bar' => 'foo'
};
}
/*
Parse error: syntax error, unexpected '{' on line 3
*/
?>
動作するように見える唯一の方法は、 を使用し__construct
て KVP 配列をオブジェクトに変換することですが、変数を 1 つのものとして宣言し、それを使用する前にそれを別のものにキャストするのは完全に逆に思えます。
<?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);
?>