4

我应该补充一点,虽然 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"
        }
    */
?>

太好了——如果我们想在不使用 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
    */
?>

尝试#2 - 使用json_decodejson_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 中添加了 's,对象括号仍然不存在*

* rfc 用于数组括号

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

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

似乎唯一可行的方法是使用 a__construct并将 KVP 数组转换为对象,但将变量声明为一个对象似乎完全倒退,在我们使用它之前,将其转换为其他对象。

__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每次都添加 's 更好的方法?
  • 相反,我是否应该处理在这种情况下使用数组更好的事实,即使在我看来,它似乎更混乱?

为什么?

在为一家公司开发一个新的数据库类时,我不得不求助于当前代码来管理保存数据库凭据,以便稍后在代码中进行进一步检查。当然,不同的设计模式,例如$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 回答