PHP基礎（備忘録）

## はじめに
PHPでの学習を始めてひと段落したため、PHP基礎についてまとめてみました。
PHPの簡単な使い方や索引のように活用してもらえると幸いです！
（PHP環境：Version 8.3.1）

ローカル開発環境の構築方法が分からない方は以下の記事を参考に構築してみてださい！

https://qiita.com/NEXTTECHNOLOGY-432/items/a6bbc60c2343690c784b

## 目次
1. [変数宣言](#変数宣言)
2. [文字列操作](#文字列操作)
3. [データ型](#データ型)
4. [条件分岐](#条件分岐)
5. [配列](#配列)
6. [関数](#関数)
7. [さいごに](#さいごに)
8. [参考文献](#参考文献)

## 変数宣言
PHPはインタプリタ言語（動的言語）で、静的型付け言語と違い、事前に変数宣言の際にデータ型を定義しなくてもよい言語になります。

```php:sample.php
<?php
    $name = 'hoge';
    echo 'hello, ' . $name;
?>
```
上記のコードでは変数 __$name__ に「hoge」が入り、
「echo」によって画面に「 __hello, hoge__ 」と出力されるようになります。

## 文字列操作
シングルクォーテーション「'」とダブルクォーテーション「"」では囲まれた範囲を文字列として扱いますが、文字列の取り扱い方が変わります。
シングルクォーテーション「'」では囲まれた範囲がすべて文字列として認識されます。
ダブルクォーテーション「"」では囲まれた範囲に変数を入れて変数の値を出力することができます。
```php:sample.php
<?php
    $name = 'hoge';
    echo "hello, $name";
?>
```
出力：hello, hoge

文字の間に変数を入れて表示したい場合は波括弧「{}」で囲みます。
```php:sample.php
<?php
    $obj = 'りんご';
    echo "私は{$obj}が好きです。";
?>
```
出力：私はりんごが好きです。

## データ型
データ型の確認方法は __var_dump()__ を使用して確認できます。 
```php:sample.php
<?php
    $a = 1;
    $b = true;
    $c = 'hello';
    var_dump($a);
    echo '<br>';
    var_dump($b);
    echo '<br>';
    var_dump($c);
    echo '<br>';
    echo $a + $b;
?>
```
出力結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050071/9c81547a-1109-49cf-866b-946ccbdbe268.png)

PHPでは内部的に「true」が数値の「1」、「false」が「0」として取り扱われます。
```php:sample.php
echo $a + $b
```
上記のコードのように異なる型を計算した場合には、自動的に片方の型に統一されて計算結果が表示されます。
自動的に変換されるため、あまり意識する必要はありませんが、思わぬバグの発生を引き起こす可能性が高いため、PHPの内部ではこのような挙動をとるということは覚えておくと良いでしょう。

## 条件分岐
基本的な条件分岐は以下のように書きます。
```php:sample.php
if(true){
    //何かしらの処理
}else if(true){
    //何かしらの処理
}else{
    //何かしらの処理
}
```
if文の評価式の中で「===」「==」を使って値が一致しているかを確認する処理をよく使いますが、この演算子を記載する際は少し注意が必要です。

「===」はデータ型も確認しますが、「==」データ型は確認しません。
なるべく「===」を使ったほうが意図せぬバグを防げます。
```php:sample.php
<?php
    $num = 1; // 数値の1
    if ($num === "1") {
        echo "変数の中身とデータ型は一致しています。";
    } else if ($num == "1") {
        echo "変数の中身とデータ型は一致していませんが、値は一致しています。";
    } else {
        echo "値が一致していません";
    }
?>
```
出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050071/0d6a2861-5cf8-4c06-9d6e-531cd6b961d5.png)

## 配列
配列の変数宣言と画面への出力は以下のように実施します。
```php:sample.php
<?php
    $array = ["apple", "banana", "orange"];
    
    echo "for文で表示<br>";
    for ($i = 0; $i < count($array); $i++) {
        echo $array[$i];
        echo "<br>";
    }
    
    array_push($array, "grape", "peach"); 
    // grape, peach を追加して中身は[apple,banana,orange,grape,peach]になる
    
    unset($array[2]); // 配列のインデックスを指定して要素（orange）を削除
    
    echo "foreachで表示<br>";
    
    foreach ($array as $ele) {
        echo $ele;
        echo "<br>";
    }
?>
```
配列を使用する際は多くの場合、その配列に対して何かしらの処理を行いたいケースが多いので、繰り返し処理をfor文とforeach文で記載しています。

画面表示の結果は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050071/59754ce7-6439-4e6d-b399-37947b63e23e.png)

要素の追加は __array_push($array, "value1", "value2")__ 、
要素の削除は __unset($array[~])__ や __array_splice($array, ~, ~)__ をよく使用します。

また、配列には __連想配列__ という、keyとvalueが対になって格納されている配列も存在します。
```php:sample.php
<?php
    $array = [
        'name' => 'hoge',
        'age' => 20,
        'hobby' => ['baseball', 'soccer', 'cooking', 'games'],
    ];
    
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            echo $key . ': ';
            foreach ($value as $v) {
                echo $v . ', ';
            }
            echo '<br>';
        } else {
            echo $key . ': ' . $value . '<br>';
        }
    }
?>
```
上記のサンプルコードの出力は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050071/a18094a9-f0f2-4bb1-ab1f-be9b212738d9.png)

for文でもkeyとvalueを出力することは可能ですが、配列のキーを取得するために __array_keys__ 関数を使用する必要があり、foreach文を使うよりも以下のように少し冗長なコードになります。
```php:sample.php
<?php
    $array = [
        'name' => 'hoge',
        'age' => 20,
        'hobby' => ['baseball', 'soccer', 'cooking', 'games'],
    ];
    
    $keys = array_keys($array); // 配列のキーを取得
    
    for ($i = 0; $i < count($keys); $i++) {
        $key = $keys[$i];
        $value = $array[$key];
    
        if (is_array($value)) {
            echo $key . ': ';
            foreach ($value as $v) {
                echo $v . ', ';
            }
            echo '<br>';
        } else {
            echo $key . ': ' . $value . '<br>';
        }
    }
?>
```
画面への出力は両者ともに変わりません。

## 関数
特定の機能を使いまわせるようにまとめたものを関数といいます。
関数を使うには引数（Input）と戻り値（返り値とも言います）（Output）を設定する必要があります。

```php:sample.php
<?php
    $numbers = [1, 2, 3, 4];
    $numbers2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    
    function sum($nums) // 引数を受け取る（引数の名前は呼び出し元「numbers,numbers2」と一致していなくても良い）
    {
        $sum = 0;
        foreach ($nums as $num) {
            $sum += $num;
        }
        return $sum; // 戻り値を設定
    }
    
    $result = sum($numbers);
    echo "合計：{$result}<br>";
    $result2 = sum($numbers2);
    echo "合計：{$result2}<br>";
?>
```
上記のサンプルコードの出力は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050071/1569b40e-70bf-4dd4-85bb-f9bf46a4c462.png)

また、関数にはデフォルトで引数を設定することも可能です。
デフォルト引数とは、関数を呼び出す際に引数が渡されなかった場合に、あらかじめ設定された値を使用する仕組みです。
```php:sample.php
<?php
    $apple_price = 100; // リンゴの原価
    $orange_price = 100; // オレンジの原価
    
    function with_tax($origin_price, $tax_rate = 0.1)
    {
        // 原価 + 消費税
        $sum_price = $origin_price + ($origin_price * $tax_rate);
        // round()は、PHPの組み込み関数で、数値を四捨五入するための関数
        $sum_price = round($sum_price);
        return $sum_price;
    }
    
    $price = with_tax($apple_price, 0.08); // 引数あり（0.08で計算）
    
    echo "リンゴの値段（引数ありで計算 0.08）：" . $price . "<br>"; // リンゴの値段が出力される
    
    $price = with_tax($orange_price); // 引数なし（0.1で計算）
    
    echo "オレンジの値段（デフォルト引数で計算 0.1）：" . $price; // オレンジの値段が出力される
?>
```
上記のサンプルコードの出力は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050071/4477632d-1ae0-4aea-8449-e1288ab7227b.png)

## さいごに
以上がPHPの基礎文法のご紹介となります。

初学者の方やPHPから離れていて学び直したいという方々の手助けになれば幸いです！

特にPHPの内部で動く仕組みで、true, falseがそれぞれ1, 0として扱われる個所など、私自身、実際の実務の現場で記載する場面がありましたので注意することができました。
（CSVファイルの読み込み処理で遭遇しました）

同じように豆知識や指摘等ありましたらコメントいただけますと幸いです！

## 参考文献
https://www.sejuku.net/blog/107646

https://www.php-factory.net/aboutphp/01.php

https://qiita.com/konojunya/items/492e8114e6bd55344731#%E9%80%A3%E6%83%B3%E9%85%8D%E5%88%97

https://qiita.com/NEXTTECHNOLOGY-432/items/a6bbc60c2343690c784b