我创建了一个类,负责获取和修改 JSON 文件中的数据。使用添加数据的方法后,获取数据的方法返回null。
JSON 表示一个具有两个字段的对象:“最后一个 id” - 数字和“posts” - 帖子数组(包含字符串的关联数组)。方法“getPosts()”必须返回帖子数组,方法“addPost($post)”必须向数组添加一个新帖子。
问题出现在这个场景中:
我使用 getPosts(),它工作得很好。
我使用 addPost(),它将新帖子添加到 JSON。
如果之后我再次使用 getPosts() 它将返回 null。
如果我在不使用 addPost() 的情况下再次运行脚本,getPosts() 将返回一个更新的数组。为什么 addPost() 会影响 getPosts() 的结果?
class PostStorage {
private $path;
public function __construct($path) {
$this->path = $path;
if (file_exists($path)) return;
$contents = array(
"last_id" => 0,
"posts" => array()
);
$this->setStorage($contents);
}
public function getPosts() {
return $this->getStorage()['posts'];
}
public function addPost($post) {
$storage = $this->getStorage();
$newId = $storage['last_id'] + 1;
$post['id'] = $newId;
$storage['posts'][] = $post;
$storage['last_id'] = $newId;
$this->setStorage($storage);
}
private function setStorage($contents) {
$handler = fopen($this->path, 'w');
fwrite($handler, json_encode($contents));
fclose($handler);
}
private function getStorage() {
$handler = fopen($this->path, 'r');
$contents = fread($handler, filesize($this->path));
fclose($handler);
return json_decode($contents, TRUE);
}
}
$postStorage = new PostStorage(JSON_PATH);
$post = array(
"title" => "some title",
"content" => "some content"
);
echo(json_encode($postStorage->getPosts())); // is fine
$postStorage->addPost($post); // file was modified
echo(json_encode($postStorage->getPosts())); // now it returns null
慕桂英3389331