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

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

PHP traitについて

複数のtraitを、クラスに持ってこれる。

## traitを使った例文

“`

元記事を表示

abstructと、Interfaceを、10行で説明してみた

### Interface

・classの代わりに、interfaceと頭につける(ex. interface ProductInterface{ …})

・複数のクラスを継承できる

・メソッドの内容しか書けない

・継承で使う際には、implementsを記入する必要がある

・インターフェイス複数でしか継承する際に選択できない?

### abstruct

・中身を書いてはいけないのは、interfaceと同じ

・クラスとしての役割も持っている。

元記事を表示

2歳息子「パパ,PHP の Carbon はミュータブルだよ?」

## リモートワーク中のある日
ワイ「(カタカタカタカタ・・・ッターン!)」

息子(2歳)「パパ,お仕事捗ってそうだね!」

ワイ「仕事?ちゃうで.これは自分専用の**ダイエット管理ツール**や!」
ワイ「リモートワークやと,仕事せんでもバレへんからなぁ」
ワイ「Slack だけ**即レス**しとけば,仕事できる男に見えんねん」
ワイ「その他の時間は個人開発や!」

息子「パパ最近**リモートワークで外に全く出ない**から,お腹周りがぷにぷにだもんね」
息子「ダイエット管理で体重が減っても,仕事もしてないからお給料も減っちゃうよ?」

ワイ「弊社は**給与自己決定**やから,仕事せんでも給料はもらえるねん」

社長「(お前 Discord **ミュートにし忘れてて**全部聞こえとるからな...!)」

## 新しい機能を追加したい
ワイ「よしよし,新しい機能でも追加するか!」
ワイ「1ヶ月前の自分の体重と,今日の体重とで」
ワイ「どれだけ差があるかを計算する機能を作るで」
ワイ「体重が1kg以上減っていたら,アプリ内通貨の”痩せコイン”がもらえる仕組みや...!」
ワイ「今流行の *

元記事を表示

PG見聞録 ~PHP編 トレイト~

梅雨入りしましたね~
低気圧弱いマンにとっては最近の気圧の乱れは非常に堪えますね…
今日はトレイトについておさらいしていきます。
以前laravel(というかcomposer?)で生成されるvendorファイルを見漁っていたら
Traitという文字を見かけて何ぞやと思い調べたのが始まりです。

トレイト

トレイトとは「再利用可能なコードをまとめて切り出しておくための仕組み」のことです。
日本語訳を調べてみると「特性」や「特徴」といった意味があるようです。
継承やインターフェースと似ているようで違うので見ていきましょう。

“`php

元記事を表示

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)
– [PHPのforeachでは、多くの場合、参照渡しの方がいい?](https://qiita.com/taconana/items/e1a568de0b39b60c4dce)

以上

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号