<分区>
我应该补充说,虽然 KVP 数组工作正常,但在执行 OOP 时我更喜欢对象,因为 $foo->bar->foo
看起来比 $foo-> 更干净bar['foo']
在我看来。
PHP 有一种很好的方法可以通过 $foo = array('foo' => 'bar');
甚至 new 5.4 bracket syntax 来创建带有预填充数据的数组。 : $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
的情况下对对象做同样的事情怎么办?
Try #1 - casting to object - nope; we can't cast in the declaration of a class variable :
<?php
class Foo {
public $bar = (object)array(
'foo' => 'bar',
'bar' => 'foo'
);
}
/*
Parse error: syntax error, unexpected T_OBJECT_CAST on line 4
*/
?>
<?php
class Foo {
public $bar = json_decode(json_encode(array(
'foo' => 'bar',
'bar' => 'foo'
)));
}
/*
Parse error: syntax error, unexpected '(', expecting ',' or ';' on line 3
*/
?>
<?php
class Foo {
public $bar = {
'foo' => 'bar',
'bar' => 'foo'
};
}
/*
Parse error: syntax error, unexpected '{' on line 3
*/
?>
似乎唯一可行的方法是使用 __construct
并将 KVP 数组转换为对象,但将变量声明为一件事似乎完全倒退,而且在我们之前使用它,将其转换为其他东西。
<?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"
}
*/
?>
- 是否有一些我没能找到的速记语法?
- 如果 不是;它会被添加到 future 的 PHP 版本中吗?
- 如果没有/直到
然后;有没有比必须添加
__construct
的每个更好的方法 单次? - 相反,我是否应该处理这样一个事实,即使用 在这种情况下,数组更好,尽管在我看来, 看起来更乱?
为什么?:
在为一家公司开发新的数据库类时,我不得不求助于当前代码来管理保存数据库凭据,以便稍后在代码中进行进一步检查。当然,不同的设计模式(例如 $connectionHost
、$connectionDatabase
等)也可以正常工作 - 但对我来说似乎很困惑。
Example :
<?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);
?>