PHP関連のことを調べてみた

PHP関連のことを調べてみた

PHPによる自作CSV解析関数の性能についての考察

PHPでCSV解析を行う関数を作ったので性能を検証してみた。1行144文字の100万行のCSVファイルをパースして総なめする。すると12秒ほどかかった。この関数は

* 読み込んだカラムをすべて配列で取得する

という関数で、内部ではバッファに文字を溜めてそれを配列に格納して返り値として返している。

for文のループでカウント変数をカウントするだけのコードで同じ100万行のCSVファイルをなめてみたがこれは0.5秒ほどで終わる。ということはこの関数のコストは11.5秒ほどである。100万行に12秒かかるとレコード数が100万行に達したらそれだけ時間がかかるということで、12秒待つのはなかなかしんどいと思うので、現実的なコストとは言えない。
そこで特定のカラムだけバッファに格納してそれを文字列として返す関数を作ってみたら、これは9秒ほどかかった。そうすると3秒ほど短縮できた。
特定のカラムを検索したい場合にこの関数を使い、レコードのカラム全てを取得したい場合は添え字を戻して12秒の関数を使えば、効率化はできる。ただ、それでも最悪コストは9秒ほどである。
データベースを使った場合はどれぐ

元記事を表示

【Doctrine】ArrayCollectionの便利メソッド3選(filter, map, forAll)

# 初めに
PHPのORMとして知られるDoctrineにはCollectionsと呼ばれるモジュールが存在します。
今回は、その中の機能の一つであるArrayCollectionでよく使うメソッドについて解説します。

# 便利メソッド3選
今回紹介するのは以下の3つです。
* filter
* map
* forAll

## filter
名前の通り、条件に合う要素のみを抽出するメソッドです。
filterの引数に戻り値がbool型のコールバック関数を渡すことで、条件に合う要素のみを抽出します。
コールバック関数に渡せるのは値だけであり、キーを渡すことはできません。

“`php:filterの例
// ArrayCollection作成
$array = [‘key1’ => 1, ‘key2’ => 2, ‘key3’ => 3];
$arrayCollection = new ArrayCollection($array);

// filter処理
$result = $arrayCollection->filter(function($value){
re

元記事を表示

Laravelでmigratinonを実行、Seederでデータを挿入する

:::note
今回はLaravel Sailを使用します。SailはアプリケーションのDockerコンテナ内でArtisanコマンドを実行します。

コマンドを書く際に
./vendor bin sailをsailに省略しています。
:::

今回のハンズオンのリポジトリは以下です。

https://github.com/yamatai12/laravel-sql

# 1. 背景
業務でLaravelを使っているので勉強のために書きます。
今回はmigrationでテーブルを作成、Seederで作成後のテーブルにサンプルデータの挿入をします。

# 2. migrationとは

SQLを使わずにDBを管理できる仕組みです。
以下の流れでTableを作成、削除、編集できます。
– migrationファイルを作成
– migrationを実行

# 3. migrationで作成するテーブルのER図

“`mermaid
erDiagram
employees {
INT id PK “従業員ID(主キー)”
VARCHAR(50) na

元記事を表示

CakePHPで便利なクエリビルダーを使ってみる

# 対象読者
CakePHPでクエリビルダーを使ってみたい人

https://book.cakephp.org/4/ja/orm/query-builder.html

# ソフトウェア環境
|ソフトウェア|バージョン|
|———–|———|
|CakePHP |4.7.5 |
|PHP |8.1 |

今回は、register関数でユーザー登録に成功したら、success関数内でセッションから取得したユーザーIDを使って
一意となるレコードをクエリビルダーで取得する処理です。

“`
$selectUsers = $selectUsersTable
->find()
->select([‘id’,’name’,’username’,’password’])
->where([‘name’=>$targetName,’username’=>$targetEmail,’pass

元記事を表示

CakePHPでページネーションを実装する

# 対象読者
CakePHPでページネーションを実装する方法を知りたい人

# 検証環境
|ソフトウェア|バージョン|
————|———|
CakePHP | 4.7.5|
PHP | 8.1|

# 完成イメージ
イメージはこんな感じです。
1ページあたり表示件数を10件表示するようなページングを実装してみました。

![cakephp1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/542674de-69c3-9bb4-315b-3b5e0608f692.png)

# 実装の手順
実装の手順は下記の通りとなります。
## Controllerにページネーションの機能を追加
Controllerのinitializeクラス(初期化クラス)にページネーションを読み込ませます。

limitプロパティで、件数を指定してあげます↓
今回は、10件表示するように設定しました。
“`
$this->paginate[‘limit’] = 10;

元記事を表示

LaravelでCommand実行する

:::note
command実行できるアプリケーションをLaravelで作る方法
– artisanコマンドでCommandクラス作成
– routes/console.php内に記述
:::

# 背景
業務でphpファイルをコマンド実行することがありましたので復習の為にまとめます。

:::note
今回はLaravel Sailを使用します。SailはアプリケーションのDockerコンテナ内でArtisanコマンドを実行します。
:::

以下が今回の勉強の為に作ったリポジトリです。

https://github.com/yamatai12/laravel-command

以下参考に進めます。

https://laravel.com/docs/11.x/artisan

# Commandクラスとは
コマンド実行後に呼び出されるクラスです、コマンド実行時に行いたい処理を記述できます。

# Commandクラスを作成する

:::note
`./vendor bin sail`を`sail`に省略しています。
:::

“`terminal
sail artisan m

元記事を表示

$request->input(‘key’)は何をやっているの

Laravelでのapi実行が知りたく、api.phpから処理を追っているときに、controllerで`$request->input(‘hogehoge’)`みたいなことを良くしていたためどういうメソッドかまとめる。

## inputメソッド
`$request->input(‘key’)`はどうやらリクエストに含まれる入力パラメータの値を取得しているようだ。
以下の場合、limitというパラメータを探してきて、その値を$limitに入れている。
“`php
$limit = $request->input(‘limit’);
“`
例えば以下のようなリクエストのURLがあった場合
“`
http://XXXXXX.com/api/test-api/XXXXXX?limit=10
“`
limit=10が設定されているため$limitには10が返される。
## デフォルト値
ちなみに、inputメソッドには第二引数としてデフォルト値を指定できる。
“`
$limit = $request->input(‘limit’, 0); // limitがない場合は0を返す

元記事を表示

三項演算子の使い方について(初心者向け)

# はじめに
この記事は三項演算子の使い方について学習した際の備忘録です

修正点および加筆が必要な場合は都度更新します

## 三項演算子とは?
三項演算子は、条件式を使って値を選択するための演算子で、?(疑問符)と :(コロン)を使って表現します。一般的な構文は以下の通りです。
“`js
条件式 ? 真の場合の値 : 偽の場合の値
“`

## 基本的な使い方

例えば、数値が10以上かどうかを判定し、その結果に応じてメッセージを返す例の場合
“`js
let number = 15;
let message = number >= 10 ? “10以上です” : “10未満です”;
console.log(message); // 出力: 10以上です
“`

### ネストされた三項演算子

三項演算子は、入れ子にすることも可能です。ただし、可読性が低くなるため、使いすぎには注意が必要です。
“`js
let score = 85;
let grade = score >= 90 ? “A” : score >= 80 ? “B” : score >= 70 ? “

元記事を表示

PHPドキュメント「リファレンスの説明」の要約

# リファレンスとは?

https://www.php.net/manual/ja/language.references.whatare.php

PHPのリファレンスは、同じ変数の内容を異なる名前で呼び出す機能です。以下にリファレンスの主な特徴をまとめます:

## リファレンスの特徴

1. **エイリアス**: リファレンスは変数のシンボルテーブルのエイリアスとして機能します。

2. **ポインタとの違い**: Cのポインタとは異なり、メモリアドレスを直接扱うものではありません。

3. **ガベージコレクション**: すべてのリファレンスが削除されるまで、参照先のデータはガベージコレクションの対象になりません。

4. **変数の扱い**: 通常の変数もリファレンスとして扱われ、ガベージコレクションの観点からは`=&`で代入されたリファレンスと区別されません。

## リファレンスの動作

– リファレンスを使用すると、複数の変数名が同じデータを指すことができます。
– 配列要素やオブジェクトのプロパティにもリファレンスを使用できます。
– `foreach`ループでリフ

元記事を表示

197日目 APIの実装【準備編】(バックエンド)

仕事でAPIをさわる機会があり、APIってすごいな!と思ったので今後APIをさわる機会がある方が少しでもAPIへの理解が早くできるように初心者ながらにまとめていきたいと思います!

1つにまとめきれないくらい情報があるので分けていきます!
今回は「APIとは?」「環境設定で必要なもの」「ルーティング設定」についてまとめましたので誰かの力になればなによりです!

## 第1話《APIってなんぞやッ!?》

API(Application Programming Interface)は、アプリケーション同士が通信し、データや機能をやり取りするためのインターフェース(仕組み)です。
APIを使うことで、異なるシステムやサービスが相互に連携し、データや機能を共有できるようになります。

**1.データアクセス**
・システムやデータベースに保存されているデータにアクセスし、外部からリクエストに応じてそのデータを提供します。
例:商品情報、ユーザー情報、注文履歴などを取得するためにAPIを呼び出す。

わかりやすく言うと、`フロントとバックを繋げる橋渡し的な役割`です。

**2.機能の理由**

元記事を表示

PHPにおけるNULL安全

# NULL安全とは
 NULLによるエラーをコンパイルまたは静的解析で検出し、実行時にNULLによるエラーを起こさないことです。NULL安全が高いか低いかは基本的にはプログラム言語に依存します。型には基本的にNULL許容型とNULL非許容型があり、それらが別物として扱われることがNULL安全を満たす条件です。理由は後述します。

 PHPにおけると銘打っておきながら、まずはkotlinという言語を例に上げてNULL安全の説明をします。kotlinは静的型付き言語なので基本的に型を定義していくのですが、通常定義される型はNULL非許容型になります。NULL非許容型とはその名の通りNULLを代入できない型のことです。
“`kotlin
//NULL非許容型
var intObject: Int = 10
var stringObject: String = “test”
var sampleObject: SampleObject = SampleObject()

//以下をコンパイルするとエラー(最近はIDEで怒ってくれる)
var intObject: Int = null
va

元記事を表示

phpの参照渡し(リファレンス渡し)を使ってみる

:::note alert
参照渡しは非推奨のようです。コメントに詳細付けてもらったのでそちらをご確認ください。
:::

概要

公式マニュアルには以下のように記載がされています。

リファレンス渡し
リファレンスにより関数に変数を渡すことが可能です。この場合、関数内で その引数を修正可能になります。構文は次のようになります。

マニュアル内では関数での利用法について記載がありますが、私が使用したforeach内での活用方法について記載します。

活用方法

共有する関数内で生成されたオブジェクトにおいて、一部の要素が不要といった状況が発生しました。

オブジェクトの特性

“`tex
・親キーがランダムである
・削除対象の子キーが同一である
“`

上記に倣ったオブジェクトの例

“`php
$data = [
‘123456’ => [
‘aaa’ => […],
‘bbb’ =

元記事を表示

#69 Add Xdebug to existing PHP container projects

## Introduction

I found out there are many outdated setup articles which may not work for the Xdebug 3.1.X version. Therefore I jot down the setup of PHP with Xdebug and docker.

## Setup

edit dockerfile to install xdebug

“` Dockerfile
RUN pecl install xdebug && docker-php-ext-enable xdebug
“`

copy xdebug config to php config folder

“` ini
[xdebug]
xdebug.mode=off
xdebug.start_with_request = yes
xdebug.client_host = “host.docker.internal”
xdebug.idekey=”VSCODE”
“`

In `docker-compose.ym

元記事を表示

チャットGPTさんと語る、スマブラを通してのオブジェクト指向

これはとある時に業界半年に満たない新人の私がオブジェクト指向ってなによ!?

ってなりつつもPHPをお勉強している時に思い付きでチャットGPTさんと会話した際の記録です。

スマブラとかマリオ出てきますし、内容に突っ込みどころがあればコメント頂けたら嬉しいです。

尚、全体的に勉強初めて半年に満たないのですごく専門的な質問されてもあわあわするだけなのであしからず。

しかも都合上会話の途中から切り取っておりますのでご容赦くだしあ。

ほぼ自分のための備忘録的な何かです。

しかも初投稿なのに大半コピペです。

あしからず。

「あなた」とは私の事です。

ChatGPT:
その通りです!親クラスは一般的な属性やメソッドを持ち、子クラスや孫クラスはそれを継承して特定の振る舞いや属性を持つことで、より具体的な存在になります。以下のポイントでこの関係を詳しく見てみましょう。

親クラス、子クラス、孫クラスの関係
親クラス:

親クラスは、共通の属性やメソッドを持つ一般的なクラスです。たとえば、Menuクラスはメニュー全般に関する情報を提供します。
子クラス:

子クラスは、親クラ

元記事を表示

LaravelでDBの同じ行のAとBの値を足した値でwhereしたい

# はじめに

こんにちは、エンジニアのkeitaMaxです。

Laravel11でDBの同じ行のAとBの値を足した値でwhereしたいということで備忘録で書こうとおもます。

# やりたいこと

|a |b |c |
|—|—|—|
|1 |2 |3 |
|10 |2 |30 |

こんなテーブルがあった時に、a+bが10以上のものをとってくる処理を書きたいと思います。

# 結論

“`php
$query->where(DB::raw(‘a + b’), ‘>=’, 10);
“`

こんな感じで`DB::raw`を使えばできました。

# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました!

元記事を表示

CakePHPでセッション情報を別ページで渡す方法

# 対象読者
CakePHPでセッション情報の使い方を知っておきたい方

# 環境
CakePHP 4.5.7
PHP 8.1

# セッションの設定は「app.php」に記述する
セッションの情報は、app.phpに記載します。
さっそくですが、app.phpの全体コードを見てみましょう。

“`config/app.php

元記事を表示

PHPカンファレンス沖縄2024前夜祭 登壇レポート

# はじめに

2024-09-27に、PHPカンファレンス沖縄2024前夜祭で登壇してきました!
10分間のLTなのですが、大変楽しく学びも多かったので、体験レポートを書きます!

## 自己紹介

yoneda です!
株式会社Relicという会社にてEMをしています。
エンジニアイネーブルメントの領域を担当しているグループに所属していて、
具体的には、以下のような業務を進めています。

* DevOps導入
* IaaS(CDK, AWS SAM)
* CI/CD
* 他…
* Webアプリのスケルトンプログラム作成
* スケルトンプログラムは他言語含め、複数あり
* PHP+Laravelの構成のものが利用最多

自分の開発者キャリアの中で、言語ではPHPに最も親しんでいるのもあり、
学びを得たり、自分から何か学びを与えることができたらと、
PHPカンファレンス沖縄に応募しました。

さて、なぜ沖縄なのか。

[沖縄に弊社の拠点がある](https://relic.co.jp/corporate_base/okinawa-innovati

元記事を表示

[Laravel] グループ化したURLでバリデーションが通らなかった

# なぜ?
これだと通らなかった
“`php
Route::group([‘prefix’ => ‘{id}’]function() {
Route::get(‘/’, [TestController::class, ‘index’])->name(‘index’);
Route::get(‘/detail’, [TestController::class, ‘details’])->name(‘detail’);
})->whereNumber(‘id’);
“`

こいつはいけたけど、いちいち`->whereNumber(‘id’)`をつけるんか?って話
“`php
Route::group([‘prefix’ => ‘{id}’]function() {
Route::get(‘/’, [TestController::class, ‘index’])->name(‘index’)->whereNumber(‘id’);
Route::get(‘/detail’, [TestController::class, ‘detail’])->nam

元記事を表示

PHPでpreg_replaceのエラーが出て動かない

PHPをアップデートしたら以下のエラーがでるようになって、Webアプリが動かなくなりました。

“`
preg_replace(): Compilation failed: unrecognised compile-time option bit(s) at offset 0
“`

おかしいと思って調べたら、libpcreの問題らしいことが分かりました。

ChromebookのLinux環境だったので、以下のようにライブラリをアップデートしたら直りました。

“`sh
sudo apt install libpcre2-8-0
sudo apt install libpcre2-16-0
“`

### 参考

https://let.blog.jp/article/31724231

https://stackoverflow.com/questions/70040287/php7-4-
preg-replace-compilation-failed-unrecognised-compile-time-option-bi

元記事を表示

[PHP]オブジェクト指向でさっそく躓いたって話。

# オブジェクト指向とは
細かい話は先人が山ほど解説しているのでここでは、
プログラムを「オブジェクト」と呼ばれる細かいパーツに分けて組み立てていくよ、という考え方とだけ。
#### $this を付け忘れてエラーが多発
学び始めてからすぐに、`$this`というものに悩まされました。コードを書いていると、よくエラーが出てしまい、原因を探してみるとどうやら`$this`を付け忘れていたのが原因でした。
###### よく陥った悪い例
最初こんな感じでコードを書いていました。
“`php
class OmochaBox {
private $omochas = [];

public function addOmocha($omochaname) {
// おもちゃを追加するメソッド
$omochas[] = $omochaname; // これが間違い
}
}
“`
これだとエラーが出るか、もしくは欲しい実行結果にならないか。
###### 正しいコード
“`php
class OmochaBox {
private

元記事を表示

OTHERカテゴリの最新記事