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

削除された内容 追加された内容
→‎未定義変数: なお、webブラウザで閲覧している場合には、ブラウザのログ画面を見ない限りは、一般にエラーメッセージや警告メッセージなどは出ません。
Ef3 (トーク | 投稿記録)
→‎readonlyプロパティ: const と似た仕組みに、PHP 8.1.0 以降のクラスのプロパティのreadonly修飾子があります。 ただし、readonly修飾子はプロパティにしか使えません。 また、クラスはクラススコープの定数「クラス定数」を定義することができます。 「PHP/クラス#コンストラクターとreadonlyプロパティ」および「PHP/クラス#クラス変数とクラス定数」を参照
タグ: 2017年版ソースエディター
290 行
 
== 定数 ==
PHPには、$で始まる変数とは別に、イミュータブルなオブジェクト=定数を宣言することができます。
変数の宣言時に const キーワードをつけると、書き換えを禁止できます。const 宣言の際、変数名の冒頭に「$」はつけません。$をつけてもエラーになります。
 
;[https://paiza.io/projects/sjCA27ERj4YfyATgn3AqQQ?language=php 例]:<syntaxhighlight lang=php line>
 
<syntaxhighlight lang="PHP">
<?php
const a = 9942;
 
printecho "a .= "\n", a , PHP_EOL;
?>
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
 
$a = 40;42
;実行結果
</syntaxhighlight>
<pre>
:定数は変数と違い $ を前置しません。
99
;定数への代入(エラーになります):<syntaxhighlight lang=php line>
</pre>
 
 
では、実際に変数の書き換えをしてみて、エラーになるか確認しましょう。
 
 
<syntaxhighlight lang="PHP">
<?php
const a = 99;
 
printecho "a .= "\n", a , PHP_EOL;
 
$a = 4010;
// ここで定数だと忘れて、変数のように定義したしまったとする
$a = 40;
print $a . "\n";
?>
</syntaxhighlight>
;エラー:<syntaxhighlight lang="PHP"text>
 
PHP Parse error: syntax error, unexpected token "=" in /workspace/Main.php on line 6
;実行結果
<pre>
99
40
</pre>
 
上記コードのようなミスの場合、予想に反してエラーになりません。
 
定数「a」とは別に、変数「$a」が確保されてしまうだけです。思わぬバグにつながりかねません。PHPの定数はあまり信用しないほうが無難でしょう。
 
 
PHPはdefineという組み込み関数でも定数を宣言できますが、間違えて$a的に書き換えた場合はconst同様の問題が置きます。
 
 
<syntaxhighlight lang="PHP">
<?php
define("a" , 99);
 
print a . "\n";
 
$a = 40;
print $a . "\n";
?>
</syntaxhighlight>
: このように、定数への代入はパース時に構文エラーになります。
: また変数と定数は名前空間が異なるので、同じ名前の変数と定数があっても問題ありません。
 
=== define()は使うべきではない ===
;実行結果
組込み関数 define() を使っても定義できますが
<pre>
* キーワードも定数として定義できてしまう
99
* 大文字小文字を区別しない定数が定義できてしまう
40
*: PHP 8.0.0 以降では無効。この機能を使っていたプログラムはPHP 8.0.0 以降では動きません。
</pre>
* const 宣言と機能が重複する
 
というバグ級の仕様上の問題があります。
 
define()は使うべきではありません。
そのほか、クラスのほうの機能でPHP8.1からreadonlyプロパティという書き換え禁止の機能がありますが、しかしクラスでない通常変数の定義ではreadonly の利用は不可能です。
 
=== readonlyプロパティ ===
[https://www.php.net/manual/ja/language.oop5.properties.php PHP: プロパティ - Manual] (2022年6月14日に確認)を参考に、クラス外部で無理やり
const と似た仕組みに、PHP 8.1.0 以降のクラスのプロパティのreadonly修飾子があります。
readonly int $var10;
ただし、readonly修飾子はプロパティにしか使えません。
とか宣言してみても
Parse error: syntax error, unexpected identifier "int", expecting "abstract" or "final" or "readonly" or "class" in /home/sujiniku/test.php on line 2
 
また、クラスはクラススコープの定数「クラス定数」を定義することができます。
などのエラーが出るだけです。
 
{{See|PHP/クラス#コンストラクターとreadonlyプロパティ|PHP/クラス#クラス変数とクラス定数}}
なお、クラス内部で同様の記述をしてもPHP8.2ではエラーになります。公式マニュアルの仕様が古いようです。
 
== その他 ==