-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 はまさにこれを行っていると思いますが、その方法はわかりません。何かご意見は?

理由: 何十億ものゲッター/セッターを使用せずに、特定のオブジェクトへの変更を追跡したい。

わかりました、後世のために、コメントをありがとう。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 )

ご覧のとおり、「Miss Coder」が割り当てられる前と同じように、まだ SimpleXMLElement です。

お時間をいただきありがとうございました。

4

3 に答える 3

2

@dbfが言うように

$var = "Boo"何があっても $var を上書きします

ゲッター/セッターを避けたい場合は、パブリックメンバーを公開するだけです

$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

多くのセッター/ゲッターを防ぎたい場合は、魔法のセッター/ゲッターを実装できます。多くの場合、これはコードの匂いです。

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 に答える