PHP/入門/変数と値

< PHP

算術演算編集

まず、PHPで加算や減算など四則演算を表示したい場合、

たとえば

<?php
	print (1+3)."aaa".(50+8)."<br />";
?>

とすれば、HTMLで実行・表示すれば(つまり、apacheなどwebサーバ上でPHPを実行して、webブラウザでアクセスして表示すれば)、

4aaa58

のように、表示されます。

  • 引用符" "は、その中を原則的に文字列だとして認識させる構文です(ただし後述するように、例外的に{$a}のような書式によって変数を埋め込むことができます、)。
  • ドット記号 . は、文字列の連結をさせる意味を持ちます(文字列連結演算子)。
  • <br /> はHTMLタグでの改行です。もしHTML以外の環境で実行表示しているなら、改行されずにそのまま<br />が表示されるかもしれません。
  • 四則演算などの算術演算子と文字列連結演算子を1つの式で混在させる場合、計算値の範囲を丸カッコ ( ) で指定する必要があります。文字列連結演算子の保が高いからです。

また、この表示後のページのソースコードを見ても(一般的なwebブラウザにはhtmlソースコード表示の機能がある)、

4aaa58

のように、計算後の値しか、書かれていない結果になります。

PHPはこのように、計算後の数値をHTMLに代入します。

このため、機密などを扱う場合、PHPを用いてソースコードの計算を隠す事もできます。


<?php
	print 60+7;
?>

この場合、演算子の優先度の問題はないため、丸かっこは不要です。

また、webブラウザのソースコード表示機能で見ても、ブラウザに表示されるのは、計算後の数値です。 サーバーがwebブラウザにデータを送る前の段階で、PHPの式をもとに計算後の数値に置き換えてからhtmlを生成しています。そのため、htmlのどこにも計算式は無い状態です。htmlには、計算後の数値だけがあります。

たとえば上記の print 60+7; とあるPHPファイルのwebアドレスをwebブラウザで見に行っても、表示されるのは

67

という表示結果だけです。また、そのページのソースコードを見ても「67」という文字列しかない状態です。

なお、webブラウザで見に行ってる「67」と表示しているページの正体は、たといアドレス名の末尾に「.php」とついていても、ブラウザが見ているのは実はhtmlファイルです。単にアドレス名の末尾に「.php」とついているだけのhtmlファイルをwebブラウザが見に行ってるにすぎません。

変数とは編集

変数とは、数を記録しておくためのものである。

変数は、プログラミングにおいて欠かせない。

変数の基本編集

変数には、次の特徴がある。

  • 1つの値をもつ。(例外あり)
  • 最後に代入したものが入る。

これらの規則は、大抵ほかのプログラミング言語でも同じである。

PHPの変数を扱う決まり編集

変数を示すとき、 $ を初めに書きましょう。 また、変数の名前は、最初の文字が _ もしくはアルファベットである必要があります。

つまり、

$kk3k
$_kkk54

はOKですが、

$89aa
$7_loop

などは使えないと言う事であります。

PHPでは、変数名の大文字、小文字を区別するため、 name NAME Name namE nAME はすべて違う変数となります。

変数を使う編集

概要編集

変数を使うプログラムをかいてみる。

<?php
$a = 99;

print $a;
?>

これを実行すると

99

と表示される。

上記コードは変数 $a に値 99を代入し、それをprint文によって表示するプログラムである。

このように変数は、文字列を入れることもできる。


引用符の中での変数の埋め込み

ほかの例も下記に見ていこう。

例:

<?php
$a = "こんにちは";

print "挨拶 : {$a}";
?>

これを実行すると、

挨拶 : こんにちは

と表示されるはずだ。

このように、引用符の中に変数を埋め込むことができる。

※ $aを{}で囲んでいるのは、近くにマルチバイトがあると、うまく展開できないことがあるため。

変数と文字の連結編集

PHP で変数と文字列を連結するとき、. を使う。(文字列と別の文字列の連結で使う.演算子と同一です。)

サンプル:

<?php
$a = 7;
print $a . " is answer";
?>

これを実行すると、サーバ実行されているHTML上では

7 is answer

と表示される。


なお、下記のようにドット連結を使わなくても、同じ結果になるコードを書くことができる。

<?php
$a = 7;
print "{$a} is answer";
?>

printとprintf編集

print文とは別に、printf という末尾にfのついている関数があります。末尾にfのつくほうの printf 関数は、C言語に由来する関数です(C言語に同じ名前の関数があり、同じような書式で使います)。

<?php
$a = 7;
printf ("%d is answer", $a);
?>

実行結果

7 is answer

演算子編集

PHPでは(普通、プログラミング言語では)、計算式を用いることができる。

例:

<?php
$num1 = 70;
$num2 = 12;
$sum = 0;

$sum = $num1 + $num2;
print $sum."<br>";
$sum = $num1 - $num2;
print $sum."<br>";
$sum = $num1 * $num2;
print $sum."<br>";
$sum = $num1 / $num2;
print $sum."<br>";
$sum = $num1 % $num2;
print $sum."<br>";
?>

このPHPコードを組み込んだHTMLを実行表示すると、

82

58

840

5.8333333333333

10

と表示される。

+ は、足し算、

- は、引き算、

* は、かけ算、

/ は、割り算、

% は、割り算のあまり、

をそれぞれ意味する演算子である。


※ PHPの除算は、割り切れない場合の「/」の結果は浮動小数である。(※ 他の言語では、整数になるものもあるので、混同しないように注意)。
整数の範囲で割り算をしたい場合には、PHP7以降ではintdiv() 関数を使うことで実現できる。
PHP7以前でも、小数点斬り捨ての関数 floor()などで、割り算の整数値を求められる。

たとえば、Apache上でPHP7を試しても(webブラウザで閲覧)、

<?php
 print(70/12);
?>

の結果は

5.8333333333333

という浮動小数である。

intdiv()は、HTMLに組み込む場合、

<?php
  print(intdiv(70,12));
?>

のように使い、結果は「5」である。書式は intdiv(割られる数,割る数) である。


説明の簡単化のためコマンドラインから使う場合で説明すると、

php > print(intdiv(70,12));
5

のように、1行目を入力すると、2行目に答えの「5」が自動的に出てくる。


floor()関数を使うなら、

php > print(floor(70/12));
5

「5」というのは、

70/12 = 5 あまり10

の商の5の事である。


この、 + - * /  % は、それぞれ「演算子」と呼ばれる。

<?php

$a = 5;
$b = 5;

$a++;
$b--;

printf ($a . "<br>" . $b);

?>
実行結果
6
4

このように、 ++, -- 、はそれぞれ、プラス1, マイナス1を実行する。

これらをそれぞれ、(プラス1するほうを)インクリメント、(マイナス1するほうを)デクリメント、と呼ぶ。

定数編集

変数の宣言時に const キーワードをつけると、書き換えを禁止できます。const 宣言の際、変数名の冒頭に「$」はつけません。$をつけてもエラーになります。


<?php
const a = 99;

print a . "\n";
?>
実行結果
99


では、実際に変数の書き換えをしてみて、エラーになるか確認しましょう。


<?php
const a = 99;

print a . "\n";

// ここで定数だと忘れて、変数のように定義したしまったとする
$a = 40; 
print $a . "\n";
?>
実行結果
99
40

上記コードのようなミスの場合、予想に反してエラーになりません。

定数「a」とは別に、変数「$a」が確保されてしまうだけです。思わぬバグにつながりかねません。PHPの定数はあまり信用しないほうが無難でしょう。


PHPはdefineという組み込み関数でも定数を宣言できますが、間違えて$a的に書き換えた場合はconst同様の問題が置きます。


<?php
define("a" , 99);

print a . "\n";

$a = 40;
print $a . "\n";
?>
実行結果
99
40


そのほか、クラスのほうの機能でPHP8.1からreadonlyプロパティという書き換え禁止の機能がありますが、しかしクラスでない通常変数の定義ではreadonly の利用は不可能です。

PHP: プロパティ - Manual (2022年6月14日に確認)を参考に、クラス外部で無理やり

readonly int $var10;

とか宣言してみても

Parse error: syntax error, unexpected identifier "int", expecting "abstract" or "final" or "readonly" or "class" in /home/sujiniku/test.php on line 2

などのエラーが出るだけです。

なお、クラス内部で同様の記述をしてもPHP8.2ではエラーになります。公式マニュアルの仕様が古いようです。

その他編集

unset編集

今後に使う予定のない変数に unset() 関数を適用することで、明示的にその変数を使わないことを表明できます。 また、unset にともない、unsetした変数に占有されていたメモリ領域のリファレンスカウントが一つ減るので、メモリが開放される可能性があります。

unsetの適用後、変数を参照すると、言語処理系が警告をしてくれるので、バグなどを発見しやすくなります。

ためしに下記コード例では、unsetの適用後、変数を参照しています。

<?php
$num1 = 70;
$num2 = 12;

print $num1."<br>";

print $num2."<br>";

unset($num2);

print $num2."<br>";

?>
実行結果
70
12
Warning: Undefined variable $num2 in C:\ファイルアドレス\ファイル名.php on line 11

上記の実行結果のように、言語処理系が警告をしてくれています。unsetの仕様に反して無理やりにnum2を再使用しているので、警告をしてくれる動作のほうが、言語処理系の動作としては正常な動作結果です。

なお、C++など他の言語で類似の機能をもつ「delete」という名の文ないし関数は、PHPには存在しません[1]

null編集

もし、変数の再使用を禁止したいわけではなく、単にいったん変数を一時的に空(から)にしたいだけの場合、変数に null を代入します。 発音的には null は「ヌル」または「ナル」などと読みます。

<?php
$num1 = 70;
$num2 = 12;

print $num1."<br>";

print $num2."<br>";

// unset($num2);

$num2 = null;
print $num2."<br>";

$num2 = 35;
print $num2."<br>";

?>
実行結果
70
12

35

実行結果の3行目の何も表示されてない行が、null に相当します。

未定義変数編集

2021年の現在、最新のPHP8では、未定義(Undefined)の変数をprintしたりechoなど出力したりすると、警告文(warning)が出るようになりました(以前は通知 notice どまりだった)。実行自体は中断されずに続行しますが、あまり推奨されません。

コード例
<?php
    print $w; // これ以前のどこでも$wを定義していない
    $d = $w;  
    print "hello";
?>
実行結果
Warning: Undefined variable $w in C:\ファイルアドレス\ファイル名.php on line 2

Warning: Undefined variable $w in C:\ファイルアドレス\ファイル名.php on line 3
hello


学習者への注意

今後は上記のような未定義での変数の使用法は、ひかえるべきです。初心者は、わざわざ非推奨の未定義変数の利用をする必要がありません。

PHPの過去バージョンで、未定義変数の利用が昔は非推奨でなかった頃がありました。そのような古いバージョンとの動作互換性を当面のあいだは残しておくためなどの理由で、現状のPHP8ではまだ動作するだけにすぎないでしょう。

今後のバージョン(PHP9以降)では、もしかしたら動作すらできずにエラーになる可能性すらありえます。

通知(PHP7以前)→警告(PHP8) と、どんどんと非推奨のレベルが上がっているので、この調子で非推奨のレベルが上がっていくと、いつかは使用不可能のエラーになる可能性があります。

なので初心者は、未定義変数の利用を控えましょう。今から学習を始める初心者が、わざわざ非推奨の方法を使う必要はないのです。


なお、表示出力以外の構文や関数でも同様に、未定義変数を未定義のままで構文または関数で参照すると警告文が出ます。


なお、下記コードのように変数の前に@ アットマーク をつけることで、警告文などを非表示にすることができますが、これは単に非表示になっただけに過ぎず、大本のPHP本体の開発陣たちが未定義変数を非推奨にしていく開発方針の流れ自体は変わらないので、警告メッセージから目を背けるのではなく、変数の定義をするなどの対応をしておきましょう。なお、このようなPHPのアットマークの機能のことを「エラー制御演算子」といいます。

<?php
    print @$w; // これ以前のどこでも$wを定義していない
    $d = @$w;  
    print "hello";
?>

非表示の機能を実務で使うとするならば、たとえば、すでに過去バージョンで大きなプログラムを作ってしまった人が、他のエラーメッセージを発見しやすくするために原因の分かっている警告を非表示にするなどの用途に限定されるべきです。

なお、webブラウザで閲覧している場合には、ブラウザのログ画面を見ない限りは、一般にエラーメッセージや警告メッセージなどは出ません。なので、エラーの許されない厳しいプログラムを作る場合は、ブラウザだけでなく、コンソール端末でも動作を確認しましょう。

  1. ^ 『PHP: delete - Manual』 2021年12月7日に確認.