【PHP入門講座】 変数と定数

**【2021/10/15 追記】**
**この記事は更新が停止されています。<font color="red">PHP を分かった気になって書いていた不正確な内容が多いため，過去の情報として参考程度にご覧ください。</font>また，完成にたどり着けなかったことをお詫びします。原則的には，[公式マニュアル](https://www.php.net/manual/ja/index.php)の参照をおすすめします。**


### [目次に戻る](http://qiita.com/mpyw/items/752e19a578cf7d96fc5f)

# 変数(variable)

## 変数って何？

**値を一時的に記録しておくための箱** だと思ってください。PHPでは全ての変数の頭には `$` 記号をつけるお約束になっています。代入演算子 `=` を用いて **右から左へ** 値を設定することが出来ます。例えば以下のような使い方が出来るでしょう。

```html+php:PHPコード
<?php
$var1 = 'Good Moring';
$state = 'I am awake';
$var2 = 'Good Afternoon';
$var3 = 'Good Night';
$state = 'I am sleeping';
?>
<p>State: <?php echo $state; ?></p>
<ul>
<li><?php echo $var1; ?></li>
<li><?php echo $var2; ?></li>
<li><?php echo $var3; ?></li>
</ul>
```

```html:実行結果
<p>State: I am sleeping</p>
<ul>
<li>Good Morning</li>
<li>Good Afternoon</li>
<li>Good Night</li>
</ul>
```

C言語など型制約の厳しい言語だけを経験してきた人から見ればすごく奇妙に思われるかもしれませんが、PHPでは<ins>変数宣言は必要ありません</ins>。いきなり代入して使うことが出来ます。

## 何かいきなり `' '` で括ったりしてるけどこれ何？

**文字列** であることを示す記号です。 コード中に登場するあらゆる文字列は `' '` **(シングルクオーテーション)** または `" "` **(ダブルクオーテーション)** で括られている必要があります。しかし、先ほどの

```php
<?php
echo 1 + 1;
```

の例ではそんなものはありませんでした。 これは `1` が文字列ではなく **整数** であるからです。整数を出力する際には、先ほど

> `echo` は指定したものを文字列として書き出す **（出力する）** 命令です。

と述べたように、文字列に変換されて出力が行われます。なお、出力を行わない段階での `1` と `'1'` は区別されます。前者は **整数型** 、後者は **文字列型** といいます。型については後々で詳しく説明しますので、ここではさらっと流してください。

## 変数名に使える文字は？

### OKな例

```
$abc
$_abc_
$abcABC012
$あいうえお
```

PHPで特別な意味を持つ文字でなければたいていどんな文字でも使えてしまいます。日本語も使えますが、一般的には用いられません。

### NGな例

```
$
$ a b c
$-abc-
$0abc
```

明らかにダメっぽいものばかりが並びますが、4つ目は何かOKっぽいですよね？しかし、<ins>数字で始まってはいけない</ins>という決まりがあるため、これはNGとなります。

### NGなはずなのに無理やりOKをもらってみた例

```
${''}
${'a b c'}
${'-abc-'}
${'0abc'}
```

`$` の直後に `{ }` を配置すれば、その中に<ins>どんな文字列でも書ける</ins>、という気持ち悪い特性を持っているのがPHPです。こんな例は他の言語ではあまり見ません。値を取得するときにも同じように書かないといけないため非常に煩わしく、PHPでもあまり用いられることはありません。

## 変数名をつけるときに気を付けることは？

### 意味が分かりやすいようにつける

- 変数 → `$var`
- 日付 → `$date`
- 結果 → `$result`

例外的に、何かを数えるときに `$i` `$j` `$k` を用いることは広く認められているようです。

### ローマ字読みをやめる
`$hensuu` `$hiduke` `$kekka` とか見ると何故か(私を含む)多くのプログラマが発狂しそうになるので是非とも控えてあげましょう。英語が苦手な人はもうちょっと勉強してください。

### 小文字のスネークケースで書く

```php:スネークケースの例
$the_pencil
$a_lot_of_pencils
```

蛇(Snake)のように長く繋がっていることからこう呼ばれます。

```php:キャメルケースの例
$thePencil
$aLotOfPencils
```

ラクダ(Camel)の瘤のように凹凸があることからこう呼ばれます。

PHPでは一般的に「変数」「関数」ではスネークケース、「プロパティ」「メソッド」ではキャメルケースが用いられる傾向にあります。「変数」以外に関しては後々触れることになります。とりあえず熟語を変数名にする際は、<ins>全て小文字でアンダーバーで単語をつなぐ</ins>ように心がけてください。

# 定数(constant)

## 定数って何？

**値を半永久的に記録しておくための箱** です。変数と違って、(そのコードの実行中は)一度定義した定数は変更することが出来ません。定数は(PHP5.3以降では) `const` キーワードを使って定義することが出来ます。

```html+php:PHPコード
<?php
const TEST = 'A';
const test = 'B';
?>
<ul>
<li><?php echo TEST ?></li>
<li><?php echo test; ?></li>
</ul>
```

```html:実行結果
<ul>
<li>A</li>
<li>B</li>
</ul>
```

定数

## 定数名に使える文字は？

### OKな例<br />NGな例

変数と全く同じです。

### NGなはずなのに無理やりOKをもらってみた例

PHPでは `const` キーワードに加えて `define` 関数が用意されています。PHP5.2以前では逆にこの方法しか使うことが出来ません。この関数を使えば、定数の命名制限を無視してどんな文字列でも設定することが出来ます。

```php
define('', 'A');
define('a b c', 'A');
define('-abc-', 'A');
define('0abc', 'A');
```

なお、このようにして無理やり作られた定数の値を取得するときには、 `constant` 関数を使う必要があります。

```php
echo constant('0abc');
```

## 定数名をつけるときに気を付けることは？

### 意味が分かりやすいようにつける<br />ローマ字読みをやめる

半永久的に使われ続けるので、変数以上によく検討してから名前を付けるようにしてください。

### 大文字のスネークケースで書く

```php:スネークケースの例
const SITE_NAME = 'Sample Site';
const SITE_URL = 'http://example.com/';
const SINCE = 2013;
```

<ins>定数名は全て大文字</ins>という慣習がありますので、原則的にはそれに従いましょう。

# その他

## `const` と `define` のどちらを使うべきか？

`define` にしか出来ないことがいくつかあります。

### その1. 動的に宣言する

```php:OKな例
define('ONE_PLUS_ONE', 1 + 1);
```

```php:NGな例
const ONE_PLUS_ONE = 1 + 1;
```

### その2. 大文字と小文字を区別しない宣言ができる

```php:constで大文字小文字を区別しない対応を強いられるとこうなる
const ab = 'A';
const aB = 'A';
const Ab = 'A';
const AB = 'A';
```

```php:defineならば第3引数にTrueを指定して1回で済ませられる
define('ab', 'A', true);
```

`const` で済むならそちらで済ませたほうが「定数らしく」はなるでしょう。

## 変数と定数の使い分けは？

### 格納できる値
- 変数<br />→ あらゆる値
- 定数<br />→ スカラー値(整数・文字列など)

### アクセスできる範囲
- 変数<br />→ 限られている
- 定数<br />→ どこからでもアクセスできる

### 後から変更可能か
- 変数<br />→ 変更可能
- 定数<br />→ 変更不能

基本的には変数を使い、スクリプト実行中に不変の **「サイト名」** などには定数を用いると良いでしょう。