最初のお題 CRUD - PHP5 版

 

CRUD の PHP5 版を作成しました。

実行サンプル

$ php --version
PHP 5.2.4 (cli) (built: Oct 16 2007 09:13:35) 
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
$ chmod +x crud.php
$ ./crud.php
CRUD> hello
文法エラーです。
CRUD> insert "United Kingdom" => "London"
CRUD> insert "Japan" => "Osaka"
CRUD> select ".*"
United Kingdom => London
Japan => Osaka
CRUD> insert "Japan" => "Tokyo"
Japan は既に存在します。
CRUD> update "Japan" => "Tokyo"
CRUD> select ".*"
United Kingdom => London
Japan => Tokyo
CRUD> delete "japan"
japan が見つかりませんでした。
CRUD> delete "Japan"
CRUD> select ".*"
United Kingdom => London
CRUD> exit
$ 

ソースコード

crud.php
#!/usr/bin/php
<?php

class CRUD {
    private $hash = array();

    public function insert($arg0, $arg1) {
        $h =& $this->hash;
        if (array_key_exists($arg0, $h)) {
            throw new Exception($arg0.' は既に存在します。');
        }
        $h[$arg0] = $arg1;
    }

    public function select($arg0) {
        $h =& $this->hash;
        $p = "/{$arg0}/";
        foreach ($h as $key => $val) {
            if (preg_match($p, $key)) {
                print $key.' => '.$val."\n";
            }
        }
    }

    public function update($arg0, $arg1) {
        $h =& $this->hash;
        if (!array_key_exists($arg0, $h)) {
            throw new Exception($arg0.' が見つかりませんでした。');
        }
        $h[$arg0] = $arg1;
    }

    public function delete($arg0) {
        $h =& $this->hash;
        if (!array_key_exists($arg0, $h)) {
            throw new Exception($arg0.' が見つかりませんでした。');
        }
        unset($h[$arg0]);
    }
}

function parse($s) {
    $p0 = '/^$/';                                       // CRUD> 
    $p1 = '/^([a-z]+).*$/';                             // CRUD> cmd .....
    $p2 = '/^([a-z]+)$/';                               // CRUD> cmd
    $p3 = '/^([a-z]+)\s+"([^"]+)"$/';                   // CRUD> cmd "arg0"
    $p4 = '/^([a-z]+)\s+"([^"]+)"\s*=>\s*"([^"]+)"$/';  // CRUD> cmd "arg0" => "arg1"
    $s = trim($s);
    if (preg_match($p0, $s, $r)) {
        return array('cmd'=>'');
    }
    else if (preg_match($p1, $s, $r)) {
        switch ($r[1]) {
        case 'exit':
            if (preg_match($p2, $s, $r)) {
                return array('cmd'=>$r[1]);
            }
            break;
        case 'select':
        case 'delete':
            if (preg_match($p3, $s, $r)) {
                return array('cmd'=>$r[1], 'arg0'=>$r[2]);
            }
            break;
        case 'insert':
        case 'update':
            if (preg_match($p4, $s, $r)) {
                return array('cmd'=>$r[1], 'arg0'=>$r[2], 'arg1'=>$r[3]);
            }
            break;
        }
    }
    throw new Exception('文法エラーです。');
}

$crud = new CRUD();

while (true) {
    try {
        print 'CRUD> ';
        $r = parse(fgets(STDIN));
        switch ($r['cmd']) {
        case 'insert':
            $crud->insert($r['arg0'], $r['arg1']);
            break;
        case 'select':
            $crud->select($r['arg0']);
            break;
        case 'update':
            $crud->update($r['arg0'], $r['arg1']);
            break;
        case 'delete':
            $crud->delete($r['arg0']);
            break;
        case 'exit':
            exit;
            break;
        case '':
            break;
        }
    }
    catch (Exception $e) {
        print $e->getMessage()."\n";
    }
}

?>