2

我可以自由地将某些东西分配给 php 中不存在或不存在的成员吗?成员名称和关联数组索引之间有什么区别吗?

我之间有什么区别

$a = array();
$a['foo'] = 'something';

 $a->foo = 'something';

如果有区别,那么如何创建“空”对象并动态添加成员?

4

3 回答 3

8

您正在混合数组(数据包/容器)和对象(具有语义和功能的数据包装)。

数组访问

第一个是正确的,因为您使用的 Array在其他语言中的行为类似于HashTableDictionary 。

$a = array();               // create an empty "box"
$a['foo'] = 'something';    // add something to this array

对象访问

第二个是对象访问。你会使用这样的东西:

class Foo {
    public $foo;
}

$a = new Foo();
$a->foo = 'something';

尽管在这种情况下更好的用法是使用这样的 setter/getter 方法。

class Foo {
    private $foo;
    public function setFoo($value) {
        $this->foo = $value;
    }
    public function getFoo() {
        return $this->foo;
    }
}

$a = new Foo();
$a->setFoo('something');
var_dump($a->getFoo());

PHP 魔法

但是,仍然可以选择使用PHP 魔术方法来创建您所描述的行为。尽管如此,这应该被认为不是将数据存储到对象的常用方式,因为这会导致错误并给您(单元)测试带来更难的时间。

class Foo {
    private $data = array();
    public function __set($key, $value) {
        $this->data[$key] = $value;
    }
    public function __get($key) {
        return $this->data[$key];
    }
}

$a = new Foo();
$a->foo = 'something';   // this will call the magic __set() method
var_dump($a->foo)        // this will call the magic __get() method

希望这确实可以帮助您解决问题。

于 2012-07-13T12:43:03.840 回答
3

如果您想像在关联数组上一样将任意成员分配给对象,您可能需要研究 PHP 的神奇属性重载

这是一个示例类,可让您分配和检索变量(主要取自 PHP 文档):

<?php
class PropertyTest
{
    /**  Location for overloaded data.  */
    private $data = array();

    public function __set($key, $value) {
        $this->data[$key] = $value;
    }

    public function __get($key) {
        return $this->data[$key];
    }
}
// sample use:
$a = new PropertyTest();
$a->foo = "bar";

echo $a->foo; // will print "bar"
?>
于 2012-07-13T12:44:56.397 回答
2

您可以创建一个空的类对象,然后为其添加属性,例如:

<?php
$myObject = new StdClass();
$myObject->id = 1;
$myObject->name = "Franky";
$myObject->url = "http://www.google.com";
var_dump($myObject);

...这应该产生

object(stdClass)#1 (3) { ["id"]=> int(1) ["name"]=> string(6) "Franky" ["url"]=> string(21) "http://www.google.com" }

就个人而言,我更喜欢使用对象类而不是数组。

于 2012-07-13T12:43:30.487 回答