朝活資料

php講座 phpの小ネタ PDF版で見る

phpの小ネタ

今日はphpできることの小ネタ集です

ダブルクォーテーションで囲った変数

phpでダブルクォーテーションで囲むと文字列になると習いました。
ではこのような場合、どうなるでしょう。

sample1.php

<?php
$text = "ダブルクォーテーションで囲った変数。<br />";
print $text;
print "$text";
print '$text';
?>

1行目は教科書どおりに出力されます。そして2行目は$textとは出ずに1行目とおなじになります。そして3行目は$textと表示されます。
echoでも同じです。2行目はやや気持ち悪いです。あまり使わないほうがよいと思います。

複数行の文字列を変数に格納する

phpで複数行の文字列を変数に格納することができます。1行づつでは、このようなプログラムになります。

sample2.php

<?php
$text = "1行目です。<br />";
echo $text;
$text = "2行目です。<br />";
echo $text;
$text = "3行目です。<br />";
echo $text;
?>

これを複数行の変数に格納するようにするとこのようになります。

sample3.php

<?php
$text = <<<EOL
1行目です。<br />
2行目です。<br />
3行目です。<br />
EOL;
echo $text;
?>

<<<EOLとすると、次のEOLの行まで連続で文字列とするという意味になります。
ではEOLとはなんでしょうか。EOLはEnd Of Lineという意味ですが、実はこの文字列はなんでも構わないのです。EOLと書いてある行まで全部という意味なので、それがABCでも構いません。
慣例的に、EOL,EOD,EOT,ENDなどが使われます。
NULLとはなにか?

MySQLでは、NULL(ヌル)はフィールドになにも入っていない状態を表していました。実はphpにもそれがあります。
sample4.php

<?php
$data1 = NULL;
$data2 = 0;
$data3 = '';
$data4;
echo is_null($data1) ? '$data1はNULLです。<br />' : '$data1はNULLではありません。<br />';
echo is_null($data2) ? '$data2はNULLです。<br />' : '$data2はNULLではありません。<br />';
echo is_null($data3) ? '$data3はNULLです。<br />' : '$data3はNULLではありません。<br />';
echo @is_null($data4) ? '$data4はNULLです。<br />' : '$data4はNULLではありません。<br />';
?>

$data1だけがNULLでそれ以外は、NULL以外です。
ちなみに、? と:は
条件式 ? 真の時 : 偽の時
という3項演算子で、1行だけの判別式の時に使います。
また$data4の時にis_nullの前に@がついていますが、これをつけるとエラーを表示しなくなります。@を取ると$data4は存在しませんというエラーになり、NULLですらありません。

==と===

phpでは条件文で==を使うと習いました。では次のプログラムはどうなるでしょう。

sample5.php

<?php
$data1 = 5;
if ($data1 == '5') {
	echo '$data1は5です。';
}
?>

これは5と’5’が等しいと出ます。これは変です。かたや数値かたや文字です。
では、次の場合はどうでしょう。
sample6.php

<?php
$data1 = 5;
if ($data1 === '5') {
	echo '$data1は5です。';
} else {
	echo '$data1は"5"ではありません。';
}
?>

===は型も内容も等しい時だけ等しいとしてくれます。

引数の値を参照渡しするには

phpでは、functionの引数は値渡しと習いました。つまり呼ばれた方でいくら値を変えても呼び出し元には関係ないということです。

sample7.php

<?php
function ilike($a) {
	$a = 'ねこ';
}

$doyoulike = '犬';
ilike($doyoulike);
echo 'あなたが好きなのは'.$doyoulike.'です';
?>

functionの中で$aをねこにしても、それは呼び元には伝わりません。
しかし、次の場合はどうでしょう。
sample8.php

<?php
function ilike(&$a) {
	$a = 'ねこ';
}
$doyoulike = '犬';
ilike($doyoulike);
echo 'あなたが好きなのは'.$doyoulike.'です';
?>

$aのまえに&をつけると、参照渡しになり、アドレスが渡るので、functionでの変更がそのまま呼び元の変更になります。functionは値を一つしか返さないのですが、このようにして、たくさん渡して、変更すればいくつでも値を返すことができます。ただ注意が必要です。

アクセスカウンタを作ってみる

このページは何回アクセスされたかをカウントするアクセスカウンタを作ってみましょう。

ファイルにカウンタをいれておき、アクセスされたらファイルを開いてロックして、カウントアップしてロック解除することでアクセスカウンタにします。ロックしないと、同時アクセスされたときおかしくなります。

sample9.php

<?php
$counterPath = realpath(dirname(__FILE__));
$counterFile = $counterPath .'/counter.dat';
$fp = fopen($counterFile,'a+b');
flock($fp, LOCK_EX);
$count = fgets($fp);
$count += 1;
ftruncate($fp,0);
fwrite($fp,$count);
fclose($fp);
?>
<!DOCTYPE HTML>
<html lang="en-US">
<head>
	<meta charset="UTF-8">
	<title></title>
</head>
<body>
<?php
echo 'アクセス数:'.$count.'です';
?>

しかし、これではcounter.datが同じフォルダーにあるので触られてしまいます。そこで
$counterFile = $counterPath .'../../../../counter.dat';
パスをxamppのフォルダーにすると、ユーザーからはhttp:で指定できなくなり、安全です。xamppの下にフォルダーを作って、そこに置いたほうがさらによいでしょう。また無料サイト等にするときは、public_htmlフォルダーの上のフォルダーの中にフォルダーを作りpublic_htmlと兄弟にしておけば安心です。