PHP関連のことを調べてみた2021年12月15日

PHP関連のことを調べてみた2021年12月15日

PHPの遅延静的束縛 〜継承と委譲を添えて〜

## はじめに

すみません、タイトルは遊んでいます。
PHPと遅延静的束縛と、オブジェクト指向の継承、委譲について解説します。

前提としてオブジェクト指向の継承を理解しているものとします。
そのため、オブジェクト指向の継承について理解できていない場合は、より混乱すると思われます。

## この記事を書いた動機、または背景

弊社のサービス拡張を実装している中で
共通処理をSuperクラスに定義してパラメータをSubクラスから変更する意図をもった既存コードがありました。

今回の拡張ではパラメータだけではなく、SuperクラスのメソッドをSubクラスでオーバーライドして
オーバーライドしたメソッドをSuperクラスの共通処理から呼び出したかったため遅延静的束縛を利用しました。

なお、そもそもの話としてSuperクラスからSubクラスでオーバーライドしたメソッドを呼び出すことの是非、
及び継承関係を利用した実装より委譲を利用した実装にするべきではないか、ということも検討してみます。

## サンプルコード1

前提として下記のコードがあります。

“`php

元記事を表示

PHPによる疑似的なイミュータブルとムーブセマンティクスモドキ

# [PHP Advent Calendar 2021](https://qiita.com/advent-calendar/2021/php) 15日目

https://qiita.com/advent-calendar/2021/php

前日は@hanhan1978さんの[複雑度の上がったLaravelをミドルウェアから眺める方法](https://qiita.com/hanhan1978/items/c572c1daa92f995f31e0)でした

早速本題というか軽い説明と実装に入ります

# 【実装】イミュータブル

イミュータブルとは不変である事を意味しますが、今回は**再束縛・再定義・再代入全ての意味で不可**という意味で使います
簡単に言うとjavascriptのconstです

phpによる実装の前に`nodejs`と`deno`における`const`の確認から始めます
### nodejsのconst

“`js
Welcome to Node.js v17.2.0.
Type “.help” for more information.
> cons

元記事を表示

非同期ってナンダ

# 前書き

本記事は非同期についてひたすら大雑把に綴っています。主にPocketMine-MPを利用している開発者の方々へ、またphp前提のお話となっております。

# 1. 非同期?

### 疑問

しばしば目にする単語ではありますがイマイチ概要のつかめない、得体の知れないものだと思います。他人のプラグインをのぞいてみると、`AsyncTask`なんかを使っていたり。

非同期ってなんなんだろう…

### 答え

非同期とはズバリ、**メインスレッド**に対して**処理や通信の内容が別の場所で実行される**ものです。

下記のコードを参考にしてみましょう。`echo “1”`が実行された後`async()`という非同期関数が実行されると、この場合`echo “2”`が`async()`の実行結果を**待たずに**実行されます。

“`php
echo “1”;
async();
echo “2”;
“`

### つまり?

要はメインスレッドで重い処理をしてしまうと、**その処理が終わるまで次の処理に移行できない**わけです。別の場所に役割を分担できればその分早く処理

元記事を表示

Github Actions を使った PHP の静的解析

Hamee Advent Calendar 2021 15日目の記事です。
https://qiita.com/advent-calendar/2021/hamee

## はじめに

Q. 綺麗にコード書きたくね?
 
A. はい。

## 静的解析とは

>静的コード解析(static code analysis)または静的プログラム解析(static program analysis)とは、コンピュータのソフトウェアの解析手法の一種であり、実行ファイルを実行することなく解析を行うこと。逆にソフトウェアを実行して行う解析を動的プログラム解析と呼ぶ[1]。静的コード解析はソースコードに対して行われることが多く、少数ながらオブジェクトコードに対して行う場合もある。

Wikipediaより引用

つまるところ、機械的にコードを分析して悪いところ見つけてくれるってことですね。
例えば、IntelliJ にある PHP の静的解析は以下の画像ような指摘をしてくれます。
![ 2021-12-14 16.30.53.png](https://qiita-image-store.s3.ap-n

元記事を表示

Laravelで❝サービスクラス❞を排除したクリーンな設計

## はじめに

普段は FuelPHP で書かれたレガシーなアプリケーションの開発をおこなっているのですが、新規サービス立ち上げに伴い Laravel を導入することになり、四苦八苦しながらクリーンな設計を模索しました。

以下、本記事を読むにあたっての注意点です。

* マルチページアプリケーションでMVCモデルの設計である

* Eloquent Model の機能をフル活用するため、リポジトリパターンは諦めている

* 多目的な❝サービスクラス❞がないだけで、サービスクラス的なものは存在する

## ❝サービスクラス❞の問題点

サービスクラスはその性質上、いろいろな場所から呼ぶことができるため、適切に責任を分離しておかないとなんでもかんでも詰め込まれてしまい、すぐに肥大化してしまいます。

そして、いろいろな場所から呼ばれているがために、一度肥大化してしまうと、それを適切なクラスに分離していくという作業はとてつもなく労力がかかります。

また、サービスクラスにきちんと制約を設けていないと、いつの間にかなんでもありのクラスになり(個人的には名前がいけないと思う)、1つのサービス

元記事を表示

クラスチャットを作る #1

# はじめに
クラスチャットを作りたい方、いないとは思いますが、一応備忘録としてここに書いておきます。

:::note warn
必ずしも動くとは限らないので自己責任でお願いします。
:::

# 使用言語・ライブラリ等
言語は

– PHP
– JavaScript
– HTML
– CSS

てな感じで、ライブラリは

– jQuery

コレだけ。

# サービスの形態

– マネージャシステム(管理・運用)
– リアルタイムチャット
– 課題・アンケート機能
– チャネル機能
– ログイン機能(クラスの人一人一人にアカウントを付与)
– タイムライン機能

みたいな感じです。
クラスの人に好評だったらこれを元にSNSサービスでも作ろうかと。

:::note warn
いかにもできそうな感じで書いてはいますが、全然できないかもしれません。
:::

# おわりに

クラスチャットの記事は一旦寝るので中断。また明日出します。
好評であればGitHubで公開でもしようかな。

元記事を表示

【PHP】月を配列で取得する方法(Carbon, CarbonPeriod)

## まず初めにCarbon とは

phpで日付処理を行う時にとっても便利なのがCarbonです。
今日の日付や指定した日付など、支持してあげれば欲しい日にちを持ってきてくれます。

### 使えるようになるまで(インストール)
“`
composer require nesbot/carbon
“`

“`
//Laravelなら、利用したいファイルでuseしよう
use Carbon\Carbon;
“`

## 基本的な利用法

“`php
$date = new Carbon();
$date = Carbon::now(); // 現在時刻
“`

とまぁ、こんな感じで便利に利用できるのがCarbonさんです。
今回は、Carbonさんを利用して以下のような配列を作ってみようと思います。

“`
現在 2021年12月14日
array:49 [▼
0 => “2019年12月”
1 => “2020年01月”
2 => “2020年02月”
3 => “2020年03月”
4 => “2020年04月”
5 => “2020年05

元記事を表示

複雑度の上がったLaravelをミドルウェアから眺める方法

この記事は、[PHP Advent Calendar 2021](https://qiita.com/advent-calendar/2021/php)の20日目です。

https://qiita.com/advent-calendar/2021/php

## 複雑度の上がったLaravelとは

[採用情報](https://corp.kaonavi.jp/recruit/list/#engineer)にも記載のある通り、私の所属するカオナビ社では PHP(Laravel) でWebアプリケーションを作成しています。

カオナビがビジネスとして成長していく中で、提案・要望による機能追加・仕様追加が行われてきました。これに伴って、理解しなければならない条件・情報も増え、プログラムのファイル数、ディレクトリ数も増えていき、アプリケーションは複雑になっていきます。このような状況を、**複雑度が上がる**と表現します。

サービスが続く限り、どうしても複雑度は上昇していきます。しかし、人間の認知能力には限界があります。一度に脳内に詰め込んで考えることが出来る量には限りがあり、かつ劇的に

元記事を表示

ホリデープロジェクトの安全性を確保する

今年もまた、一年間待っていたプロジェクトを中断することなく進められる季節がやってきました。新しいコンテンツ管理システムの構築でも、お気に入りのオープンソースプロジェクトのプラグインでも、ホリデーシーズンは開発者が1年中待っていた特別なプロジェクトを作り上げることができる時期です。

ただし、プロジェクトの安全性を確保すること、特にオープンソースのライブラリやコンポーネントに可能な限り脆弱性がないことを確認することが重要であることを忘れないでください。脆弱性の可能性がないかコードをスキャンするだけでなく、プロジェクトを安全に保ち、エンドユーザーを可能な限り安全にすることが非常に重要なのです。

この記事では、Snyk CLIを使ってSCAとSASTのスキャンを行うことで、プロジェクトの安全性を保つ方法を見ていきたいと思います。このツールを使うと、パッケージマニフェストをスキャンしてオープンソースの脆弱性を探したり、コードをチェックして安全性を確認したりすることができます。

## いくつかのコードで遊んでみましょう

休暇中の最大の問題は、どのプロジェクトを行うかを選ぶことです。アイデ

元記事を表示

【CodeIgniter3(コードイグナイター)】のテーブルヘルパー(クエリをテーブルにする)

“`PHP
$table = array(‘table_open’ => ‘

‘,);

$this->table->set_template($table);
$query = $this->db->query(‘SELECT * FROM M_sobi_data’);
echo $this->table->generate($query);

“`

#結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/bfac777f-0ebd-f15a-6584-c9eb3b388442.png)

【CodeIgniter3(コードイグナイター)】のテーブルヘルパー 空のセル埋める

“`PHP

$this->load->library(‘table’);

$table = array(
‘table_open’ => ‘

‘,
);

$table_data = array(
array( ‘会員ID’, ‘名前’, ‘年齢’),
array( ‘200001’, ‘山田 太郎’, ”),
array( ‘200002’, ‘鈴木 一郎’, NULL),
);
$this->table->set_empty(‘[不明]’);
echo $this->table->generate($table_data);

“`

#結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/a10bdeac-4b41-ef0e-52f3-8d9d74561d17.png)

【CodeIgniter3(コードイグナイター)】のテーブルヘルパー(列数を統一して空白のtdを埋める)

“`PHP
$this->load->library(‘table’);

$table = array(
‘table_open’ => ‘

‘,
);
$th = array(‘会員ID’, ‘名前’, ‘年齢’);
$td = array(‘one’, ‘two’, ‘three’, ‘four’, ‘five’, ‘six’, ‘seven’, ‘eight’);
if(count($td)%3 > 0){
array_push($td, ‘調査中’);
if(count($td)%3 === 2){
array_push($td, ‘調査中’);}
}

$this->table->set_template($table);
$this->table->set_heading($th);
$new_list = $this->table->make_columns($td, 3);
echo $this->table->generate($new_list);

Laravel Carbon Period 期間を配列取得

#### CarbonPeriodって?
* [公式ドキュメント](https://carbon.nesbot.com/docs/#api-period “CarbonPeriod”)
* **CarbonPeriod**
* Carbonのライブラリに含まれている期間を扱うためのクラス

#### 使いどころ
20XX年X月度日別アクセス数の集計するときとか…
年代別にユーザーを取得するときとか…
要するに特定の期間を指定した間隔で取り出して配列でゴニョゴニョしたいとき

#### 前提条件
* Carbonのversionが1.29以降

#### 個人的によく利用する方法
* 秒単位

“`
$period = CarbonPeriod::create(‘2021-12-01 00:00:00’, ‘2021-12-01 00:01:00’)->seconds()->toArray();

// 2021-12-01 00:00:00, 2021-12-01 00:00:01, 2021-12-01 00:00:02…
“`
* 分単位

“`
$period = Ca

継承 〜魔法戦士への道〜

## 経緯
1年ほど前に上司にペアプロをしてもらった際に継承について知識があやふやだったため、有名なRPGの例えで説明してくれました。
この例え自体知ってはいたけど、上司の説明が一番個人的にわかりやすかったです。自分も部下に全く同じことを喋りたかったのでメモ帳に封印していたのですが、使う機会がないので投稿。

## 継承
1.一つのクラスは一つの親クラスを持っていて2つは持てない
ex.魔法使いクラスがあって、戦士クラスがあるとする

2.勇者タロウ(以降太郎)は魔法使いクラスを継承して太郎クラスになっているとする
= だから太郎は魔法が使える

けど、太郎は剣で戦うこともできるから剣の継承もしたい…
でも太郎は魔法使いを継承してるからできない…

**「だから、魔法使いと戦士をtraitにすればどちらも継承して魔法戦士太郎」**

つまり、多重継承がPHPだとできないからそれを実現しようとしている

共通の親がいないとした時にそれぞれの親を一箇所に書きたいときにはtrait使ってuseしちゃえば良い

array_flip

#なんか何度もググっちゃうarray_flip
よく「あれ、これなんだっけ」ってなるので、投稿。

## array_flip

array array_flip ( array $array )
array_flip() は、配列を反転して返す。 すなわち、array のキーが値となり、 array の値がキーとなる。

array の値は有効なキーを必要とすることに注意。 すなわち、キーは、integer または string である必要がある。
ある値が間違った型である場合、 警告が出力され、問題のこのキー/値の組は結果には含まれない。

ある値が複数回出現した場合、最後のキーがその値として使用され、 その他の値は失われる。

パラメータ
array
反転を行うキー/値の組。

返り値
成功した場合に反転した配列、失敗した場合に NULL を返す。

ちなみに、以前拝見したQiitaの記事でarray_keysとarray_flipだと、array_keysの方が処理速度が早いみたいです。
array_flipで同様の実装をしたことがあったので、次に似たようなケースがあればarr

[PHP 初学] 配列とオブジェクトの違いについて「完全に理解した」状態にする

この記事は [株式会社サイバー・バズ Advent calendar 2021](https://qiita.com/advent-calendar/2021/cyberbuzz) 13日目の記事です。

11日目の記事は [GoogleAppsScript(GAS)で効率化する時になんだかんだよく使うコードスニペット10選](https://qiita.com/kashira2339/items/d0e399a97bf586132ea1) 、
14日目の記事は [マイクロサービスアーキテクチャにおけるProtocolBuffers管理のGitHubActionsフローを実現した](https://qiita.com/Hirochon/items/1aab7ff0dab5a1159659) です。

**PHP 初学者向け**の記事です。

本記事では**「配列とオブジェクトを完全に理解した」状態**になるため必要な

– **PHP における配列とオブジェクト**がなんなのか
– それぞれの**値の取り出し方**

についてまとめました。

# 配列

**複数の値**を

HTML,CSSで作った静的サイトをデプロイしてみた話

今回ポートフォリオサイトを僭越ながら作成しデプロイまで行ったのでちょっと書きます。

#使用したモノ
・HTML
・CSS
・Heroku(今回のデプロイ先)←無料でいけるヨ

#1 そのままデプロイできない…
HTMLファイル、CSSファイルだけだとHerokuに認められなかったです。

そこで一番簡単そうな方法を調べると、PHPアプリに改造するのが良いみたいですのでそうします。

#2 PHPファイルに大変身(超簡単だぜ!)
ルートディレクトリにindex.phpファイルを作成し以下を記入

index.php

“`

“`
#3 Json氏をジョイン
package.jsonファイルをルートディレクトリに作成し以下を記入

“`
{}
“`
#4 GitHubにPush!!
githubにpushします。

こちらの方の記事が大変参考になるかと思いますのでわからない方はどうぞ。
https://qiita.com/Toshimatu/items/f71a935612a55d6e674e

#5 H

Laravelで自作のバリデーションのルール(Rule)を使う際に躓いた事

Laravelのバリデーションで、
独自のルールをrulesで利用する際に躓いた箇所が有ったのでその部分について書いています。

Laravelのバージョンは7です。

#ルールを作成する
作成するところまでは、以下の記事を参考にしました。
[Laravelでバリデーションのルール(Rule)を追加する!](https://codelikes.com/laravel-add-validation-rule/)

#今回躓いたところ
今回バリデーションで追加したruleを使う際に、既に他の作業者が以下の記法でrulesを作成していました。

“`php:Requests/SampleRequest.php
public function rules()
{
return [
‘column’ => ‘required|max:255|exists:table,condition’,
];
}
“`

記事を愚直に真似てみた感じです。。。
これだと上手く動かなかったです

“`php:Requests/

WSL2にdockerをインストールしてみた

# なんでわざわざWSL2に?

「[docker for windows](https://docs.docker.jp/docker-for-windows/install.html)があるのに、なんでまたWSL2使うのん?」という話。

確かに、**docker for windowsはGUIでコンテナやイメージが管理できる**というメリットがあります。。

ですが、**なにかと動作が重い**と感じたことありませんか? (私や周りの話だとよくある)

そこで、WSL2にdockerを入れてみることにしました!

## WSLのインストール

下記の手順を参考にしつつ、導入しましょう。
https://docs.microsoft.com/ja-jp/windows/wsl/install

* Windowsのコマンドプロンプトを管理者権限で開く

Windows10であれば、`cmd`で検索して、「コマンドプロンプトを」右クリックで「管理者として実行」しましょう。

![スクリーンショット (2).png](https://qiita-image-store.s3.ap-n

アプリの脆弱性もインフラの脆弱性もSnykで全部漏らさず対処しよう!

# はじめに

こちらの記事はアドベントカレンダー[Snykを使ってセキュリティにまつわる記事を投稿しよう!【PR】](https://qiita.com/advent-calendar/2021/snyk)の13日目の記事として投稿しています。

いきなりですが、日々アプリケーション開発に尽力されている開発者の皆様におかれましては、セキュリティに関して下記のような課題感をお持ちではないでしょうか?

– セキュリティに関する問題は**事業存続の危機に発展する可能性があるものの、その担保が暗黙的に開発担当者に任されている状況になっていて重い**
– コードレビュー時に脆弱性チェックもレビューポイントになっているが、それを指摘できるかどうかは**レビュワーのセキュリティ的知見に左右される**ので心もとない
– 自社のコード自体に問題がなくても、それに付随する**OSSのライブラリをアプリケーションレイヤーからインフラレイヤーまで把握しきれないほど使用している**ので、それらが孕んでいる脆弱性をどのように検出・対処すれば良いのか皆目検討がつかない
– 自社ではリソースがないので、外部のベン