PHPの変数

Web上のプログラムとしてよく使われるPHP。実はこんなことができる。

  • 日本語で変数
$ごはん = "かれーらいす♪";
  • メッソド名に変数
$methodName = "hoge";
$object->$methodName();

日本語で変数

PHPでは変数名に日本語が使える。

<?php
$やること = "ブログ書く!";

print $やること;
?>

出力結果

ブログ書く!

ちなみに、これでももちろんOK。

print "$やること";

これはダメ。

print "$やることhoge";

これだと何も表示されない。
$やることhogeという変数だと勘違いするから。

こういう事をしたい場合はこうしてやればいい。(公式に推奨されるやり方かは知らない

print "${やること}a";

出力結果

ブログ書く!a

つまり、変数名を{}で囲えば明示的にそこが変数名ですよ!ってなる。



ちなみに私がよくやる失敗はこれ。

<?php
$todo = "ブログ書く!";

print "$todoと言ったにも関わらず・・";
?>

これ、実は何も表示されない。読んでる人はわかると思うけど、「$todoと言ったにも関わらず・・」という変数名として解釈されるから。

日本語が変数につかえるというのは結構弊害のほうが大きいのではないか・・とか。
なんでもできるというのは楽しいけどね!

もちろんこれも、

print "${todo}と言ったにも関わらず・・";

でOK。
もしくは

print $todo . "と言ったにも関わらず・・";

こちらのほうが一般的なのかな。






メソッドやプロパティの指定に変数が使える

あるオブジェクト$objectがあるとする。
そのオブジェクトが
$object->name
$object->regist()
のようにプロパティやメソッドを持っていたとする。

これがこんなふうに変数でプロパティ名やメソッド名を指定して呼出できる。

$pName = "name";
$mName = "regist";

$name = $object->$pname; // $name = $object->name と同等
$object->$mName(); // $object->regist() と同等

phpではオブジェクトに対してforeachでプロパティを引っ張りだせたりもするし、まるで連想配列のようにオブジェクトを扱うことができる。

上のメソッド名の指定に変数を使う方式を使うと、こんなことができる。

<?php
class Executor
{
	function regist(){
		print "登録しました。";
	}
	
	function showMember(){
		print "メンバー表示だよ。";
	}
	
	function admin(){
		print "管理画面ですよ。パスワードください。";
	}
}

$exec = new Executor();

// クエリが無いとエラーになるため。
if($_REQUEST["command"]){
	$exec->$_REQUEST["command"]();
}
?>

これで〜〜〜.php?command=regist などとクエリによって簡単にやることを決められる。
若干セキュリティ的に危ないような気がしないでも無いけど。呼び出されて困るメソッドをクラスに登録しなければ大丈夫かな。

実行結果(〜〜.php?command=regist)

登録しました。

非常に柔軟というか普通できないだろと思うことができてしまったりするPHPさんでした。