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

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

PHPのforeachでは、多くの場合、参照渡しの方がいい

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

PHPでは、関数を呼び出すとき、引数を「`値渡し`」(&なし)にするか、「`参照渡し`」(&あり)にするか決めないといけない。配列(array)、文字列(string)、他のクラスからインスタンス化したオブジェクトを「構造体」と呼ぶことにすると、以下のルールで決めることになる。
– 関数内で引数で渡された構造体に副作用を与えたいとき –> 参照渡し
– 関数内で引数で渡された構造体に副作用を与えたくないとき –> 値渡し
– 関数内で引数で渡された構造体に対して副作用がないとき –> 参照渡し

値渡しでは、引数で指定した変数の値はコピーされて、別の変数として値を受け取る。関数内で引数で与えられた構造体に変更しても呼び出し元の構造体が変更されることはない。一方、参照渡しでは、値をコピーせずに変数への参照(ポインタというか、アドレスというか)のみを渡す。関数内で引数で与えられた構造体に変更することは、呼び出し元の構造体を変更することになる。

元記事を表示

【APNs】プッシュ通知の証明書を更新する。

iOSアプリでプッシュ通知を飛ばすにはAppleDeveloperにて色々設定をしてp12ファイルやらpemファイルやらを用意しないといけないのですが、1年に1回の作業なんて覚えている訳も無く、折角なので備忘録として残す事にしました。

[キーチェーンからcerファイルの作成(Mac)]
Finder→アプリケーション→ユーティリティ→キーチェーンアクセスでキーチェーンアクセスを立ち上げる。
メニューのキーチェーンアクセス→証明書アシスタント→認証局に証明書を要求を選択
ユーザのメールアドレスにAppleDeveloperで使用しているメアドを入れ、要求の処理をディスクに保存、鍵ペア情報を指定にし、続けるボタンを押す。
後は最後までボタン押していけば良い。
これでcerファイルは完成。

[AppleDeveloperでの更新処理(Web)]
Certificates,Identifiers&Profiles→Identifiers→NAME一覧からpush通知で使っているNAMEのものを選択→pushNotificationsの横にあるEditを選択

Production SSL

元記事を表示

PHP 今月の末日を取得 date() strtotime() まとめ

## date() と strtotime() を組み合わせて月末の日付を取得します。
“`php:今月の末尾を取得
var_dump(date(‘Y-m-d’,strtotime(‘last day of this month’)));
“`
**解説**
`date()関数`
“`php:例 2022/1/10の午前5時に実行したとします
date(“Y/m/d H:i:s”); // 2022/10/01 05:00:00
date(“Y/m/10”); // 2022/10/10 10日を指定することもできる
“`
第1引数 → フォーマット
第2引数 → タイムスタンプ(省略可)
※第2引数を指定しなかった場合は「現在の日時」が第1引数のフォーマットで取得されます。

**フォーマットの一部を紹介**
|フォーマット|結果|
|:—:|:—:|
| Y | 年4桁 |
| y | 年2桁 |
| L | 閏年かどうか(1が閏年で0が閏年ではない) |
| m | 月(一

元記事を表示

[Windows+WSL2]VSCode のphp…executablePath にDocker コンテナ内のPHPを指定する

## 経緯
新しく購入したWindows PC でVSCode を使い始めたら、PHP 関連の拡張機能に「php のパスが正しく通ってませんよ」と指摘される。

>Cannot validate since a PHP installation could not be found. Use the setting ‘php.validate.executablePath’ to configure the PHP executable.

![Screenshot_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532781/082e796f-542b-bd78-694d-d5b6c269463c.png)

Windows 自体にPHPを入れていれば問題ないのだけど、PHPは開発用Docker コンテナの中に入っているのみ。
PHPファイル自体、開発外で使うこともないので、VSCode にもローカルのWindows 環境ではなく
開発環境を参照しておいてほしい。

ので、コンテナ内のPHPへパスを

元記事を表示

【Laravel】Requestをそのままコントローラー以外に渡さない【リファクタリング】

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

## Bad

“`$request“`をそのまま引数として渡してしまっているのが問題。
引数1つで済むからいっか!とやってしまっていた。

“`app/Http/Controllers/Api/PostController.php
public function store(PostRequest $request)
{
$request->user()->givePost($request);

return response()->json(Response::HTTP_OK);
}
“`

“`app/Models/User.php
public function givePost(Request $request): Post
{
$post = $this->createPost($request->content, $request->title);
// このあとの処理は省略

return $post;
}
“`

教訓:“`Request“`をそのま

元記事を表示

【Laravel・Rails】親が削除されたらリレーション先の子テーブルも削除する方法まとめ

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

## Laravel
### cascadeOnDelete()
マイグレーションファイルでやる方法。

“`php
Schema::table(‘posts’, function (Blueprint $table) {
$table->foreignId(‘user_id’)->constrained()->cascadeOnDelete();
});
“`

https://readouble.com/laravel/9.x/ja/migrations.html?header=%25E5%25A4%2596%25E9%2583%25A8%25E3%2582%25AD%25E3%2583%25BC%25E5%2588%25B6%25E7%25B4%2584

### deleting()
modelにロジックを書く方法。
“`app/Models/User.php
protected static function boot()
{
parent::boot();

self::dele

元記事を表示

PHP array_column 連想配列の値を取得

## array_column()

“`php:例として使う連想配列
$hoge = [
0 => [ ‘id’ => 100, ‘color’ => ‘red’, ‘team’ => ‘A’],
1 => [ ‘id’ => 200, ‘color’ => ‘blue’, ‘team’ => ‘B’],
2 => [ ‘id’ => 300, ‘color’ => ‘green’, ‘team’ => ‘C’ ],
3 => [ ‘id’ => 400, ‘color’ => ‘yellow’, ‘team’ => ‘D’ ],
];
“`

### 特定の要素だけ取り出す
“`php:例
$hoge = [
0 => [ ‘id’ => 100, ‘color’ => ‘red’, ‘team’ => ‘A’],
1 => [ ‘id’ => 200, ‘color’ => ‘blue’, ‘team’ => ‘B’],
2 => [ ‘id’ => 300, ‘color’ => ‘green’, ‘team’ =>

元記事を表示

LaravelとJavaScript(FetchAPI)でQiitaのタグ登録機能を実装してみる。

# 目次
[1.Qiitaのタグ登録機能](#1-qiitaのタグ登録機能)
[2.対象読者](#2-対象読者)
[3. 完成品とコード](#3-完成品とコード)
[4. 仕組み](#4-仕組み)    :point_left:ここだけ理解できればいいと思います。
[5. コード解説](#5-コード解説)  :point_left:わかりにくい

# 1. Qiitaのタグ登録機能

↓これです。画面遷移無しでタグの登録をする機能です。
![1654763057758.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311883/69779c07-1686-c074-019d-15fdbba59383.gif)
HTML,CSS,PHPしか書けなかった私が憧れていた「画面遷移無しでのデータベースの操作」です。

実装方法を解説していきます。
※ ぶっちゃけ[4. 仕組み](#4-仕組み) のところだけ理解して、fetchAPIの使い方を学べば実装できると思います。
[Fetch の使用 – W

【Laravel】環境変数を呼び出すときはconfig()を使おう

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

## 概要
環境変数を“`env()“`で直接参照せずに“`config()“`を使って呼び出そう!

## Bad

“`env
SITE_LINK=”https://sample_app.com”
“`
環境変数をenvで直接参照しようとすると“`php artisan config:cache“`したあと“`null“`になってしまい、呼び出せない。

“`shell
% docker-compose exec laravel.test php artisan tinker
>>> env(‘INVITATION_LINK’)
=> “https://sample_app.com”

PDOとPDOStatementを掩蔽し、実行したSQLのログを出力する方法

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

PHPでDBにアクセスするためのベースクラスを作成してみた。PHPでは、ブラウザで画面が遷移するごと(redirectするごと)に新たなプロセスが生成されるので、DBへの接続情報をプーリングしたり、セッション($_SESSION)に保持したり、メモリ上にキャッシュしても意味がないことが分かってきた。新たなプロセスで必要となったときに、DBに接続し、PDOを生成する。そのプロセスが有効である間は、PDOを使い回して複数のSQLを発行できる。

SQLの発行は、プレペアステートメントを利用したいが、SQLのログが綺麗に出力できない。調べてみてもいい方法が見つからなかったので、独自に書いてみた。データ型によっては動作は未確認だが、int,bool,float,string,dateなどの基本型については問題ないので、紹介しておきたい。

## SQLをログ出力できるプレペアステートメントの実現

例えば、DBのユーザー情報にアクセスするためのクラス(

ClamAV まとめ

インストールおよび設定

“`
# yum –enablerepo=epel install clamav clamav-update clamd
# freshclam
# vim /etc/freshclam.conf
“`

以下を有効にする。

“`
UpdateLogFile /varf/log/freshclam.log
LogTime yes
PidFile /var/run/freshclam.pid
“`

ClamAV の更新確認

“`
# freshclam
“`
定期的に更新しログに取る。

“`
# vim /etc/cron.d/clamav-update
====
## Adjust this line…
MAILTO=root

# 0 */3 * * * root /usr/share/clamv/freshclam-sleep > /dev/null
0 */3 * * * root /usr/bin/freshclam > /var/log/freshclam.log
====
“`

“`
# vim /etc/sys

PHPの学習メモ

|[../](https://qiita.com/) |
|—|

PHPを初めて使う。学習のメモを残しておきたい。開発環境は、WindowsでEclipse(Pleiades)を使っている。まだシンタックスの理解も十分ではないが、オブジェクト指向的に記述できるので満足はしている。
– Eclipse 2022-06 (4.24)
– PHP 7.4.29
– MySQL 5.6.46 // ちょっと古い

書いた記事の一覧:

– [PHPでAPCuを使って共有メモリにキャッシュを実現する方法](https://qiita.com/taconana/items/0f78a831dab2c2e1cf58)
– [PDOとPDOStatementを掩蔽し、実行したSQLのログを出力する方法](https://qiita.com/taconana/items/087738529fbf6e65ab80)

以上
|[../](https://qiita.com/) |
|—|

PHPでAPCuを使って共有メモリにキャッシュを実現する方法

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

PHPの`APCu`というライブラリを利用してみた。標準のPHPには同梱されていないので、ダウンロードしてDLLを追加した。APCuは「APC User Cache」の略である。APCは「Alternative PHP Cache」の略である。(ちなみに、PHPは「PHP Hypertext Preprocessor」の略である。再帰的な略になっている。GNUの「GNU’s Not Unix!」を真似たのかな。)

JavaとTomcatでは、高速化のため、またDBやファイルへのアクセス負荷を軽減するために、メモリ上にキャッシュを作成して利用することがたびたびある。探索時にはメモリ上のキャッシュから探し、なければDBやファイルから検索したり、読み込んだりする。PHPでは、ブラウザで画面が遷移するごと(redirectするごと)に新たなプロセスが生成されるので、メモリ上に生成したオブジェクトを単純には共有できない。プロセス間で共有メモリ上

PHP8.0のUNION型のおかげで型指定の幅が広がる

## UNION型とは
型を`union`として宣言すると、ひとつではなく
**複数の異なる型を値として受け入れる**ことができます。
union型は、`T1|T2|…`という文法を使って指定します。

## 今までのコード
PHP8以前はプロパティ、パラメーター、および戻り値の型に対して**単一の型しか宣言**できず
PHPDocで補完することしかできませんでした。

“`php5
class Foo {
/**
* @var int|float $num
*/
private $num;

/**
* @var int|float $a
* @var int|float $b
* @return void
*/
public function test($a, $b): void
{
$this->num = $a * $b;
}
}
“`

## UNION型を使用
PHP8.0からはこのように書くことができます。
“`php5
class Foo {
private int|float $num;

public fu

【PHP】西暦から和暦を返す関数

調べれば山ほど出てくる日本人御用達関数です。
どっかで拾った関数を魔改造したものなので似たものがある場合はご了承ください。

“`php
function get_wareki($year, $format = false, $gannen = false) {
$gengoList = [
[‘name’ => ‘令和’, ‘name_short’ => ‘R’, ‘year’ => 2019], // 2019-05-01,
[‘name’ => ‘平成’, ‘name_short’ => ‘H’, ‘year’ => 1989], // 1989-01-08,
[‘name’ => ‘昭和’, ‘name_short’ => ‘S’, ‘year’ => 1926], // 1926-12-25′
[‘name’ => ‘大正’, ‘name_short’ => ‘T’, ‘year’ => 1912], // 1912-07-30
[‘name’ => ‘明治’, ‘name_short’ => ‘M’, ‘year’ => 1

PHPのarray_mergeは配列のindexを振りなおす。連想配列の数字のindexを維持して結合したい際は足し算で結合しよう。

## array_mergeは添字を振りなおす

“`php
$left = [
2 => ‘2’,
1000 => ‘1000’
];

$right = [
5 => ‘5’,
2000 => ‘2000’
];

$result = array_merge($left,$right);

“`

とした場合、この連想配列の`array_merge`の結果は、連想配列が維持されません。

“`php
array (
0 => ‘2’,
1 => ‘1000’,
2 => ‘5’,
3 => ‘2000’,
)

“`

になります。
同様に引っかかった人が多いのか、`array_merge`のドキュメントを読んでみると、このことが念入りに書いてあります。
[***「入力配列の中にある数値添字要素の添字の数値は結果の配列ではゼロから始まる連続した数値に置き換えられます」***](https://www.php.net/manual/ja/function.array-merge.php )。
なんでや! by 犠牲者N号

Laravelの404エラーページを、bladeの中だけで簡潔にフロントページと管理画面でデザイン変更したい

## シンプルに三項演算子とPHPを使って分岐を作ろう
通常はフロント用のレイアウト用の共通ファイルを、/resources/view/layoutsに入れて使っていればこのように書いているとします。
404エラーは、フロント用のデザインに404エラーを表示しますね。
“`php:404.blade.php
@extends(‘layouts.frontend’)
“`
フロントと管理画面で、404エラーのデザインを分けたいので、
管理画面用に別途用意した、admin_error.blade.phpを/resources/view/layoutsに入れておきます。

管理画面のURL(/admin)かどうかを
URIの2つめにadminが入っているURLかで
判別して、レイアウト共通ファイルを分岐させてやります。

“`php:404.blade.php
@extends((explode(“/”, $_SERVER[‘REQUEST_URI’])[1]==’admin’?’layouts.admin_error’:’layouts.frontend’))
“`

こんな感じ

GoogleAIを使ったアナログデータデジタル化プロジェクト#1

世の中に沢山あるアナログデータ、特に検査機器のジャーナルプリンタより吐き出される印刷物のデジタル化は医療業務では今後不可欠となると考え、GoogleAIを利用した例として、今回は動物血液検査機器の検査結果プリントアウトをiPhone(iPad)にて撮影データ転送と共にGoogleのテキスト解析AIにて結果データを抽出し、データベース化を図るというものです。
先ずは、カメラにて撮影さらに検査結果部分をトリミング。

トリミングされた結果データ画像をサーバへ転送と同時にGoo

Laravelのマジックナンバーの解決方法

# はじめに

月1でテーマを決めてアウトプットをするいう試みをはじめてみました。今月はリファクタリング関連の勉強をしてアウトプットします。今回はコードレビューを受けたときに最も指摘を受ける頻度が高いと思われるマジックナンバーを取り上げたいと思います。

# マジックナンバーとはなんなのか?

以下はマジックナンバーの簡単な例です。

“`php

【PHP】PHPでヒット&ブロー

ヒットアンドブローとは、何桁かの数字を入力し数を当てる数当てパズルゲーム。

ランダム数値4桁に対して、入力した4桁のヒット数とブロー数を求める。

Hit数  
同じ数字が同じ桁に出現する回数
Blow数  
同じ数字が違う桁に出現する回数
# 入力値4桁
“`
2345
“`
# コード
“`PHP
$v){
if((int)$v === $number[$k]){
$hit_cnt++;
}
if(in_array($v,$number)){
$blow_cnt++;
}
}
echo $hit_cnt,’:ヒット’,$blow_cnt,’:ブロー’,PHP_EOL;
echo ‘コンピュータ