class Conf{ private $file; private $xml; private $lastmatch; function __construct($file){ $this->file = $file; $this->xml =simplexml_load_file($file); } function write(){ file_put_contents($this->file,$this->xml->asXML()); } function get($str){ $matches = $this->xml->xpath("/conf/item[@name=\"$str\"]"); if (count($matches)){ $this->lastmatch = $matches[0]; return (string) $matches[0]; } } function set($key,$value){ if (!is_null($this->get($key))){ $this->lastmatch[0] = $value; //这个为什么会写入xml,$this->lastmatch[0]没有看到函数调用?return已经结束函数返回了 return; } $conf = $this ->xml ->conf; $this->xml->addChild('item',$value)->addAttribute('name',$key); }}$conf = new Conf('conf.xml');$conf->set('user','test');$conf->write();
<?xml version="1.0" encoding="utf-8"?><conf> <item name="user">bob</item> <item name="pass">newpass</item> <item name="host">localhost</item></conf>
書き込みはありません!
xml には
ノード
はありませんが、元のファイルは確かに変更されています。
ああ、間違った情報を提供したのですが、メイン投稿の最後の XML が結果だと思いましたか?
それではテストしてみましょう
function get($str){echo $str; // user $matches = $this->xml->xpath("/conf/item[@name=\"$str\"]"); if (count($matches)){ $this->lastmatch = $matches[0];print_r($matches[0]);/*userSimpleXMLElement Object( [@attributes] => Array ( [name] => user ))*/ return (string) $matches[0]; } }
章より17 19行目と19行目
$matches = $this->xml->xpath("/conf/item[@name="$str"]");
$this->lastmatch = $一致 [0];
$this->lastmatch[0] は $this->xml->xpath への参照です (xpath メソッドは SimpleXMLElement オブジェクトのコレクションを返します)
PHP の場合
変数 = オブジェクト
変数はオブジェクトへの参照であり、コピーではありません
わかりました、ありがとう