2

背景 :

我正在尝试创建一个平面文件键值存储。当我使用下面的代码时,已写入文件的数组被删除,最终得到一个空文件。在下一个请求中,文件将填充数组。这个过程在每个页面请求上循环。

我尝试过的:

  • 带有“json_encode()”/“json_decode()”的各种方法。
  • 还尝试对“serialize()”/“unserialize()”做同样的事情。
  • 使用“array_merge()”和“array_merge_recursive()”尝试了各种编码结构。

似乎没有任何效果!我最终得到一个空文件的相同循环 - >带有数组的文件,它继续

问题 :

有经验的人可以告诉我我做错了什么吗?

代码 :

/**
 * Class Orm
 */
class Orm
{

    /**
     * @var string The Root database directory with a trailing slash. default is "./database/".
     */
    static $dir = "./database/";
    /**
     * @var array
     */
    protected $data;
    /**
     * @var string
     */
    protected $file = "";

    /**
     * @param $file
     * @return string
     */
    public function load_table($file)
    {
        try {
            if (file_exists(self::$dir . $file)) {
                return $this->file = $file;
            } else {
                throw new Exception("The file " . $file . " cannot be created, because it already exists");
            }
        } catch (Exception $error) {
            return $error->getMessage();
        }
    }

    /**
     * @param String
     * @param array $values An associative array of values to store.
     * @return array
     */
    public function set($key, $values = array())
    {
        try{
            if (!empty($key) && !empty($values)){
                return $this->data[$key] = $values;
            } else {
                throw new Exception();
            }
        } catch (Exception $error){
            return $error->getMessage();
        }

    }

    public function save()
    {
        try{
            if (file_exists(self::$dir . $this->file)) {
                if (filesize(self::$dir . $this->file) == 0)
                {
                    file_put_contents(self::$dir . $this->file, print_r($this->data, TRUE));
                }else{
                    $tmp = file_get_contents(self::$dir . $this->file);
                    $content = array_merge($tmp, $this->data);
                    file_put_contents(self::$dir . $this->file, print_r($content, TRUE));
                }
            } else {
                throw new Exception();
            }
        } catch(Exception $error){
            return $error->getMessage();
        }

    }
}


$user = new Orm();
$user->load_table("users");
$user->set("Tito",array("age" => "32", "occupation" => "cont"));
$user->save();

PS:我认为这将是一个熟悉 PHP 的好项目。所以请不要建议使用 SQL,因为这只是为了学习和理解 PHP。

4

1 回答 1

3

我不能说为什么你的代码没有做到这一点。但是,我还会创建另一个对象来负责将字符串加载和保存到磁盘。不多不少:

class StringStore
{
    private $path;

    public function __construct($path) {
        $this->path = $path;
    }

    /**
     * @return string
     */
    public function load() {
        ... move your load code in here
        return $buffer;
    }

    /**
     * @param string $buffer
     */
    public function save($buffer) {
        ... move your save code in here
    }
}

这看起来可能会少一些,但是您可以将大部分代码移出 ORM 类。如果问题在于存储到磁盘(例如,可能出现了一些错误?),那么您可以在存储类中修复它。

如果在字符串处理中出现错误,那么您知道您需要查看 ORM 类来继续修复。

于 2013-04-30T19:11:12.247 回答