PHPの基礎をまとめてみた

2024/10/09に公開

ゴール:PHPの基礎を復習する

コーディングテストでAIの力を借りずにコードを書いた時に、基礎を忘れているところが多かったので 復習してみました。

やってみた結果

毎回ググっていたようなことを復習できたので、今後はググる必要がなくなって効率上がりそうな気がしています。

やったこと

PHP本格入門(上)のPHPの基礎を復習しました。

PHPで扱えるデータ型

よく使っているけど、忘れがちなデータ型をまとめておきます。

型のカテゴリ 型の種類 説明
スカラー型 論理型 true または false の値を持つ。条件分岐や論理演算で使用される。
スカラー型 整数型 整数(例: 1, 100, -50 など)を表す。四則演算やカウンタとして使用。
スカラー型 浮動小数点型 小数(例: 3.14, -0.001 など)を表す。科学計算や精密な数値計算で使用。
スカラー型 文字列型 テキスト(例: "Hello", "PHP")を扱う。文字や単語、文章を保存。
複合型 配列型 複数の値を一つの変数にまとめて扱う。インデックス付きで複数のデータを格納可能。
複合型 オブジェクト型 データとその処理を一つにまとめた構造。クラスのインスタンスとして作成され、プロパティやメソッドを持つ。
特殊型 リソース型 外部リソース(ファイル、データベース接続など)を参照する。リソースを操作するための識別子。
特殊型 ヌル型 変数に値が設定されていない、もしくは「無」を表す。nullを用いて明示的に設定される。

文字列連結

$value = "Hello";
//文字列演算子
$combine = $value . "World";
//変数の展開、ダブルクウォート内で使用可能
$combine2 = "{$value} World";
//代入演算子(=)と文字列演算子(.)の組み合わせ
$combine3 = "Hello";
$combine3 .= "World";

改行

PHPの実行環境によって、WindowsかMacの改行コードを自動で切り替えてくれる

$value =  "Hello" . PHP_EOL

型変換

指数表記のままでは演算ができないので、数値に変換する必要がある
「0.12345」は指数表記で「1.2345E-1」になり、これが文字列型の場合は計算できないので型変換を行う必要がある。

(int)$val; //型キャストで変換
intval($val); //関数で変換

//999.9を整数に直すと、1000ではなく999になるため、四捨五入の関数などを使用する必要がある
round() //四捨五入
ceil() //切り上げ
floor() //切り捨て

論理型への変換は結構ややこしいので、以下で覚える。

0,null,空文字 → falseに変換される
それ以外は全て → trueに変換させる

配列操作

配列の値は、要素と呼ぶ
配列には0から始まるキーが振られる。
キーの番号を指定することで要素にアクセスすることができる

$airports = ['Haneda','Narita','Chubu']; //配列の定義
$airports[] = 'Kansai'; //配列に追加
$airports[1] = 'Naha'; //NaritaがNahaに上書きされる

配列のキーにラベルをつけた配列のことを連想配列と呼ぶ

$user = [
    'name' => '田中太郎',
    'age' => 18,
    'tel' => 08012345678,
];
$user['job'] = 'エンジニア'; //職業を追加

PHPからすると配列と連想配列は、キーが数字か文字列を使用しているかの違いだけで、同じものとして認識している。

どう使い分けるか?

配列 → 同じ種類の値を順番に管理したいときに使う(ユーザーの住所のみ)
連想配列 → 関連するが属性の異なる値を管理する時に使う(ユーザーの情報全て)

多次元配列とは?

ネスト化された配列のこと。
配列の中に連想配列を入れるのがよく使用される。

$airports = [
    [
        'name' => '羽田',
        'address' => '東京都大田区',
    ],
    [
        'name' => '成田',
        'address' => '千葉県成田市',
    ],
];
//空港を追加
$airports[] =
    [
        'name' => '関西国際',
        'address' => '大阪府泉佐野市',
    ];

定数

値に人間的な意味を持たせることができる。
値を共通化できて変更に強い。
例えば消費税を個別に書いていたら、税率が上がった時にそれぞれのファイルを変更しないといけないが、定数で管理をしておくと一箇所だけ変更するだけで良い。

define('TAX_PERCENT', 0.08);
echo 100 * TAX_PERCENT; //定数名で呼び出す

演算子

四則演算

演算子 演算の種類 結果
+ 加算 5 + 3 8
- 減算 5 - 3 2
* 乗算 5 * 3 15
/ 除算 6 / 3 2
% 剰余 5 % 3 2
** 累乗 2 ** 3 8

複合演算子

演算子 説明 結果
+= 加算して代入 $a += 5; $a = $a + 5
-= 減算して代入 $a -= 5; $a = $a - 5
*= 乗算して代入 $a *= 5; $a = $a * 5
/= 除算して代入 $a /= 5; $a = $a / 5
%= 剰余算して代入 $a %= 5; $a = $a % 5
**= 累乗して代入 $a **= 2; $a = $a ** 2
.= 文字列を結合して代入 $a .= 'world'; $a = $a . 'world'

比較演算子

演算子 記述例 意味
== a == b bとaの値が等しい
=== a === b bとaの値が等しく型も等しい
!= a != b bとaの値が等しくない
<> a <> b bとaの値が等しくない
!== a !== b bとaの値または型が等しくない
> a > b bよりaが大きい
>= a >= b bよりaが大きいか等しい
< a < b bよりaが小さい
<= a <= b bよりaが小さいか等しい

三項演算子

[比較条件] ? [条件に一致した場合] : [一致しなかった場合]

//0より小さければ0をそれ以外は変数の値を表示
$a = -100;
echo $a < 0 ? 0 : $a;
//こういう使い方も多い
$a = 'test';
echo !empty($a) ? $a : '値が入力されていません。';

null合体演算子

[nullであるか調べたい変数] ?? [nullだった場合の値];

$a = null;
echo $a ?? 'nullです';
結果:nullです
$a = 'testMessage';
echo $a ?? 'nullです';
結果:testMessage

論理演算子

演算子 説明 結果
&& AND(かつ) $a && $b 両方が真なら真
` ` OR(または)
! NOT(否定) !$a $a が真なら偽、偽なら真
and AND(かつ) $a and $b 両方が真なら真
or OR(または) $a or $b どちらかが真なら真
xor XOR(排他的論理和) $a xor $b 片方のみが真なら真
$a = true;
$b = false;
$result1 = $a && $b;  // false(両方が真でないため)
$result2 = $a || $b;  // true(片方が真なので)
$result3 = !$a;       // false($aはtrueなので、否定するとfalse)
$result4 = $a xor $b; // true(片方が真で片方が偽のため)

複雑な条件式での組み合わせ

$a = true;
$b = false;
$c = true;

if ($a && ($b || $c)) {
    echo "条件は true です。"; // こちらが出力されます
}

&&と||では&&の方が優先される

//この場合は&&の方から先に実行される
if ($a || $b && $c){}

//カッコをつけると、||が優先される
if (($a || $b) && $c){}

フォームでNULLと空文字を判別する

$value = null;
if (is_null($value) || $value == '') {
	echo '変数は空からです。' . PHP_EOL;
}else {
	echo '変数は空ではありません。' . PHP_EOL;
}

インクリメント(++)とデクリメント(--)

足し算か引き算を使う時の省略記法のこと。

演算子 演算の種類 結果
++ インクリメント a = 5; a++ a6 になる
-- デクリメント a = 5; a-- a4 になる
++ 前置インクリメント a = 5; ++a a が先に増えて 6
-- 前置デクリメント a = 5; --a a が先に減って 4
++ 後置インクリメント a = 5; a++ a が後で 6 になる
-- 後置デクリメント a = 5; a-- a が後で 4 になる
$a = 5;
echo $a++;  // 5 (インクリメントは後で行われる)
echo $a;    // 6 (インクリメント後の結果)
$b = 5;
echo ++$b;  // 6 (インクリメントが先に行われる)

配列を合成する2つの方法

+array_mergeがあり、以下の特徴がある。

機能 array_merge() + 演算子
数値キーの処理 数値キーは無視され、新しいインデックスが付与 数値キーはそのまま保持
文字列キーの重複処理 後の配列の値が優先される 最初の配列の値が優先される
結果 配列のすべての要素を結合 最初の配列をベースに、後の配列を補完する

array_mergeの例:

$array1 = [0 => 'a', 1 => 'b', 2 => 'c'];
$array2 = [0 => 'd', 1 => 'e', 2 => 'f'];
$result = array_merge($array1, $array2);
print_r($result);
結果
Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
    [4] => e
    [5] => f
)

キーが重複している時は後勝ち

$array1 = ['a' => 'apple', 'b' => 'banana'];
$array2 = ['b' => 'blueberry', 'c' => 'cherry'];

$result = array_merge($array1, $array2);
print_r($result);
結果
Array
(
    [a] => apple
    [b] => blueberry
    [c] => cherry
)

+演算子の例:

$array1 = [0 => 'a', 1 => 'b', 2 => 'c'];
$array2 = [0 => 'd', 1 => 'e', 2 => 'f'];
$result = $array1 + $array2;
print_r($result);
結果
Array
(
    [0] => a
    [1] => b
    [2] => c
)

キーが重複している時は先勝ち

$array1 = ['a' => 'apple', 'b' => 'banana'];
$array2 = ['b' => 'blueberry', 'c' => 'cherry'];

$result = $array1 + $array2;
print_r($result);
結果
Array
(
    [a] => apple
    [b] => banana
    [c] => cherry
)

参照渡し(リファレンス渡し)

変数の実際の値ではなく、その変数が格納されているメモリのアドレス(参照)を渡す方法です。参照渡しを使うことで、関数に渡した引数の値を関数内で変更しても元の変数に影響を与えることができる。

function increaseValue(&$value) {
    $value += 10;
}
$number = 5;
increaseValue($number); // 参照渡しで$numberが渡される
//戻り値を受け取っていなくても値が変更されている
echo $number;  // 結果: 15

参照渡しを使わない例(値渡し)

function increaseValue($value) {
    $value += 10;
}
$number = 5;
increaseValue($number);  // 値渡しで$numberのコピーが渡される
echo $number;  // 結果: 5

条件分岐

ある条件にマッチした時と、そうではない時に条件を変えて実行するプログラムをコントロールする処理のこと。

$score = 80;
if ($score < 90) {
    echo "ハイスコアです。";
}else if ($score < 60) {
    echo "ミドルスコアです。";
}else {
    echo "通常スコアです。";
};
結果 ミドルスコアです

switch分の方が見やすい場合も多い

$score = 80;
switch ($score) {
	case 90:
        echo "ハイスコアです。";
		break;
	case 50: //OR条件と一緒
	case 60:
        echo "ミドルスコアです。";
		break; //breakを書かないと次の処理に入るので気を付ける
	default:
        echo "通常スコアです。"; // どれにも当てはまらない場合の処理
		break;
}

ループ処理

for文(あらかじめ定めた回数分をループ)

//構文
for (初期値; 条件; 増分/減分) {
    // 繰り返し処理
}

for ($i = 0; $i < 5; $i++) {
    echo $i . " ";
}
結果 0 1 2 3 4

while(ある条件を満たす限りループ)

//構文
while (条件) {
    // 繰り返し処理
}

$i = 0;
while ($i < 5) {
    echo $i . " ";
    $i++;
}
結果 0 1 2 3 4

foreach(配列/連想配列の全要素をループ)

foreach ($配列 as $キー => $値) {
    // 繰り返し処理
}

$fruits = ["apple", "banana", "cherry"];
foreach ($fruits as $fruit) {
    echo $fruit . " ";
}
結果 apple banana cherry
//foreach ではキーと値の両方を取得することもできる。
$fruits = ["a" => "apple", "b" => "banana", "c" => "cherry"];
foreach ($fruits as $key => $fruit) {
    echo "$key: $fruit ";
}
結果 a: apple b: banana c: cherry

breakの使い方

$fruits = ["apple", "banana", "cherry", "date"];

foreach ($fruits as $fruit) {
    if ($fruit == "banana") {
        break;  // "banana" に達したらループを終了
    }
    echo $fruit . " ";
}
結果 apple

continueの使い方

$fruits = ["apple", "banana", "cherry", "date"];

foreach ($fruits as $fruit) {
    if ($fruit == "banana") {
        continue;  // "banana" をスキップして次のループへ
    }
    echo $fruit . " ";
}
結果 apple cherry date

おわりに

これまで忘れた時にググって、タブが大変な事になることが多かったので、一つにまとめられたのは良かったと思う。
なんだかんだ基礎が一番重要だと思うので、この機会に復習できて良かったです。

Discussion