「PHP/入門/変数と値」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎null: null は、変数の束縛を解く時につかわれ、その意味では unset() と似ています。 NULLが入った変数は、isset()はfalseを返します。 ??は、NULL合体演算子です。式1 ?? 式2は、isset(式1) ? 式1 : 式2と同じ意味です。v7.0から導入されました。
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎未定義変数: 2022年12月現在の最新の安定バージョン v8.1.13 では、未定義(Undefined)の変数参照すると警告文(warning)が出ます。→‎エラー制御演算子(@): エラー制御演算子(@)は、名前と機能がやや乖離していて、「メッセージ抑制演算子」程度の機能しかありません。 エラー制御演算子には、トラブルシューティングに役立つエラーや警告を表示させないという害悪があるので、他の方法(例えば例外処理)を検討するべきです。
タグ: 2017年版ソースエディター
600 行
 
=== 未定義変数 ===
2021202212月現在最新のPHP8安定バージョン v8.1.13 では、未定義(Undefined)の変数をprintしたりechoなど出力したり参照すると警告文(warning)( ''Warning'' )が出るようになりました(以前は通知 notice どまりでした)。実行自体は中断されずに続行しますが、あまり推奨されません
 
;例:<syntaxhighlight lang=php line>
;コード例
:<syntaxhighlight lang=php>
<?php
echo $w; // 未定義変数の参照
print $w; // これ以前のどこでも$wを定義していない
$d = $w;
print "hello";
?>
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=phptext>
 
PHP Warning: Undefined variable $w in C:\ファイルアドレス\ファイル名/workspace/Main.php on line 2
;実行結果
PHP Warning: Undefined variable $w in C:\ファイルアドレス\ファイル名/workspace/Main.php on line 3
<pre>
Warning: Undefined variable $w in C:\ファイルアドレス\ファイル名.php on line 2
 
Warning: Undefined variable $w in C:\ファイルアドレス\ファイル名.php on line 3
hello
</syntaxhighlight>
</pre>
: 意図的に未定義変数を参照することはありえません。
: 未定義変数の参照が起こるときは、概ねミススペルが原因です。
: 未定義変数の参照に関する警告を、エラー制御演算子(@)で回避するのは間違いです。未定義となった原因を排除するか、適切な初期値を与えましょう。
 
=== エラー制御演算子(@) ===
エラー制御演算子(@)は、名前と機能がやや乖離していて、「メッセージ抑制演算子」程度の機能しかありません。
エラー制御演算子には、トラブルシューティングに役立つエラーや警告を表示させないという害悪があるので、他の方法(例えば例外処理)を検討するべきです。
 
;例:<syntaxhighlight lang=php line>
;学習者への注意
今後は上記のような未定義での変数の使用法は、ひかえるべきです。初心者は、わざわざ非推奨の未定義変数の利用をする必要がありません。
 
PHPの過去バージョンで、未定義変数の利用が昔は非推奨でなかった頃がありました。そのような古いバージョンとの動作互換性を当面のあいだは残しておくためなどの理由で、現状のPHP8ではまだ動作するだけにすぎないでしょう。
 
今後のバージョン(PHP9以降)では、もしかしたら動作すらできずにエラーになる可能性すらありえます。
 
通知(PHP7以前)→警告(PHP8) と、どんどんと非推奨のレベルが上がっているので、この調子で非推奨のレベルが上がっていくと、いつかは使用不可能のエラーになる可能性があります。
 
なので初心者は、未定義変数の利用を控えましょう。今から学習を始める初心者が、わざわざ非推奨の方法を使う必要はないのです。
 
 
なお、表示出力以外の構文や関数でも同様に、未定義変数を未定義のままで構文または関数で参照すると警告文が出ます。
 
 
なお、下記コードのように変数の前に<code>@</code> アットマーク をつけることで、警告文などを非表示にすることができますが、これは単に非表示になっただけに過ぎず、大本のPHP本体の開発陣たちが未定義変数を非推奨にしていく開発方針の流れ自体は変わらないので、警告メッセージから目を背けるのではなく、変数の定義をするなどの対応をしておきましょう。なお、このようなPHPのアットマークの機能のことを「エラー制御演算子」といいます。
 
:<syntaxhighlight lang=php>
<?php
$body = file ('/noexist') or print __LINE__ . ":" . error_get_last()['message'] . PHP_EOL;
print @$w; // これ以前のどこでも$wを定義していない
$body = @file ('/noexist') or print __LINE__ . ":" . error_get_last()['message'] . PHP_EOL;
$d = @$w;
</syntaxhighlight>
print "hello";
;実行結果:<syntaxhighlight lang=text>
?>
PHP Warning: file(/noexist): Failed to open stream: No such file or directory in /workspace/Main.php on line 2
2:file(/noexist): Failed to open stream: No such file or directory
3:file(/noexist): Failed to open stream: No such file or directory
</syntaxhighlight>
 
非表示の機能を実務で使うとするならば、たとえば、すでに過去バージョンで大きなプログラムを作ってしまった人が、他のエラーメッセージを発見しやすくするために原因の分かっている警告を非表示にするなどの用途に限定されるべきです。
 
なお、webブラウザで閲覧している場合には、ブラウザのログ画面を見ない限りは、一般にエラーメッセージや警告メッセージなどは出ません。なので、エラーの許されない厳しいプログラムを作る場合は、ブラウザだけでなく、コンソール端末でも動作を確認しましょう。
 
 
[[Category:PHP|にゆうもんへん]]