MyDailyNotes
年別
2026年
3月 (3)
1月 (1)
2025年
カテゴリ
タグ
学習教材
© 2026 MyDailyNotes

2026/3/27 · 学習ログ

laravelの学習をする第1章

#IT#ホームラボ

laravelの学習をする第1章

0からAIと一緒にphp-laravelを学習する!
AIから課題を受けて公式のドキュメントなどを読みながらそれを進める
しかし課題のみで学習を進めるのが難しくなったため途中から学習教材の作成もAIに依頼した

私が使用した学習教材を以下に保存しました 課題のみの内容
https://mydailynotes.org/materials/php-laravel/step1-php-basic
詳細な説明を追加した内容
https://mydailynotes.org/materials/php-laravel/step1ext-php-basic

参考文献
公式ドキュメント:https://www.php.net/manual/ja/index.php

0.今回の目標:phpの基礎を理解する

laravelはphpのワークフレームらしいのでphpの基礎の学習をする
今回は変数、配列、ループ、関数、クラスを理解する
AI先生が言うには
LaravelはPHPで書かれています。Laravelのコードを読んだとき「これはPHPの何の機能か?」がわからないと、フレームワーク独自の問題なのかPHP自体の問題なのかを切り分けられません。
特に以下は Laravelのコード上で毎日目にします:
・配列操作(array_map / array_filter → コレクション操作に対応)
・クラス・インターフェース(コントローラー・モデルがすべてクラス)
・無名関数・アロー関数(ルーティングのクロージャ、コールバック)
・型宣言(Request / Response 等の型ヒント)
「PHPを学んだ後にLaravelを学ぶ」のではなく、「LaravelのためにPHPを学ぶ」という視点で読むと吸収が速くなります。
とのこと。

今回の作業ディレクトリ

/root/laravel/  
├── docker-compose.yml  
├── docker/  
│   ├── nginx/  
│   │   └── default.conf  
│   └── php/  
│       └── Dockerfile  
└── src/  
    └──practice ← これ  

実行方法はdockerを使用しているので以下のコマンドとなる

docker compose exec php bash -c "php /var/www/html/practice/ファイル名.php"

課題1:変数と型

課題内容

  • 1-1
    • 自分の名前を変数に入れ、こんにちは、○○さん と表示する
    • 整数と小数を変数に入れ、それらを足した結果を表示する
    • true か false の値を持つ変数を作り、var_dump() で表示する
  • 1-2
    • 文字列 "42" を整数に変換して表示する
    • 整数 0 を論理値(bool)に変換すると何になるか確認する
    • gettype() 関数を使って各変数の型を表示する

コード内容

<?php
$name = 'たろう';
$integer = 5;
$decimal = 0.5;
$boolean = TRUE;

echo "こんにちは、{$name}さん"."\n";
echo $integer + $decimal."\n";
var_dump((bool)$boolean);
echo "\n";

$char = '42';
$con = (int)$char;
$zero = 0;

echo $con."\n";
var_dump((bool) 0);
echo "\n";
echo gettype($name),"\n";
echo gettype($integer)."\n";
echo gettype($decimal),"\n";
echo gettype($boolean),"\n";
echo gettype($char),"\n";
echo gettype($con),"\n";
echo gettype($zero),"\n";
?>

実行結果

こんにちは、たろうさん
5.5
bool(true)

42
bool(false)

string
integer
double
boolean
string
integer
integer

感想

  • 公式のドキュメントを読むことで記述ができた
  • それに多少なりともプログラム言語をかじっているのでまだ余裕で理解できる
  • ただし動的型付けに慣れていないせいか違和感を感じる

課題2:条件分岐

課題内容

  • 2-1
    • 変数 $score に 0〜100 の点数を入れる
    • 以下のルールで評価を表示する:
      • 90以上 → 優
      • 70以上 → 良
      • 50以上 → 可
      • 50未満 → 不可
  • 2-2
    • 変数 $day に曜日の数字(1〜7)を入れる
    • match を使って、1なら「月曜日」、2なら「火曜日」...7なら「日曜日」と表示する
    • それ以外の値なら「無効な曜日」と表示する

コード内容

<?php
$score = 92;
if($score >= 90 ){
    echo "優";
}elseif($score >= 70){
    echo "良";
}elseif($score >= 50){
    echo "可";
}else{
    echo "不可";
}
echo "\n";

$day = 3;
$return_value = match ($day) {
     1 => '月曜日',
     2 => '火曜日',
     3 => '水曜日',
     4 => '木曜日',
     5 => '金曜日',
     6 => '土曜日',
     7 => '日曜日',
     default => '無効な曜日',  
};

echo $return_value,"\n";
?>

以下の場合の実行結果

  • $score=92;
  • $day=3;
優
水曜日

以下の場合の実行結果

  • $score=92;
  • $day=3;
不可
無効な曜日

感想

  • これもまだ理解できる
  • 毎回$って記述するの面倒だなとは思い始める

3:配列

課題内容

  • 3-1
    • 果物の名前を5つ配列に入れる
    • count() で要素数を表示する
    • sort() でアルファベット順に並び替えて表示する
    • 3番目の要素を取り出して表示する(インデックスは0始まり)
  • 3-2
    • 以下の情報を連想配列で表現する:
      • name: 自分の名前
      • age: 自分の年齢(適当でOK)
      • hobby: 趣味
    • foreach を使ってキーと値をすべて表示する
  • 3-3
    • 数値の配列 [3, 1, 4, 1, 5, 9, 2, 6] を作る
    • array_filter() を使って偶数だけを取り出す
    • array_map() を使って各要素を2倍にした新しい配列を作る
    • array_sum() で全要素の合計を表示する

コード内容

<?php
$fruit = ['りんご','バナナ','梨','strawberry','budou'];

echo count($fruit),"\n";
sort($fruit);
print_r($fruit);
echo $fruit[2],"\n";
echo "\n";

$personal = [
    "name" => "たろう",
    "age" => 28,
    "hobby" => "旅行",
];
foreach($personal as $key => $value){
    echo "key: $key => value: $value","\n";
}
print_r($personal);
echo "\n";

$intarray = [3,1,4,1,5,9,2,6];

function even($a){
    return !($a & 1);
}

function twofold($a){
    return ($a * 2);
}

$intarray2 = array_map('twofold', $intarray);

print_r(array_filter($intarray,"even"));
print_r($intarray2);
echo array_sum($intarray),"\n";
?>

実行結果

5
Array
(
    [0] => budou
    [1] => strawberry
    [2] => りんご
    [3] => バナナ
    [4] => 梨
)
りんご

key: name => value: たろう
key: age => value: 28
key: hobby => value: 旅行
Array
(
    [name] => たろう
    [age] => 28
    [hobby] => 旅行
)

Array
(
    [2] => 4
    [6] => 2
    [7] => 6
)
Array
(
    [0] => 6
    [1] => 2
    [2] => 8
    [3] => 2
    [4] => 10
    [5] => 18
    [6] => 4
    [7] => 12
)
31

感想

  • 3-1でアルファベット順に並び変えるとあったため以下を入れたらどうなるのか気になった
    • アルファベット、ひらがな、カタカナ、漢字
    • バイト順にソートされるらしい
  • phpを最初に見た際=>->の意味や違いが分からなかったが少なくとも=>は配列で使うと認識した
  • あと突然知らない関数が出てきて戸惑ったし正しく使えているか未だに分からない

4:ループ

課題内容

  • 課題4-1
    • for ループで1から10まで表示する
    • while ループで10から1まで逆順に表示する
    • 連想配列 ["赤" => "red", "青" => "blue", "緑" => "green"] を foreach で「赤はredです」という形式で表示する
  • 課題4-2
    • 1から100まで繰り返し、以下のルールで表示する(FizzBuzz):
    • 3の倍数 → Fizz
    • 5の倍数 → Buzz
    • 3と5両方の倍数 → FizzBuzz
    • それ以外 → その数字

コード内容

<?php
for ($i=1;$i <= 10;$i++){
    echo $i."\n";
}

$j = 10;
while($j > 0){
    echo $j--."\n";
}

$colors = [
    "赤" => "red",
    "青" => "blue",
    "緑" => "green",
 
];
foreach($colors as $key => $value){
    echo "{$key}は{$value}です","\n";
}

for($i=1;$i<=100;$i++){
    if($i % 5 === 0 && $i % 3 === 0){
        echo "{$i}=FizzBuzz"."\n";
    }elseif($i % 5 === 0){
        echo "{$i}=Buzz"."\n";
    }elseif($i % 3 === 0){
        echo "{$i}=Fizz"."\n";
    }else{
        echo $i."\n";
    }
}
?>

実行結果(長いため一部短縮)

1
2
~
9
10
10
9
~
2
1
赤はredです
青はblueです
緑はgreenです
1
2
3=Fizz
4
5=Buzz
~
15=FizzBuzz
~
90=FizzBuzz
91
92
93=Fizz
94
95=Buzz
96=Fizz
97
98
99=Fizz
100=Buzz

感想

  • ループは得意

5:関数

課題内容

  • 5-1
    • 2つの数を受け取って、大きい方を返す関数 maxNumber() を作る
    • 文字列を受け取って、文字数を返す関数 strLength() を作る
    • 名前と挨拶(デフォルトは「こんにちは」)を受け取って 「挨拶、名前さん」 と返す関数を作る
  • 5-2
    • 引数と戻り値に型宣言をつけた関数を作る
    • 整数の配列を受け取って平均値を返す関数 average(array $numbers): float を作る
    • 0除算が起こる場合は null を返す(戻り値の型を ?float にする)
  • 5-3
    • array_map() を使い、無名関数(クロージャ)で文字列の配列をすべて大文字にする
    • 同じことをアロー関数(fn() =>)で書き直す

コード内容

<?
function maxNumber($a,$b){
    if($a > $b){
        return $a."\n";
    }else{
        return $b."\n";
    }
}

$num1 = 32;
$num2 = 1;

echo maxNumber($num1,$num2);


function strLength($c){
    return (mb_strlen($c))."\n";
}

$char = "start、スタート";

echo strLength($char);


function greet(string $d,string $e = 'こんにちは'): string{
    return "「{$e}、{$d}さん」"."\n";
}

$greeting = 'こんにちは';
$name = 'たろう';

echo greet($name,$greeting);

function average(array $numbers): ?float{
    $cout = count($numbers);
    if($cout === 0){
        return null;
    }
    $j = 0;
    for($i=0;$cout>$i;$i++){
        $j = $j + $numbers[$i];
    }
    return $j / $cout;
}

$num3 = [1,2,3,4,5,6,7,8,9,0];
$nuru = [];

echo average($num3)."\n";
echo average($nuru)."\n";

$arraychar = ["fdaefdoaonfdsnie","fkdakjelfjkalksjef"];

$oomozi = array_map(function($str){
    return strtoupper($str);
}, $arraychar);

$arowoomozi = array_map(fn($str) => strtoupper($str),$arraychar);

print_r($oomozi);
print_r($arowoomozi);
?>

実行結果

32
10
「こんにちは、たろうさん」
4.5

Array
(
    [0] => FDAEFDOAONFDSNIE
    [1] => FKDAKJELFJKALKSJEF
)
Array
(
    [0] => FDAEFDOAONFDSNIE
    [1] => FKDAKJELFJKALKSJEF
)

感想

  • 課題5-1の文字数返すやつ以外は自力で公式ドキュメント見ながらAIに頼らずできた
  • 文字列の文字数返すのは関数を自分で作らなければ思い考えたが分からずだったのでAIに聞いたら「関数あるからそれ使え」とのことでした(最初から言えと
  • 5-2からはAIの説明がないと全く分からなくなる
  • クロージャーやアロー関数の記述の理解が追い付いていないため反復学習必須
  • 内部関数を調べる能力使いこなす能力が必要

6:クラス

ここから未知の世界
事前情報なしで課題を進められる気がしなかったので説明を受けてから課題へ移った

課題内容

  • 6-1
    • User クラスを作成する
    • プロパティ:name(文字列)、email(文字列)、age(整数)
    • コンストラクタで3つのプロパティを受け取り設定する
    • introduce() メソッド:私はXXです(YY歳)。メール:ZZ と表示する
    • isAdult() メソッド:18歳以上なら true、未満なら false を返す
    • インスタンスを2つ作って、それぞれのメソッドを呼び出す
  • 6-2
    • User クラスを継承した AdminUser クラスを作る
    • AdminUser には追加で role(文字列、例:「スーパー管理者")プロパティを持たせる
    • introduce() をオーバーライドして、【管理者】 を頭につけて表示する
  • 6-3
    • Greetable インターフェースを定義し、greet(): string メソッドを要求する
    • User クラスがこのインターフェースを実装する(greet() は「こんにちは、私はXXです」を返す)
    • Loggable トレイトを定義し、log(string $message): void メソッドを実装する(echo "[LOG] $message\n" でOK)
    • User クラスでこのトレイトを使う

コード内容

<?php
interface Greetable {
    public function greet(): string;
}

trait Loggable {
    public function log(string $message): void{
        echo "[LOG] $message\n";
    }
}

class User implements Greetable {
    
    use Loggable;

    public $name;
    public $email;
    public $age;

    public function __construct($name,$email,$age) {
        $this->name = $name;
        $this->email = $email;
        $this->age = $age;
    }

    public function introduce() {
        return "私は{$this->name}です({$this->age}歳)。メール:{$this->email}\n";
    }

    public function isAdult() {
        if($this->age >= 18){
            return true;
        }else{
            return false;
        }
    }

    public function greet(): string {
        return "こんにちは、私は{$this->name}です。\n";
    }
}

$user1 = new User("斎藤","example@example.com",28);
$user2 = new User("田中","hoge@hoge.com",14);

echo $user1->introduce();
echo $user1->isAdult();
echo "\n";
echo $user2->introduce();
echo $user2->isAdult();
echo "\n";

class AdminUser extends User {
    public $role;

    public function __construct($name,$email,$age,$role) {
        parent::__construct($name,$email,$age);
        $this->role = $role;
    }

    public function introduce() {
        return "【管理者】". parent::introduce();
    }
}

$admin = new AdminUser("渡邉","admin@admin.com",35,"スーパー管理者");
echo $admin->introduce();
echo "\n";

echo $user1->greet();
$user1->log("OK");

?>

実行結果

私は斎藤です(28歳)。メール:example@example.com
1
私は田中です(14歳)。メール:hoge@hoge.com

【管理者】私は渡邉です(35歳)。メール:admin@admin.com

こんにちは、私は斎藤です。
[LOG] OK

感想

  • 解説を受けただけあってすんなり入ってきた
  • 絶対にクラスの前にインターフェースを記述しないといけないと思ったので試しにクラスの下に記述したら動いてしまった
  • どうやらクラスが増えて同じように扱う場合はそれでもいいらしい
  • クラス内でアロー関数使えるのか調べてみたがダメらしい
  • アロー関数は「値を渡す引数として使う無名関数」専用の構文だからだとか
  • ->をどのタイミングで使用するか理解できた

7:まとめ課題

これまでのまとめとしての課題
課題内容

  • 7-1
    • プロパティ:id(整数)、name(文字列)、score(整数)
    • getRank() メソッド:scoreに応じて Gold/Silver/Bronze を返す
      • 80以上 → Gold
      • 50以上 → Silver
      • 50未満 → Bronze
  • 7-2
    • ユーザーを5人分配列に入れる(scoreはバラバラに設定)
  • 7-3
    • 全ユーザーの名前とランク一覧
    • 平均スコア
    • Goldランクのユーザーだけを抽出して表示(array_filter を使う)
    • スコア降順に並び替えて表示(usort を使う)

コード内容

<?php
trait rankable{
    public function getRank() {
        if($this->score >= 80){
            return "Gold";
        }elseif($this->score >= 50){
            return "Silver";
        }else{
            return "Bronze";
        }
    }
}

class User {
    
    use rankable;

    public int $id;
    public string $name;
    public int $score;

    public function __construct($id,$name,$score) {
        $this->id = $id;
        $this->name = $name;
        $this->score = $score;
    }    
}

$users = [
    new User(1,"斎藤",75),
    new User(2,"田中",41),
    new User(3,"渡邉",63),
    new User(4,"加藤",82),
    new User(5,"藤原",29),
];

$sum = 0;

foreach ($users as $value){
    echo "{$value->name},{$value->getRank()}\n";
    $sum = $sum + $value->score;
}

$count = count($users);
echo $sum/$count."\n";

$gold = array_filter($users, function($user){
    return $user->getRank() === "Gold";
});

foreach($gold as $value){
    echo "{$value->name}\n";
}

usort($users,fn($a,$b) => $b->score - $a->score);
foreach ($users as $value){
    echo "{$value->id},{$value->name},{$value->getRank()},{$value->score}\n";
}
?>

実行結果

斎藤,Silver
田中,Bronze
渡邉,Silver
加藤,Gold
藤原,Bronze
58
加藤
4,加藤,Gold,82
1,斎藤,Silver,75
3,渡邉,Silver,63
2,田中,Bronze,41
5,藤原,Bronze,29

感想

  • ユーザ配列をクラスを使わずに作ったら怒られた(先に言ってくれ
  • クラスと配列をセットで使うことができなかったので今回の内容を覚えておきたい

まとめ

全てを完全に理解できていない
内部関数の記述方法や使い方が分かっていない
クロージャーやアロー関数は書いて覚えるしかない
どのタイミングで型宣言しなければならないかわかっていない
step2からはlaravel入門編となるのであきらめず続けていこうと思う!

関連記事

2025/12/3·メモ

tailscaleのメモ

LXCのtailscaleについてメモします。

#IT#tailscale#NW
2025/11/27·メモ

ブログの作り方

このブログの作り方について説明します。

#IT#blog#作り方