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

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

ユニットテスト導入のメリット・デメリットまとめ

# はじめに

株式会社ナイトレイの和田です。
普段、自社サービスの開発に取り組んでいます。
現在私が関わっているプロダクトにユニットテストを導入しました(そのプロダクトではユニットテストが省略されていました)。
その際に、改めてユニットテストのメリット・デメリットを学んだので、それをまとめたものをここに共有します。

# メリット

## ①バグによるダメージを減らせる

### 早期発見

一般的に、不具合が発生した時の改修コストは、発見が遅れるほどに上がっていく。

例えば、リリース前に見つかるのとリリース後に見つかるでは改修の影響範囲やユーザーへの対応含め大きな差がある。逆に言えばQA段階ならもっとコストが下がり、手元での動作確認時ならさらに下がり、コードレビュー段階ならさらに…

テストコードは開発段階で不具合を発見することに貢献してくれるため、改修コストが最小で済む。

### 原因特定

テストコードが書かれていれば、どこが壊れてどこが正常なのかという問題の切り分けができるので、問題箇所の特定がしやすくなる。結果的に不具合の解消を早めることができる。

### 減少

元記事を表示

Laravelのテスト時にDB内のデータを吹き飛ばさないために

# はじめに

株式会社ナイトレイの和田です。
普段、自社サービスの開発に取り組んでいます。
現在私が関わっているLaravelのプロダクトにPHPUnitテストを導入しました(そのプロダクトではユニットテストが省略されていました)。
その際に上記のタイトルに関する問題で少し悩んだので記事にして共有したいと思います。
前提として、この問題はテストDBを用いるテストに限ったものになります。

# 環境

Laravel 8.83.14
PHP 7.3.33
PHPUnit 9.5.20

# テスト時にDB内のデータが吹き飛んでしまうケース

以下の条件が揃った時に発生する。

– `config: cache`コマンドを打つなどして、設定ファイルがキャッシュされた状態でテストを実行
– 実行されるテストファイル内で`RefreshDatabase`などのテーブル、もしくはテーブル内のデータを一回削除するような処理が施されている場合

理由としては、**Laravelにおいて設定ファイルがキャッシュされた状態でテストを実行すると、phpunit.xml よりそのキャッシュが優先的に参照さ

元記事を表示

PHPUnitの公式ドキュメントを全部読んだので大事なところをまとめてみた

# はじめに

はじめまして株式会社ナイトレイの渡辺です。

現在私が関わっているプロダクトでPHPのユニットテストを導入した際、PHPUnitを利用するにあたって公式ドキュメントを一通り読んだので、この記事では個人的に重要な箇所を備忘録としてまとめます。

? 本記事で記載されている内容はこちらのドキュメントから引用させていただいております

https://phpunit.readthedocs.io/ja/latest/

## 対象読者

– 少しPHPUnitを使ったことがある
– PHPUnitをもっと上手く使いたい

## 環境

PHPUnit 9.5.20

# 内容

## ****PHPUnit 用のテストの書き方****

この章では、PHPUnit を使ったテストを書く際の基本的な決まり事や手順を紹介しています。

最低限、PHPUnitでテストを書く上で必要な情報なので一通り目を通すことを推奨します。

[https://phpunit.readthedocs.io/ja/latest/writing-tests-for-phpunit.html](

元記事を表示

PHP8.0からの便利な機能 ~3選~

PHP8.0の新機能でよく使う機能を3つ紹介します:point_up::v:

## 1. match式
簡単な条件分岐処理はmatch式を使いましょう!
### BEFORE:frowning2:
“` php:if文
$hoge = 1;
if ($hoge === 1) {
$fuga = ‘イチだよ’;
else if ($hoge === 2) {
$fuga = ‘ニだよ’;
else if ($hoge === 3) {
$fuga = ‘サンだよ’;
} else {
$fuga = ‘チガウヨ’;
}
“`
“` php:switch文
$hoge = 1;
switch ($hoge) {
case 1:
$fuga = ‘イチだよ’;
break;
case 2:
$fuga = ‘ニだよ’;
break;
case 3:
$fuga = ‘サンだよ’;
break;
default:

元記事を表示

XAMPPでMySQLのポート番号の変更方法

MySQLのConfigボタンをクリックし、my.iniをクリックする。
ポート番号を3306以外に変更する。
“`[client]
# password = your_password
#port=3306
port=3309 ← ここ
socket=”D:/xampp/mysql/mysql.sock”

# The MySQL server
default-character-set=utf8mb4
[mysqld]
#port=3306
port=3309 ← ここ
socket=”D:/xampp/mysql/mysql.sock”
“`
# 参考文献
https://itsakura.com/xampp-port

元記事を表示

PhpStormで使っているプラグイン

PhpStormで使ってるプラグイン一覧。
PHPに関係あるなし関わらず追加で入れてあるプラグインを全部。

## 開発全般
https://plugins.jetbrains.com/plugin/9333-makefile-language

makefileに実行ボタンが付いてポチッとな、ができるようになる。

https://plugins.jetbrains.com/plugin/9746-ideolog

各種ログファイルに色づけできる。
ログフォーマットをカスタムすることも可能。

https://plugins.jetbrains.com/plugin/9525–env-files-support

## PHP
https://plugins.jetbrains.com/plugin/7622-php-inspections-ea-extended-

これのおかげでPHPのプログラムの質が爆上げ。入れないと損する。
自分の昔のソースコードに手を入れるときに改善指摘が多すぎて泣く。

https://plugins.jetbrains

元記事を表示

.find()メソッドのメソッドチェーンは便利だった

# 概要
再生リストをDOMアクセスする場合、リストの構造がネスト構造になっていて複雑な場合、深いところにあるセレクターをチェックしたい場合、どうしたらいいか悩んでいたところ、find()メソッドが使えることに気がつきました。このfind()メソッドをメソッドチェーンでつなげて行くと簡単に深いところにある、セレクターをチェックできました。

# 事例
「なつかしの曲(ポータル)」サイトの王冠再生ボタンでそのテクニックを使用しました。

“`
//王冠を再生
//
var crown_list=[];
//王冠再生ボタンのクリックイベント処理
//
$(document).on(“click”,”#crown_play”,function (e){
crown_list = [];
//再生リストのタグを順にチェックして、class=”.goodness”
//要素の中に

元記事を表示

【ZipArchive】phpでディレクトリのファイルをzipで圧縮

# ディレクトリのファイルをzipで圧縮したい
phpでファイル圧縮をする場合はZipArchiveを使う場合があるのだが、ディレクトリ指定ができないので、ディレクトリ指定したい場合のやり方を書いておく

“`php
open(‘/path/to/put/zip/file/example.zip’, ZipArchive::CREATE);
$files = glob(“/path/to/files/*”);
foreach ($files as $file) {
$zip->addFile($file); // ファイル名を帰る場合は第2引数で指定可能
}
$zip->close();
“`

難しくないコードです。
glob関数でファイル一覧を持ってきて圧縮しているだけです。ディレクトリ指定そのままできると便利と思ったのですが、できないみたいなのでメモ程度に残しておきます。

元記事を表示

PHP シリアライズを使って配列をDBに保存可能な文字列に変換する

# 概要

– PHPのシリアライズ(保存可能な文字列型への変換)について簡単にまとめてみる。

# シリアライズの方法

### 文字列をシリアライズする

– シリアライズにはPHPの組み込み関数である`serialize()`関数を用いる。
– 手始めに文字列型の「A」という文字をシリアライズしてみる。

“`php

元記事を表示

【PHP】コンテクストによる型変換

今回はコンテクスト(文脈)による型変換の具体的な動作について確認していこうと思います。
PHPマニュアルによると、コンテクストによる型変換が起こる
可能性があるのは以下の6パターンとなっています。
それぞれの型変換について発生条件や仕様を見ていきます。

* 数値のコンテクスト
* 文字列のコンテクスト
* 論理コンテクスト
* 整数と文字列のコンテクスト
* 比較のコンテクスト
* 関数のコンテクスト

:::note info
[型の相互変換](https://www.php.net/manual/ja/language.types.type-juggling.php)
:::

## 数値のコンテクスト
算術演算子を使った場合に型変換が発生します。
以下の例では、var_dump の中で $b が
**boolean true -> int 1** に変換されてから演算されています。

“`php
$a = ‘5’;
$b = true;
var_dump($a + $b); // int 6
“`

:::note warn
マニュアルにも「注意」とありますが、値を別

元記事を表示

PHPのインスタンス変数の中にオブジェクトは入ってない

# 概要

– 忘れないようにインスタンス変数の内容について簡単にまとめる。

# インスタンス変数の中にオブジェクトは入ってない

– [オブジェクトと参照](https://www.php.net/manual/ja/language.oop5.references.php)を読んでいたら下記のような内容が書いてあった。

:::note info
PHP では、オブジェクト変数の値にオブジェクト自身は含まれません。
含まれるのはオブジェクトの ID のみで、 これを用いて実際のオブジェクトにアクセスできるようになっています。
:::

– ようはオブジェクト変数にはオブジェクトそのものは格納されていない。
– 別の領域に作られたオブジェクトのIDだけがオブジェクト変数に格納されているようだ。

元記事を表示

PHP オブジェクトと参照を読んでみた

# 概要

– PHPのマニュアルの[オブジェクトと参照](https://www.php.net/manual/ja/language.oop5.references.php)を読んでみたので自分なりにまとめてみる。

# 今の自分の知識量

– オブジェクトは参照渡しとはちょっと違うけど似たような振る舞いをすることは知っている。

# 内容

– 「オブジェクトはデフォルトで参照渡しになります!」とよく言われるけど、厳密に言うと少し違うらしい。
– オブジェクト変数の値にオブジェクトそのものは格納されない。格納されているのはオブジェクトのIDのみ。
– PHPではオブジェクトのIDを用いてオブジェクトにアクセスできるようになっている。
– だからオブジェクト変数を他の変数に更に格納したりしてもオブジェクトのIDが他の変数に格納されるだけなのでオブジェクトIDを用いてオブジェクトを参照すると同じオブジェクトを参照する。
– なのでインスタンス変数の値を他の変数に格納してもオブジェクトID値がコピーされる。結果として同じオブジェクトを指すようになっているだけ。
– 参照渡し:参照先情報

元記事を表示

過去の自分のコードを修正してみる – PHP カレンダー編③

# 前回までのまとめ
これを

“`php

\n

\n

\n

“;
$t++;
} elseif (($t == 1) or ($t == 2)) {
print “

“;
$t++;
} else {
print “

“;
$t = 0; //次の段へ
}

“`

こうした

“`php

if ($t === 0) :
?>

PHPをVSCodeで実行できない

前提
Xammpはインストール済み
xammpフォルダ内のhtdocsフォルダ下にtestフォルダを作成。そのなかにtest.phpファイルを作成

実行したこと
ブラウザにて、http://localhost/test/test.phpを入力して、実行

結果
404 not found

エラー解消のためにやったこと
キャッシュの削除
chrome://net-internals/#hstsにアクセスして、Delete domain security policiesの項目からlocalhost またはlocalhost:8888と入力してDeleteを実行
・・・この操作はlocalhostでのアクセス時、httpが自動でhttps(httpをSSLでアクセスするもの)に変換されていることがあるためそれを削除した。
=>test.phpは開けるようになったが、localhostのURLが開けない。というかlocalhost入力時、後ろに/tutorialが付与され、リダイレクトしてしまう。



結果わかったこと
おそらくDockerが原因でした。PHPの環境構築前に試しに

log_errors を off としているのに、 PHP のエラー出力が行われる