猿问

修改后无法从JSON文件中获取数据

我创建了一个类,负责获取和修改 JSON 文件中的数据。使用添加数据的方法后,获取数据的方法返回null。

JSON 表示一个具有两个字段的对象:“最后一个 id” - 数字和“posts” - 帖子数组(包含字符串的关联数组)。方法“getPosts()”必须返回帖子数组,方法“addPost($post)”必须向数组添加一个新帖子。

问题出现在这个场景中:

  1. 我使用 getPosts(),它工作得很好。

  2. 我使用 addPost(),它将新帖子添加到 JSON。

  3. 如果之后我再次使用 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


千巷猫影
浏览 262回答 1
1回答

慕桂英3389331

调用的结果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
随时随地看视频慕课网APP
我要回答