我创建了一个类,负责获取和修改 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 modifiedecho(json_encode($postStorage->getPosts())); // now it returns null
1 回答
慕桂英3389331
TA贡献2036条经验 获得超8个赞
调用的结果filesize被缓存。因此,第二次调用filesizeingetStorage返回旧大小。因此,仅返回文件的一部分:{"last_id":1,"posts":[{。这会导致 json 解析器失败并返回一个空数组。这个数组没有posts键,因此在getPosts.
解决办法是先调用clearstatcache();再调用filesize。示例代码:
private function getStorage() {
clearstatcache();
$handler = fopen($this->path, 'r');
$contents = fread($handler, filesize($this->path));
fclose($handler);
return json_decode($contents, TRUE);
}
有关此缓存“功能”的更多信息:https : //www.php.net/manual/en/function.clearstatcache.php
- 1 回答
- 0 关注
- 261 浏览
添加回答
举报
0/150
提交
取消