laravelの学習をする第0章
0からAIと一緒にlaravelを学習する!
2026/3/27 · 学習ログ
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
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"
課題内容
コード内容
<?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
感想
課題内容
コード内容
<?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";
?>
以下の場合の実行結果
優
水曜日
以下の場合の実行結果
不可
無効な曜日
感想
$って記述するの面倒だなとは思い始める課題内容
コード内容
<?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
感想
=>と->の意味や違いが分からなかったが少なくとも=>は配列で使うと認識した課題内容
コード内容
<?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
感想
課題内容
コード内容
<?
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
)
感想
ここから未知の世界
事前情報なしで課題を進められる気がしなかったので説明を受けてから課題へ移った
課題内容
コード内容
<?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
感想
->をどのタイミングで使用するか理解できたこれまでのまとめとしての課題
課題内容
コード内容
<?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入門編となるのであきらめず続けていこうと思う!
0からAIと一緒にlaravelを学習する!
LXCのtailscaleについてメモします。
このブログの作り方について説明します。