h2o*_*ooo 5 php oop casting object
我应该补充一点,虽然 KVP 数组工作得很好,但在进行 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"
}
*/
?>
Run Code Online (Sandbox Code Playgroud)
太棒了 - 如果我们想在不使用 a 的情况下__construct对对象执行相同的操作怎么办?
尝试#1 - 转换为对象- 不;我们不能在类变量的声明中进行强制转换:
<?php
class Foo {
public $bar = (object)array(
'foo' => 'bar',
'bar' => 'foo'
);
}
/*
Parse error: syntax error, unexpected T_OBJECT_CAST on line 4
*/
?>
Run Code Online (Sandbox Code Playgroud)
尝试#2 - 使用json_decodeandjson_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
*/
?>
Run Code Online (Sandbox Code Playgroud)
尝试 #3 - 使用 javascript 风格的括号- 不;即使[]PHP 5.4 中添加了 ',对象括号仍然不存在*:
<?php
class Foo {
public $bar = {
'foo' => 'bar',
'bar' => 'foo'
};
}
/*
Parse error: syntax error, unexpected '{' on line 3
*/
?>
Run Code Online (Sandbox Code Playgroud)
唯一可行的方法似乎是使用 a__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"
}
*/
?>
Run Code Online (Sandbox Code Playgroud)
__construct每次都添加 更好的方法? 为什么?:
在为一家公司开发新的数据库类时,我不得不求助于当前的代码来管理保存数据库凭据以便稍后在代码中进行进一步检查。当然,不同的设计模式,例如$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);
?>
Run Code Online (Sandbox Code Playgroud)
是的,坚持使用数组。没有声明对象的简写方法。但是,如果绝对必要的话,您可以直接分配嵌套属性,而无需自己实例化中间对象:
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"
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3872 次 |
| 最近记录: |