【PHP復習】基本構文の確認

# 基本のおさらい

最近はSQLを中心に勉強しているが、新しい知識が増えた分、過去に身につけた知識を忘れてしまっている気がする今日この頃。PHP、Ruby、JavaScript等々・・・。

そのため、過去に学んだことを大まかにでも思い出せるように、備忘録として残すことにする。今回はPHP。

扱う内容は、過去に``JavaScript``について書いた記事と同じだ。
[【JavaScript】１日で基本を学ぶ〜前編](https://qiita.com/33yuki/items/b884252f35768e54440a)

# PHPのバージョン

PHP(7.1.17) 

# 基本事項

## 対話シェル

``php -a``で``対話シェル``を起動できる。PHPのコードをその場で実行できるので便利だ。終了するときは``exit``を入力する。

```php
$ php -a
Interactive shell

php > echo 1+1;
2
```

公式サイトはこちらから。
[PHP公式サイト：対話シェル](http://php.net/manual/ja/features.commandline.interactive.php)

## echoとprintの違い

同じように使用されがちだが、違いがあるようだ。

詳しい内容はこちらの記事がわかりやすかった。
[PHP の echo と print のちがいと使いどころ](https://gotohayato.com/content/47)

### echo

- 文であり、値を返さない。
- 複数の文字列を出力できる。（例：echo "aaa","bbb";）

### print

- 式であり、値を返す。（常に1(=TRUE)を返す。）よって、if文などの条件式に組み込むことができる。
- 複数の文字列を出力できない。

## 変数

PHPの場合、変数の宣言をする必要がない。始めから値を代入して使用できる。

あと、最初に``$``を付けること！

```php
php > $test = "aaaaa";

php > echo $test;
aaaaa

php > $test = "bbbbb";

php > echo $test;
bbbbb
```

## 文字列の結合

数字と文字をつなぐと、全て文字列（string型）の扱いとなる。変数同士の結合も可能だ。

``var_dump()``は、``引数に指定した変数や配列の構造に関する情報を提供してくれる関数``だ。重宝している。

```php
php > echo "ようこそ"."PHPの世界へ！";
ようこそPHPの世界へ！

php > $test = "aaaaa";

php > $test_2 = $test."12345";

php > echo $test_2;
aaaaa12345

php > var_dump($test_2);
string(10) "aaaaa12345"
```

## 改行（特殊文字）

``\n``で改行できる。

```php
php > echo "ようこそ\nPHPの世界へ！";
ようこそ
PHPの世界へ！
```

## 配列

配列も変数と同様に定義できる。公式サイトでは``array``を表記した構文が紹介されているが、どちらが良いのだろうか・・・。以下の記述は``短縮構文``と呼ばれている書き方だ。

配列の要素数の取得は、``count関数``で行っている。

```php
php > $country = ["日本", "アメリカ", "中国"];

php > echo $country[0];
日本

php > echo $country[1];
アメリカ

php > echo $country[2];
中国

php > echo count($country);
3

php > var_dump($country);
array(3) {
  [0]=>
  string(6) "日本"
  [1]=>
  string(12) "アメリカ"
  [2]=>
  string(6) "中国"
}
```

# 制御文

一つのプログラム言語を経験していれば、書き方が異なるだけでさほど大きな違いはない。構文そのものというより、処理の流れを理解する方が重要だと思う。他言語でも十分応用が効く。

以下のコードは、``code_gameディレクトリ``に作成した``test.phpファイル``に記述している。Macを使用している場合は、ターミナルで該当ファイルが保存されているディレクトリまで移動し、``php ファイル名``を実行すれば各コードのテストが可能だ。

公式サイトはこちらから。
[PHP公式サイト：制御構造](http://php.net/manual/ja/language.control-structures.php)

## if文

``fgets(STDIN)``により``標準入力``の内容を受け取り、``trim関数``で空白があればそれを削除する。

その後、``型キャスト``により、``入力値を数値に変換``している。

```test.php
<?php
echo "現在の所持金はどのくらい？\n";
$money = trim(fgets(STDIN));
$money = (int) $money;

if ($money >= 10000) {
    echo "次の給料日までしのげるぞ！\n";
} elseif ($money < 10000 && $money >= 5000) {
    echo "節約しよう！\n";
} elseif ($money < 5000 && $money >= 3000) {
    echo "ちょっとやばい？\n";
} else {
    echo "毎日もやし・・・\n";
}
```

## 三項演算子

if文の条件や結果となる値が簡単なものであれば、``三項演算子``で記述することもできる。

通常のif文の方が見やすい気がする・・・。

```test.php
<?php
echo "現在の所持金はどのくらい？\n";
$money = trim(fgets(STDIN));
$money = (int) $money;

echo ($money >= 10000) ? "次の給料日までしのげるぞ！\n" : "毎日もやし・・・\n";
```

## switch文

```test.php
<?php
echo "今の気分は？\n\n1:最高\n2:普通\n3:最悪\n";
$heart = trim(fgets(STDIN));
$heart = (int)$heart;

switch ($heart) {
    case 1:
        echo "よかったね！\n";
        break;
    case 2:
        echo "こんなもんだよね！\n";
        break;
    case 3:
        echo "早く寝て忘れましょ！\n";
        break;
    default:
        echo "1から3までの数字を入力してね！\n";
}
```

## for文

```test.php
<?php
for ($i = 1; $i <=10; $i++) {
    echo $i."回目の繰り返しです！\n";
}
```

## while文

``無限ループ``に陥らないように、必ず終了条件を記述すること！

```test.php
<?php
$number = 1;
while ($number <= 10) {
    if ($number % 2 == 0) {
        echo $number."は偶数です\n";
    } else {
        echo $number."は奇数です\n";
    }
    $number ++;
}
```

### 条件が偽でも最低1回は処理を行いたい場合

上記のwhile文では、条件が偽の場合は一度も処理が実行されない。最低1回は処理を行いたい場合は、``do...while文``で処理を先に記述する。

```test.php
<?php
$number = 1;
do {
    echo $number."\n";
} while ($number > 10);
```

### break文

下記のbreak文では、numberが2になった時点でwhile文の処理が終了する。

```test.php
<?php
$number = 1;
while ($number <= 10) {
    if ($number % 2 == 0) {
        break;
    } else {
        echo $number."は奇数です\n";
    }
    $number ++;
}
```

### continue文

上記のbreak文と``number ++;``の位置が異なる。無限ループの罠にハマらないように注意。

```test.php
<?php
$number = 0;
while ($number <= 10) {
    $number ++;
    if ($number % 2 == 0) {
        continue;
    } else {
        echo $number."は奇数です\n";
    }
}
```

# 関数

前回のJavaScriptと同じく、月収を入力し、そこから年収を計算するプログラムを書いてみた。

JavaScriptと比較して、グローバル変数・ローカル変数・引数の扱いで少し戸惑った。以下に２種類の記述法を掲載したので、参考になれば。

## 引数を取る場合

各関数を``calIncome関数``でくくり、1回の呼び出しで処理を終了させる。ここでは、``ネスト（入れ子）``している関数全てに標準入力で得た``$monthly_income``を引数として指定している。

``global宣言``で``$monthly_income``を使用できないか試してみたが、``calIncome関数内で取得した変数``は、ネストされている関数内で使用することができなかった。

```test.php
<?php
calIncome();

function calIncome()
{
    echo "現在の月収はいくら？\n";
    $monthly_income = trim(fgets(STDIN));
    $monthly_income = (int)$monthly_income;

    function annualIncome($monthly_income)
    {
        $annual_income = $monthly_income * 12;
        return $annual_income;
    }

    function bonus($monthly_income)
    {
        $bonus = $monthly_income * 1.5 * 2;
        return $bonus;
    }

    function totalIncome($monthly_income)
    {
        $total_income = annualIncome($monthly_income) + bonus($monthly_income);
        return $total_income;
    }

    echo "あなたの年収は".totalIncome($monthly_income)."円です！\n";
}
```

## グローバル変数を使用する場合

``calIncome関数``の外側で、標準入力により``$monthly_income``を取得している。

この場合、ネストしている関数内で``global宣言``をすることにより、``$monthly_income``が使用可能となる。

```test.php
<?php
echo "現在の月収はいくら？\n";
$monthly_income = trim(fgets(STDIN));
$monthly_income = (int)$monthly_income;

calIncome();

function calIncome()
{
    function annualIncome()
    {
        global $monthly_income;
        $annual_income = $monthly_income * 12;
        return $annual_income;
    }

    function bonus()
    {
        global $monthly_income;
        $bonus = $monthly_income * 1.5 * 2;
        return $bonus;
    }

    function totalIncome()
    {
        $total_income = annualIncome() + bonus();
        return $total_income;
    }

    echo "あなたの年収は".totalIncome()."円です！\n";
}
```

どちらの方法が良いのだろうか？調べた限りではグローバル変数の使用はあまり奨励されていなかったので、前者の方法が無難かもしれない。

# おわりに

関数の構造がJavaScriptとかなり異なっていた。しかし、それ以外の構文についてはそれほど違いを感じなかった。

今度はRubyで同様の記事を書きたい。たま〜に別の分野を勉強するのは、息抜きや刺激にもなる。今までとは違う視点も持てるかも？

今回はここまで。