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

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

フレームワーク無しHTMLテーブルをBootstrapで再現する場合

過去に作ったフレームワーク無しのHTMLテーブルを、Bootstrap(5)で同じように再現しようとすると、
過去、手抜き、つまりborder-bottom: noneなどで罫線を消してセル結合っぽくしている場合、
(HTML的にはダメですが、ループを回してDBを表示する場合めんどくさくてつい…)
融通がきかなくて困る場合があります(した)。

##こういうテーブルです
![テーブルサンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458322/95270db3-5f40-70b3-90fe-3c011720d443.png)

##手抜きをBootstrapで再現
###HTML

* 罫線無しのテーブル(table-borderless)にして、個別にborderを設定する
* 同列の前行が違う値だったら、border-topを追加設定する

“`html

【PHP】平日のみの日付リストを日数指定で取得

土日祝日を除いた平日の日付リストを日数指定で取得します。
祝日判定には以前作成した[祝日取得クラス](https://qiita.com/akebi_mh/items/82cf4dbe70ac9913beb1)を利用してみました。

“`php:weekdays.php
holiday = new Holiday;
$this->startDate = new DateTimeImmutable;
}

public function setStartDate($ymd = ‘now’) {
$this->startDate = new DateTimeImmutable($ymd);
}

private function isHoliday($date) {

【EC-CUBE】XMLを出力したい【4系】

**経緯**

EC-CUBE4系の案件にてXMLを出力する仕様だったので対応。

#手順
Controllerは普通に書きますが、アノテーションに「defaults={“_format”=”xml”}」を定義します。
XMLフォーマットは画面同様twigにて記載します。
試しに指定したidのCustomerデータを表示するようにしてみます

“`php:app/Customize/XmlController.php

class XmlController extends AbstractController {

/**
* @Route(“/xml/customer/{id}”, name=”xml_customer”, defaults={“_format”=”xml”}, requirements={“id” = “\d+”})
* @Template(“Xml/customer.twig”)
*/
public function customer(Request $request, Customer $Customer) {

Ubuntu 20.04にPHPを複数インストールして切り替える方法(PPA・apt)

# はじめに

本書では、Ubuntu 20.04に、PHPの環境をインストールする方法をまとめます。

案件によってPHPのバージョンが違うこともあるため、複数のバージョンをインストールして、alternativesで切り替えられるようにします。

# インストール手順
## リポジトリ追加

“`bash
sudo add-apt-repository ppa:ondrej/php
“`

## apt update

“`bash
sudo apt update
“`

## PHPをインストール

ここでは、本ページ執筆時点で最新の、8.0をインストールします。

“`bash
sudo apt install -y php8.0
“`

他に、複数バージョンの切り替えを確認するため、本ページ執筆時点で有効な、7.3、7.4もインストールします。

“`bash
sudo apt install -y php7.3
sudo apt install -y php7.4
“`

## PHPモジュールをインストール

“`bash
sudo apt sea

【PHP】継承とオーバーライドについて

基礎の基礎に戻ってみました。

## 継承とは
すでに存在しているクラスを元にして、新しいクラスを作ること
元のクラスの事を**親クラス、基底クラス**と呼びます。
新しいクラスは**子クラス**と呼んでます。

### 継承することのメリット
親クラスで定義した関数を、子クラスでも同じように使用することができます。
これによって、同じような処理を複数書かなくて良くなります。
+コードの可読性も上がるので、メンテナンスがしやすくなります。

### 継承の使い方
`class 子クラス名 extends 親クラス名{}`という形で継承することができます。

“`php
test();

//出力結果///////
親クラスの

コードプロファイラによる処理時間増加問題

# はじめに
実装機能の処理時間を調査しているときに、実装箇所とは別のところで大幅に時間がかかっている問題に遭遇しました。
その時の原因と、おまけで計測処理について自分用に記録します。

# ざっくり言語・フレームワーク
言語:PHP
フレームワーク:FuelPHP

# 原因
***結論:コードプロファイラがオンになっていたため***

より細かく処理時間をログ出力して、原因を調査してみたところ最後のレスポンスを返すところまでは問題ありませんでした。

お手上げ状態の時にたまたま、コードプロファイラの存在を思い出し、オフにしてみたら解決しました。
プロファイラでは、プログラム実行時の様々な情報が確認できその中で実行されたSQLも確認できる。今回、かなり多くループ処理でSQL文(4~5万)が実行されていたた。そのすべての情報をプロファイラで出力されていたためプロファイラの処理に時間がかかったと考えられる。

### (コード)プロファイラとは?
> プロファイラとは、コンピュータプログラムが実行される様子を監視・記録し、プログラム中の各箇所の動作順や実行時間などを集計・解析するプログ

【Laravel】ルート情報の記述順によって発生するエラーと正規表現 制約を使った対策

## はじめに

初めてQiitaに記事を投稿します。
ご指摘いただけますと幸いです。

## 1. 概要

ルートパラメータを使用する場合、記述の順番によっては
DBに存在しないデータを処理しようとして、エラーが発生する可能性があります。

今回は、簡単なエラー発生例を記したあと、原因と対策について説明します。

※本記事は初学者向けに詳しく解説しています。

## 2. 環境

– PHP:7.4
– Laravel:6.20

## 3. エラー発生の例

下記前提を踏まえた上で、エラーコードのサンプルを示します。

### 3.1 前提

– ログインユーザーが記事を投稿できるsnsアプリを想定。
– 分かりやすいように最低限のメソッド、ルート情報のみを実装。
– 処理に対するルート情報のURI仕様は下記とする。

| 処理|HTTP Method |URI | Action |Middleware|
|:-:|:-:|:-:|:-:|:-:|
| 記事詳細画面を表示 |GET| articles/{記事のid}

【PHP】 取得する総日数は固定で、土日祝日は除外したい

僭越ながら初投稿

Googleカレンダーから自分の予定を抽出して空き日程を算出するアプリを作成中です
そこで、土日祝を除いた上で指定した日数分の予定を抽出するロジックを作ってみたのでメモがてら

# やったこと
Googleカレンダーから自分の空き日程を取得するアプリを作成中です
その中で、土日祝日を除いたN日分の日数を取る機能が欲しくなりました

例えば`9/3`から14日分の空き日程を抽出したいとなった際、とりあえず素直に開始日の`9/3`を含めて14日後の`9/16`の日付を指定してカレンダーのAPIを叩きます
すると、指定通り`9/3 ~ 9/16`までの自分の予定が取れます

が、`9/4`, `9/5`, `9/11`, `9/12`が土日です
土日祝日はスキップした上で14日分を取りたいので、上記のやり方では土日を除くと10日分の予定しか取れてません

土日祝を除いた14日分の予定を抽出するには以下の計算が必要になります

1. `9/3`から`9/16`の間には土日が4日あるので`9/16`に4を足して`9/20`
2. `9/18`, `9/19`が土日で`9/20

Laravel 6.x リダイレクト時にクエリパラメータを引き継ぐ

# やりたいこと
サービスをスタートしてからパスの構造を整理したりして、コンテンツを引っ越した時に、Laravelにはリダイレクトルートという便利な機能があり、

“`
Route::redirect(‘/old/path’, ‘/new/path’);
“`

“`
Route::permanentRedirect(‘/old/path’, ‘/new/path’);
“`

のように記述して301、302のリダイレクトを行うことができます。こうしておけば旧パスでコンテンツをブックマークしている人にも404を返さなくてすみます。便利。

ただ、この`redirect`や`permanentRedirect`はクエリパラメータを引き継いでくれないようで、例えば

`http://your.domain/old/path?param=hello`

のようなURIにアクセスされても

`http://your.domain/new/path`

にリダイレクトされてしまいます。パラメータを捨てられてしまうと動的なコンテンツはまともに生成できなくなってしまったりするので困りま

PHPで連想配列をPostgreSQLのpsql風にテーブル表示する

連想配列をPostgreSQLのpsql風にテーブル表示するコードです。
こんな感じで出力されます。

“`
actor_id | first_name | last_name | last_update
———-+————+————–+————————
1 | Penelope | Guiness | 2013-05-26 14:47:57.62
2 | Nick | Wahlberg | 2013-05-26 14:47:57.62
3 | Ed | Chase | 2013-05-26 14:47:57.62
4 | Jennifer | Davis | 2013-05-26 14:47:57.62
5 | Johnny | Lollobrigida | 2013-05-26 14:47:57.62
6 | B

【PHP・デバッグ】PHPのデバッグに役立つ関数

##はじめに
はじめまして、プログラミング初学者のbookkuunです。
学んだことをQiitaでアウトプットしていきます。
記事に気になる点がありましたら、ご指摘・アドバイスよろしくお願いします。

今回は、PHPのデバッグについて整理していきます。

##対象者
– PHPを学び始めて間もない方
– PHPのデバッグ方法を整理したい方

##構成

– [デバッグとは?](#デバッグとは)
– [PHPのエラーの種類](#phpのエラーの種類)
– [デバッグ方法](#デバッグ方法)
– [print_r](#print_r)
– [var_dump](#var_dump)
– [var_export](#var_export)
– [error_log](#error_log)
– [まとめ](#まとめ)
– [おわりに](#おわりに)
– [参考資料](#参考資料)

##デバッグとは?
デバッグ(debug)とは、プログラムにあるバグや欠陥を発見し、正しく動作するようにするための作業です。

##PHPのエラーの種類

| エラー |

PHPStan 0.12.97 で literal-string が使えるようになっていた

`literal-string`とは何かというと、PHPDocに書いて安全な文字列かどうかをチェックするための型のようだ。

https://github.com/phpstan/phpstan/issues/5507

ここにfeature リクエストがある。
何が変更されたかというと・・・

https://github.com/phpstan/phpstan-src/pull/638/files

これだけ!?
と思ってソースを確認したら

https://github.com/phpstan/phpstan-src/commit/a5eb5b5982c867b34c8d92530a01f70f559cac43

ここでちゃんとした実装がコミットされてた。

これは便利と一瞬思ったけど、自分が必要なユースケースとはちょっとズレてるんだよなあ…。

https://github.com/nishphp/phpstan-safestring-rule

まだこの自作の拡張を使う必要があるようだ。

配列処理スピード比較

##配列のループ処理の速さは??
配列の要素に対して処理を行いたいことはよくある話だが何が一番早いのか検証してみた。

ちなみに配列

“`php

$array = array();
for($i = 1; $i < 100000; $i++){ $array[] = $i; } ``` 処理させる内容 ```php function hundredNumber($n){ return $n * 100; } ``` 処理速度を測る関数はこちらを参考にさせていただきました。 >[PHPの処理速度の計測方法](https://qiita.com/HidakaRintaro/items/8893f1a36709eee3582f)

#foreach
定番の配列処理

“`php
$start = hrtime(true);

$result_array = array();
foreach($array as $num){

$result_array[] = hundredNumber($num);
}

$end = hrtime(true);

ec

PHP初心者に超オススメのUdemy講座6つを厳選!web入門者必見

この記事では、Udemyのオススメ初心者向けPHP講座を紹介します。

・未経験だけどwebアプリケーションを作れるようになりたい
・将来的にサーバーサイドエンジニアになりたい
・自分でコードを書くかは未定だけど、ウェブサービスを作って起業したい

といった人にオススメできるものをチョイスしました。

## PHP+MySQL(MariaDB) Webサーバーサイドプログラミング入門
おすすめ度:★★★
・[PHP+MySQL(MariaDB) Webサーバーサイドプログラミング入門](https://px.a8.net/svt/ejp?a8mat=3BBPJR+AVR8TU+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fphp7basic%2F)
### この講座で学べる内容
・PHPの基礎知識とMySQL(MariaDB)の基礎が修得できる
・SQLの基礎が修得でき、データベースを利用したプログラムを作成できる
・PHPを利用したプログラムを作成でき、サーバーサイドのWebサービスを開発できる
・デー

単一責任の原則をLaravelで学習した

単一責任の原則について調べていると「**クラスとメソッドは1つの責任だけを持つべき**」など諸々調べると出てくるが、概念的にはわかるもののいまいちコードに反映することができていなかったので、モヤっとしていた。
そんな時に、いい感じのサイトに出会えたので勉強がてらまとめておく。

いい感じのサイト↓
[Laravelベストプラクティス](https://github.com/alexeymezenin/laravel-best-practices/blob/master/japanese.md#%E5%8D%98%E4%B8%80%E8%B2%AC%E4%BB%BB%E3%81%AE%E5%8E%9F%E5%89%87)

## 実際にコードを見てみる

以下に登場するコードは上記のサイトから転記したものです。

### 単一責任の原則に反するコード

“`php
public function getFullNameAttribute()
{
if (auth()->user() && auth()->user()->hasRole(‘client’) && auth()

PHPでselectBox作ってみた

##PHPでselectBox作ってみた

タイトル通りです。

“`php
“;
foreach($busho_list as $key => $busho){

$selected = “”;
if($key === $select_option){
$selected = “selected”;
}
$select_box .= ““;
}
$select_box .= ““;

echo $select_box;

“`

変数$select_optionにデータベースから取得した値を代入することでデフォルトの選択を動的に変更することができます。

$busho_list自体もマスタなどか

dockerでphpのサーバーを立てる

カレントディレクトリにphpファイルを置く。

“`index.php


PHP Test


Hello World

‘; ?>


“`

apacheが含まれているdockerコンテナを動かす。

“`
docker run -it –rm –name php -p 80:80 -v $PWD:/var/www/html php:apache
“`

サーバーが立つ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396969/05423136-a2ba-c02e-45c7-9243910d854c.png)

【5枚目】おっさんが入門CakePHP (動画第6回:新規登録の解説)

ケーキも5枚目に成ってかなり胃もたれしてきてます。。。
動画再生(2倍で)娘に又それかよって言われながら進めてます。

今回の動画でやること
・新規登録の動きを確認
・Code解説 新規登録画面を開く
・Code解説 ユーザ登録をする

前回配置したソース類を使用してお勉強するので今回はほ見るだけ。(ソースは追いかける)

いつも通りXAMPPからApacheとMySQLを開始して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102625/490a1040-332e-f875-ba86-70471027628f.png)

WEBブラウザで画面動作確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102625/d8eb87dc-513c-2bc3-c467-c68b5a95deb9.p

Laravel Sail 導入時に発生したエラーと解決方法

Laravel Sailを使ってLaravelをインストールしてみようとしたときのうっかりミスとその解決方法。

## うっかり編
[公式ページ](https://laravel.com/docs/8.x/installation#getting-started-on-macos)に書いてあるインストレーションを進める。

“`bash
$ curl -s “https://laravel.build/example-app” | bash

docker: Error: remote trust data does not exist for docker.io/laravelsail/php80-composer: notary.docker.io does not have trust data for docker.io/laravelsail/php80-composer.
See ‘docker run –help’.
bash: line 16: cd: example-app: No such file or directory

Please provide yo

【実務で使えるLaravel】取得したデータを配列に追加する方法

実務の学びを記事にします。

取得したデータを配列に追加する方法です。

“`php
$hoge = array();
$categories = $this->category->findCategories();
foreach ($categories as $category) {
array_push($hoge, $category->category_name);
}
“`

$categoriesはコレクションでカテゴリーデータを何件か取得するロジックです。
まず、$hoge = array()で空の配列を用意し、array_pushで配列の最後に要素を追加できます。

“`
array:3 [▼
0 => “85HCKP3sfL”
1 => “XOF4msHVdd”
2 => “ir10PRKDGp”
]
“`

こんな感じで配列にカテゴリーの名前を追加できます。

もう一つプラスαで覚えておくべきは、in_arrayです。

“`php
if