-4

这是我想要做的:

$var = new ObjectICreated("yay");
echo $var; // outputs "yay" via the __toString() magic method
$var = "Boo"; // $var is still a ObjectICreated, but will now output "Boo" from __toString()

我疯了吗?我认为 SimpleXML 就是这样做的,但我不确定如何。有什么想法吗?

推理:我想跟踪特定对象的更改,而不必使用数十亿个 getter/setter。

好的,感谢您的评论,为后代。SimpleXML 确实做到了这一点。以下工作基于http://www.php.net/manual/en/simplexml.examples-basic.php示例 #9 中的代码。

$x = simplexml_load_string($xml); // xml from example #9
// Pre-reference value
print_r($x->movie[0]->characters->character[0]->name);  
// Assign to reference of a SimpleXMLElement
$x->movie[0]->characters->character[0]->name = 'Miss Coder';
print_r($x->movie[0]->characters->character[0]->name);

输出如下:

SimpleXMLElement Object ( [0] => Ms Coder ) 
SimpleXMLElement Object ( [0] => Miss Coder )

如您所见,它仍然是一个 SimpleXMLElement,就像在分配“Miss Coder”之前一样。

再次感谢大家的时间。

4

3 回答 3

2

正如@dbf 所说

$var = "Boo"无论如何都会覆盖 $var

如果你想避免 getter/setter,你可以简单地暴露一个公共成员

$var = new ObjectICreated("yay");
echo $var; // outputs "yay" from $var->value via the __toString() magic method
$var->value = "Boo";
于 2012-09-12T22:31:18.947 回答
2

如果你想防止很多 setter/getter,你可以实现魔法 setter/getter。虽然这通常是一种代码味道。

class Foo
{
    private $magicData = array();

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

    public function __get($name)
    {
        return $this->magicData[$name];
    }
}

现在您可以简单地执行以下操作:

$foo = new Foo();
$foo->something = 'bar';
$foo->reallyAnything = 'baz';

echo $foo->something;
于 2012-09-12T22:49:55.060 回答
0

感谢所有回复的人。我能够想出一个适合我需要的解决方案。

在我到达那里之前,正如@PeeHaa 所说, __get 和 __set 魔术方法是这里的方法。但是,为了达到原始帖子的既定目标,我们需要一个对象层次结构。据我所知,这就是 SimpleXML 能够完成我在原始帖子和后续编辑中描述的事情的方式,@PeeHaa 在评论中再次提到。我原来的想法确实是不可能的[深深的遗憾]。

下面是我将要做的事情的一个非常原始的视图。我已经做了一些前期工作,它似乎按预期工作。显然,我将填写并完善它以满足我的特定需求。为了简洁起见,它还缺少一些子对象创建代码和子类型智能。

class Foo { 
    protected $_value;
    protected $children = array();
    public function __construct($value) {
        $this->_value = $value;
    }
    public function setValue($value) {
        $this->_value = $value;
    }
    public function __toString() {
        return $this->_value;
    }
    public function __set($key, $value) {
        if(isset($this->children[$key]) == false) {
            $this->children[$key] = new self($value);
        } else {
            $this->children[$key]->setValue($value);
        }
    }
    public function __get($key) {
        return $this->children[$key];
    }
}

$foo = new Foo("");
$foo->myVar = "some value"; // assigns "some value" to $foo->myValue->_value
print_r($foo->myVar); // outputs that we have a Foo
echo $foo->myVar; // outputs the contents of $foo->myValue->_value aka "some value"

// This works and produces the string value of both "myVar" and "anotherVar",
// with "anotherVar" being an instance of Foo.
$foo->myVar->anotherVar = "some other value";

再次感谢大家在我解决这个问题时的贡献和耐心。

于 2012-09-13T02:54:37.383 回答