読者です 読者をやめる 読者になる 読者になる

ITの隊長のブログ

ITの隊長のブログです。いや、まだ隊長と呼べるほどには至っていないけど、日々がんばります。CakePHPとPlayFrameworkを使って仕事しています。最近はAngular2をさわりはじめたお(^ω^ = ^ω^)

PHPの動的言語機能に驚いた話

PHP CakePHP

スポンサードリンク

http://www.flickr.com/photos/27403767@N00/2218075860
photo by Scott Beale


こんなこともできるんだ! すごいPHPシリーズ(続きません。)


大体のプログラム言語は、変数に格納した値をクラスとして使用するには、evalやら特別なステップが必要だった覚えがありました。(勝手な認識なので、異論は認めます。。。)


しかし、PHPは動的に処理することができる。パネェ(°Д°;

CakePHPで、バリデーションを複数実行しようとしたんですが、個別に何度も複数の記述が必要だったのでメソッドに纏めようとした。


ただ、動的に関数呼び出しができないと組めなかったので、調べてみたらあっさり出来た(というお話でした)

  • CakePHPで動的機能を試してみた
<?php
/**
 * バリデーションのチェックメソッド
 */
private function checkValidate($model_name, $val_error) {
	// ここが動的言語機能
	if(! $this->$model_name->validates()){
		$this->log('バリデーションでのエラー' . print_r($val_error, true), LOG_INFO);
		return false;
	}
	return true;
}
/**
 * バリデーションでエラーが発生していないか、確認する
 * このメソッドを実行する前に一度、評価データをモデルへsetする必要があります。
 */
private function checkAllValidate() {
	// バリデートしたいモデルを増やしたい場合はここに追加
	$validateErrorArray = array(
		'TestModel' => $this->TestModel->validationErrors,
		'TestModel2' => $this->TestModel2->validationErrors,
	);
	$resultBool = true;

	// バリデーションにエラーが格納されいないかチェック
	foreach ($validateErrorArray as $key => $val_error) {
		if (! $this->checkValidate($key, $val_error)) {
			$resultBool = false;
		}
	}
	return $resultBool;
}


ふーむ。便利。