PHP関連のことを調べてみた2022年06月29日

PHP関連のことを調べてみた2022年06月29日
目次

Composer オートロードの仕様

## PSR-4
ネームスペース名とターゲットディレクトリを指定してマッピングさせる機能。
オートローディングに対応しているのはネームスペースを持つクラスのみ。ただの関数はロードされない。動的にロードされるのでファイル追加時にコマンドでコンパイルする必要が無い。本番環境では動的ロードのタイミングでファイルサーチが入るので実行時間が伸びるため非推奨。

## classmap
予めphpファイルをサーチしてクラスの名前解決をするオプション。指定したディレクトリ及びファイルに含まれるクラスはautoload.phpさえ呼び出しておけばネームスペース及びuse不要で呼び出せる。アプリ実行時に設定ファイルをロードしてファイルを見つけるので高速。本番環境では推奨される。

## files
classmapと挙動は同じだが、ただの関数も読み込める点で異なる。ただし、autoload.phpをrequireしたタイミングで指定したファイルが必ず呼び出されるのでオーバーヘッドが発生する。どの場面でも必ず最初に必要になるファイルのみを指定してロードさせる場合に使用する。関数ファイルを個別で呼び出す場合

元記事を表示

【Laravel】データベースのデータがブラウザに表示されない

コントローラーで、データベースのデータを取得したいのに上手く取得できないため、そもそもの部分の理解のために備忘録を書きます。

# 前提

– Todoアプリを作っております。
– TodoController.phpのindexアクションが実行された時に、DBのtodosテーブルから全データを引っ張ってこれるようにしたい。

# 現状

### コントローラ
“`php:todo-api/app/Http/Controllers/TodoController.php

元記事を表示

【Laravel】Base table or view not found: Table ‘(サービス名).(テーブル名)’ doesn’t exist

## 環境
Laravel v9.5.1 (PHP v8.1.3)

## 状況

テスト実行時に下記のエラー。

“`
Base table or view not found: 1146 Table ‘(サービス名).(テーブル名)’ doesn’t exist
“`

## 解決法

公式ドキュメントには
>どのデータベーステーブルがFlightモデルに対応するかをEloquentに知らせていないことにお気づきかもしれません。別の名前を明示的に指定しない限り、クラスの複数形の「スネークケース」をテーブル名として使用します。
モデルの対応するデータベーステーブルがこの規約に適合しない場合は、モデルにtableプロパティを定義してモデルのテーブル名を自分で指定できます。

今回のエラーが例えば下記だった場合、
“`
Base table or view not found: 1146 Table ‘(サービス名).flight’ doesn’t exist
“`
モデルでテーブル名を指定しなかったのでEloquentが「flights」を使用しており、エラーが出た。

下記

元記事を表示

【Laravel】Block Kitを使ったSlack通知機能

## 環境
Laravel v9.5.1 (PHP v8.1.3)

## Block Kitを使った通知機能
“`Notification“`を使ってSlack通知機能を実装した記事はたくさん見かけたが、“`Notification“`に加え、リッチなメッセージを作成できる“`Block Kit“`を使った通知機能は見なかったので仕組みを理解し実装するのに時間がかかってしまった。

https://api.slack.com/block-kit

## 実装
大体はドキュメント通りに実装し、“`toSlack()“`の中にデフォルトで書いてある“`new SlackMessage->to()“`は使わずに下記のように変更。

“`php

元記事を表示

HomebrewでPHP7.3インストールする方法2022年版

## まえがき
業務上、PHP8.1とPHP7.3を行き来して作業する必要があったのですが
Homebrewを使ってPHP8.1 → 7.3に切り替えようとしたところ「古いバージョンだからbrew上で管理してないよ!だからインストール出来ないよ!」というエラーが発生。

結構苦労したので、備忘録代わりにメモ。

## 前提
環境は以下の通りです。

macOS Monterey 12.2.1
Homebrew 3.5.2
PHP 8.1(インストール済み) → 7.3(インストールしたい)

## やり方
元々PHPがインストールされていない場合、1行目は不要です。
また、バージョンは各自インストールされているバージョンを指定します。

“`
$ brew unlink php@8.1
$ brew tap shivammathur/php
$ brew reinstall shivammathur/php/php@7.3
“`

パス修正する
“`
$ vi ~/.zshrc
$ source ~/.zshrc
“`

これでOK。

## ちなみに
7.3から8.1に戻すと

元記事を表示

PHPでループの要素を参照渡しにするときの注意

PHPのループで参照渡しを使ったコードが思い通りの挙動にならず、いろいろ調べてたら面白い例を見つけたので紹介。

こんなコードがあったとする。
“`php
$a = array(‘a’, ‘b’, ‘c’, ‘d’);

foreach ($a as &$v) {}

print_r($a);

foreach ($a as $v) {}

print_r($a);
“`
2回の`print_r($a);`の結果は同じになりそうなものだけど実際は以下のようになる。
“`
Array
(
[0] => a
[1] => b
[2] => c
[3] => d
)
Array
(
[0] => a
[1] => b
[2] => c
[3] => c
)

“`
なぜかというと、まず1個目のループは参照渡しなので、
“`
$vがaが入ってる1個目のコンテナ(※)を指す
$vがbが入ってる2個目コンテナを指す
$vがcが入ってる3個目コンテナを指す
$vがdが入ってる4個目コンテナを指す
“`
という流れで`$v`の

元記事を表示

Bakeコマンドでスピーディーな開発へ

## はじめに
今回はCakePHPのbakeコマンドについて
紹介していこうと思います。

## Bakeコマンドとは
bakeとは、CakePHPのMVCモデルによる
**Webアプリケーションの雛形を自動生成**するための機能です。
CUI(コマンド)のツールでコマンドで打つことで実行が可能です。

## 必要なもの
テーブルデータを元に自動生成するものがあるため、
最初にテーブルを作成させましょう。

## Bakeコマンドで作れるもの
:::note warn
警告
Windows システムの場合は
下記のコマンドを入力する際に、`bin\cake bake`で入力してださい。
:::
#### ・コントローラー
コントローラーは`controller + コントローラー名`で生成できます。
“`
$ bin/cake bake controller Articles
“`
テストコードが不要な場合は、**–no-test** オプションをつけましょう。

#### ・モデル
モデルは`Model+ テーブル名`で生成できます。

:::note warn
警告
指定し

元記事を表示

laravel Mockeryを使ってテストを書く(外部APIアクセスをモック化)

# 概要

– laravelのUnitテストにて外部API実行関数の戻り値をMockeryを使って定義する方法を簡単にまとめる。

# ご注意

– 今回は汎用的にまとめようと思う。従って記事のコードをそのままコピペしても動作しないと思われる。

# 前提

– 下記の方法でMockeryのインストールを済ませておく。
– [laravel Mockeryを使ってテストを書く(インストール準備編)](https://qiita.com/miriwo/items/0f8fdf91177f6c3cb713)

# 方法

1. artisanコマンドを用いて任意のUnitテストのクラスを用意する。

“`terminal
$ php artisan make:test –unit FooTest
“`

1. UnitテストクラスのsetUp()関数内でモック化したい関数が所属するクラスを指定してテストダブルを定義する。

“`FooTest.php

元記事を表示

laravel Mockeryを使ってテストを書く(インストール準備編)

# 概要

– laravelの環境にMockeryをインストールして使えるところまで持っていく方法をメモ的にまとめる。

# 方法

1. 下記コマンドを実行してMockeryをcomposerでインストールする。

“`terminal
$ composer require –dev mockery/mockery
“`

1. composer.jsonを確認し、require-devにMockeryの情報が追記されていれば準備完了である。

“`composer.json
“require-dev”: {
“mockery/mockery”: “^1.5”,
}
“`

1. tinkerにて下記を実行し、エラーがでないことを確認する。

“`php
$mock = \Mockery::mock(‘foo’);
“`

# 参考文献

– [https://readouble.com/mockery/1.0/ja/index.html](https://readoubl

元記事を表示

PHP の static の種類,全部言えるかな?

## Q1

商品の在庫ごとに割り振られる連番の商品 ID を, PHP 上で自動採番するクラスを考えます。下記で使われている `static` に関して

– ? どういう役目を持っているでしょうか?
– ? どの PHP バージョン以降で有効でしょうか?
(但し,PHP 5.0 より前には遡りません)
– ? **出力される商品 ID はどうなるでしょうか?**

“`php
id = ++static::$counter;
}
}

class SpecialP

元記事を表示

【Laravel】論理削除(SoftDelete)採用時の注意点・検討事項

Laravelでは論理削除(SoftDelete)が割と簡単に実装できる。
しかし、いざ実装しようと思ったら注意 or 検討すべき点がいくつかあったのでメモ。

## Cascade

物理削除(完全削除)の場合、cascadeを設定しておけば、削除したレコードに紐づいているテーブルのレコードも一緒に消えてくれる。しかし論理削除の場合は消えてくれない。

もし紐づいてるテーブルのレコードも一緒に論理削除したい場合は、laravel-soft-cascadeというパッケージを使用する必要等がある。詳しくは以下記事様が解説してくださってます。

https://zakkuri.life/%E3%80%90laravel%E3%80%91ondeletecascade%E3%81%97%E3%81%A6%E3%82%8B%E3%81%AE%E3%81%AB%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%87%E3%83%BC%E3%82%BF%E3%81%8C%E8%AB%96%E7%90%86/

 
## メールア

元記事を表示

【PHP】null処理方法の使い分け(isset、empty、is_null)

## はじめに
PHPにおけるnullの処理方法についてまとめたいと思います。

動機として、PHPには意外とnullを判定する方法が多く存在しているのですが、
落とし穴も多く、それぞれの方法をまとめ、使い分ける必要があるのではないかと考えました。
実務ではないのですが、PHPの開発でエラーが解決できずにハマってしまいました。

## 対象者
– 駆け出しエンジニア
– 入社1年半くらいまでのPHPer
– エンジニアではないが、PHPを最近始めた

かなり基本的なことで、公式のドキュメントに書かれていることをまとめたものになります。
ある程度経験のある人には、あまり面白い内容ではないと思われます。

## 本題
### null判定方法一覧
– `isset()`を使う
– `empty()`を使う
– `is_null()`を使う
– `$variable === null`

上記が挙げられると思います。
他にもこんな方法で`null`を判定できるよ!という方法があれば教えていただきたいです。

### isset()を使う
`isset()`は変数が定義されており、値が`nul

元記事を表示

【PHP8.2】true型が使えるようになる

PHP8.2で[false型とnull型が単独で使えるようになった](https://qiita.com/rana_kualu/items/2ef15cfa2dea8ba0f061)わけですが、こうなるとtrue型が存在しないのが片手落ちになってしまうわけですよ。

“`php
class Foo{
public bool $var1;
public false $var2;
public true $var3; // ←これだけ非対応
}
“`

ということでtrue型も実装しようというRFCが提出されました。

投票期間は2022/05/29から2022/06/12であり、賛成33反対0の全会一致で可決されました。
PHP8.2から使用可能になります。

以下は該当のRFC、[Add true type](https://wiki.php.net/rfc/true-type)の日本語訳です。

# PHP RFC: Add true type

## Introduction

PHPは、PHP8.2において[null型とfalse型を単独サポートする](https

元記事を表示

【Laravel】中間テーブルの定義でPivotを使った場合のBefore/After

## 環境
Laravel v9.5.1 (PHP v8.1.3)

>usersテーブル
id – integer
name – string

>rolesテーブル
id – integer
name – string

>role_userテーブル
user_id – integer
role_id – integer

## Pivotを使わない場合

“`Models/RoleUser.php
class RoleUser extends Model
{

public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}

public function role(): BelongsTo
{
return $this->belongsTo(Role::class);
}
}
“`

“`Models/User.php
class User extends Model
{

publ

元記事を表示

【PHP基礎⑲】配列-3.連想配列

[問題]
要素数5の整数型の配列を宣言し、すべての配列に対して順に入力された整数値を代入し、すべての要素の値を表示するプログラムを作成しなさい。

# コード
“`php
$a = [1,2,3,4,5];
foreach($a as $key => $m){
$a[$key] = intval(fgets(STDIN));
}
foreach($a as $i){
echo $i, PHP_EOL;
}
“`


「6
 3
 5
 7
 -2」   と入力

# 結果
“`
6
3
5
7
-2
“`

☆連想配列
・配列では、0番目、1番目…と番号(キー)が振られて、そのキーを指定することで要素を指定し取り出せた。
一方、連想配列では番号の代わりに名前をつけて要素を管理することができる。

$a = [‘りんご’ => ‘赤色’, ‘バナナ’ => ‘黄色’, ‘みかん’ => ‘オレンジ色’];
→$a[‘りんご’]とすれば、’赤色’を取り出せる。

・「=>」は「→」のような意味で、りんごは赤色のラベルのような感じ。
=>を使うことでキーと値をペ

元記事を表示

PHP の … (3点ドット, Three Dots) の種類,全部言えるかな?

下記で使われている `…` に関して
– ? シンタックスは,そもそも有効でしょうか?
– ? 有効である場合,どういう役目を持っているでしょうか?
– ? 有効である場合,どの PHP バージョン以降で有効でしょうか?

:::note warn
ヒント: 1つだけ,エラーになるものが含まれています!
:::

## Q1

“`php

回答

:::note success
**引数のアンパック** です。 PHP 5.6 以降で使用可能です。

– [… による引数のアンパック ¶](https://www.php.net/manual/ja/migration56.new-

元記事を表示

【PHP基礎⑱】配列-2.配列の初期化

[問題]
要素数10の整数型の配列を宣言し、整数値を入力させ、すべての配列の要素を入力値として、すべての要素の値を表示するプログラムを作成しなさい。

# コード
“`php
$a = [1,2,3,4,5,6,7,8,9,10];
$m = intval(fgets(STDIN));
$k = [];
foreach($a as $i){
$k[] = $m;
}
foreach($k as $r){
echo $r, PHP_EOL;
}
“`

↓「5」と入力

# 結果
“`
5
5
5
5
5
5
5
5
5
5
“`

☆配列の初期化
$k = [];

☆配列に新しい要素を追加する
$k[] = $m;
→キーを指定しない場合は、自動で整数のキーが付与される。
現在ある最大のキーに1を加えたものが与えられるが、キーが1つもない時は0から付与される。

元記事を表示

【Laravel】Class “Database\Factories\(モデル名)” not found

2,3回同じエラーで5分ほど無駄にしてるのでいい加減忘れないために備忘録として。

## 環境
Laravel v9.5.1 (PHP v8.1.3)

## 状況

テストを実行した際に下記のエラー

“`
Class “Database\Factories\Post” not found
“`

## 解決法

“`protected $model = Post::class;“`を追記したときの“`use App\Models\Post;“`の定義忘れが原因。
“`use App\Models\Post;“`を追記する。

“`php
namespace Database\Factories;

use App\Models\User;
use App\Models\Post;
use Illuminate\Database\Eloquent\Factories\Factory;

class CardPointHistoryFactory extends Factory
{
protected $model = Post::class;

publ

元記事を表示

行数を節約するvar_dump()を書いてみた

|[../](https://qiita.com/taconana/items/3f5424f9abfc755772c2) |
|—|

var_dump()で配列をダンプすると、やたらと行数が長い。出力制御関数`ob_start()`と`ob_get_clean()`で挟み込めばテキストが取れると聞いたので、行数をほぼ1/2にするものを書いてみた。引数は1つに限定。

“`php
function var_dump2($arg): void {
ob_start();
var_dump($arg);
$t = ob_get_clean();
$s = ”;
while (($n = strpos($t, ‘=>’)) > 0){
// $s .= substr($t, 0, $n) . “=> “;
$s .= rtrim(substr($t, 0, $n)) . ” => “;
$t = ltrim(substr($t, $n + 3));
}
echo $s, $t, PHP_EOL;
}
“`
以下のように書いて

元記事を表示

HTMLファイルのフォームからPHPファイルに送信したとき、PHPのコードがそのまま表示されてしまう方へ(初心者から初心者へ)

これは初心者の自分がかなり苦戦した悩みです。同じ悩みを持っている方で助かる方がいてくれれば幸いです。

起こる問題

“`html:index.html

解決策

htmlファイルをブラウザで表示するときに、アドレスバーにlocalhostから入力して表示させましょう(これだけ:joy:)

自分はこの問題で5時間くらい悩みました。一人でも解決する方がいてくれれば!

元記事を表示

OTHERカテゴリの最新記事