PHP中类似于Javascript的对象?

16

在JS中创建对象的方式非常方便,可以这样写:

test = { foo : { bar : "hello world" }, bar2 : "hello world 2" }

然后像这样使用它们:

test.foo.bar
test.bar2

在PHP中是否有类似于这样的东西,而不需要声明类?

9个回答

19

它被称为关联数组。

示例(注意:缩进是为了排版):

$test = array(
  'foo' => array(
     'bar' => 'hello world'
   ),
  'bar2' => 'hello world 2'
);
$test['foo']['bar'];
$test['bar2'];

这相当于以下的Javascript代码:

var test = {
  'foo': {
    'bar': 'hello world',
  },
  'bar2': 'hello world 2'
};

作为替代方案,您可以使用预先声明的StdClass。

$test = new StdClass;
$test->foo = new StdClass;
$test->foo->bar = 'hello world';
$test->bar2 = 'hello world 2';

这将用JavaScript编写为:

var test = new Object;
test.foo = new Object;
test.foo.bar = 'hello world';
test.bar2 = 'hello world 2';

(注意:在JavaScript中,new Object{}相同)


5
对象并不等同于关联数组,因此前两个例子并不“等价”。对关联数组使用json_encode会生成JavaScript对象,因为JavaScript中没有关联数组,但对JavaScript对象使用json_decode并非如此。默认情况下,json_decode将返回对象。 - Gordon

14

stdClass允许您创建(实质上)无类型的对象。例如:

$object = (object) array(
    'name' => 'Trevor',
    'age' => 42
);

如下所示,创建stdClass对象的最快方法是转换关联数组。对于多个级别,您只需再次在内部执行相同的操作,如下所示:

$object = (object) array(
    'name' => 'Trevor',
    'age' => '42',
    'car' => (object) array(
        'make' => 'Mini Cooper',
        'model' => 'S',
        'year' => 2010
     )
);

另一种方法是使用递归函数将关联数组转换为对象。下面是一个示例。

function toObject(array $array) {
    $array = (object) $array;
    foreach ($array as &$value)
        if (is_array($value))
            $value = toObject($value);

    return $array;
}
// usage:
$array = // some big hierarchical associative array...
$array = toObject($array);

当你不是创建关联数组的人时,这很有用。

不幸的是,尽管PHP 5.3支持匿名方法,但您无法将匿名方法放入stdClass中(尽管可以将其放入关联数组中)。 但无论如何,这并不太糟糕;如果您想在其中实现功能,真的应该创建一个类。


3
您可以使用 PHP 中包含的 StdClass 对象或 ArrayObject(后者需要安装 SPL 扩展)。但是,除非您需要使用 -> 运算符来访问值,否则仅使用关联数组更有效率。

0

test是一个常量。它应该是$test - Lekensteyn

0

最接近的东西应该是数组。

$test = array(
  'foo' => array('bar' => 'hello world'),
  'bar2' => 'hello world 2',
);

echo $test['foo']['bar'];

我知道数组。我特别在问对象,因为它们更灵活,例如,如果需要,您可以添加方法,而不仅仅是数据。 - mvbl fst
在这种情况下,对象有什么更灵活的地方?您无法像JavaScript中那样向StdClass对象添加方法。您能做到的最接近的方法是在StdClass对象中声明一个属性,并将其分配给具有所需方法的对象。您可以轻松地使用数组完成此操作。唯一不同的是用于获取所需内容的语法;我没有看到任何灵活性上的差异。 - simshaun

0

从技术上讲,不是必需的。但是如果您正在创建一个数据对象(即没有方法),您可以从技术上编写一个 JSON 字符串并使用它。

$obj = json_decode($obj_string);

我不建议这样做。我认为会有显著的速度损失。

编辑 虽然不用特别提醒,但应该使用关联数组来代替平面数据对象。


(旁注)但是OP在属性周围缺少引号,所以json_decode将不会返回任何内容,因为它是无效的Json。 - Gordon

0
唯一的原因是如果你想用JSON将数据传回JavaScript函数,那么就使用json_encode将数组编码。否则,只需将其保留为数组,因为没有理由对其进行编码,然后再解码,以便它看起来像JavaScript。

0
尝试这种方式:https://github.com/ptrofimov/jslikeobject 作者实现了类似JS的对象,甚至可以通过$this指针从函数中访问属性。
但是也许使用这样的对象并不比通常的对象好。

0
$a = array(
'a'=> 123,
'b'=> 334,
'c'=> 7853
 );
echo json_encode($a);

这将是结果:{"a":123,"b":334,"c":7853}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接