PHPでオーバーロード、メソッドチェーンの練習。O/RMつくってみた

→ ‎https://gist.github.com/3224802

こんなかんじで使える:

$db = new KDB('root','','sso_cp','localhost');
$db->users->insert($profile)->query();

これの実行時点で$dbのインスタンス変数にはusersっていう変数はないので、普通は$db->usersをやった時点でそんな変数ないがな、と言われるはずだが、KDBクラスの中の__get()ってやつでオーバーロードしているので、こういう技が使える。

public function __get($table) {
	$this->table = $table;
	return $this;
}

この存在しないはずの “users” 変数を指定することで、O/RMにusersテーブルを指定することができる($this->tableに代入)。
insert()メソッドに連想配列を渡すと、$this->sqlとかにいろいろビルドしたSQL文を代入した後に、インスタンス($this)を返してくれるので、

public function insert($assoc) {
	$this->sql = "INSERT INTO {$this->table} SET ";
	foreach ($assoc as $k => $v) {
		$this->sql .= "`{$k}`='".$this->mysqli->real_escape_string($v).'\',';
	}
	$this->sql = substr($this->sql, 0, -1);
	return $this;
}

そのままメソッドチェーンでつないでquery()が実行できる、という仕組み。

public function query() {
	$res = $this->mysqli->query($this->sql);
	if ($res === true) {
	}
	else if ($res === false) {
		error_log('mysqli:(query failed) '.$this->mysqli->error);
		return false;
	}
	else {
		$array = array();
		while ($row = $res->fetch_assoc()) {
			$array[] = $row;
		}
		return $array;
	}
}

query()の中では、$this->sqlをそのままMySQLに渡しているだけ。

というように、メソッドチェーンはいったん変数を経由することなく、おなじインスタンスを引き継いでくれるので、便利。

コメントを残す

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>