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

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

AWS-SDK-PHP で Header value cannot be represented using ISO-8859-1. エラーの解決方法

## きっかけ

S3 の署名付 URL を使用してオブジェクトをダウンロードする際、response-content-disposition の filename が日本語だと、タイトルに記載されているエラーが発生していました。

自己解決の過程で、ファイルダウンロード周りの使用や文字コード周りの知見を増やすことができたので、備忘録的に記事にまとめたいと思います。

## エラー発生時の実装

下記のような実装でした。

“`php
‘ResponseContentDisposition’ => ‘attachment; filename=’ . $fileName
“`

## 解決後の実装

以下のような実装にすることで日本語のままダウンロードすることができました。

“`php
$fileNameEncoded = urlencode($fileName);

$cmd = $this->inner->getCommand(‘GetObject’, [
// ~中略~
‘ResponseContentDisposition’ => “attachment; fi

元記事を表示

継承/オーバーライドの禁止

## はじめに

継承/オーバーライドの禁止についてまとめる

### なぜ継承/オーバーライドを禁止するのか

継承可能なクラスには、実装/修正する際に派生クラスへの影響を考慮しなければならず、派生クラスの間でも、どのクラス/メソッドなら安全に継承/オーバーライドできるかを判別しなければならない。
このような問題を考えると、無制限に継承/オーバーライドを認めるのは避けるべきで、設計時点で継承/オーバーライドを想定していないならば、禁止してしまった方が良い。

### final修飾子

継承/オーバーライドを禁止する

#### 参考コード1

`BusinessPerson`クラスの`work`メソッドをオーバーライド禁止にしている。

“`php:Person.php
class Person
{
public $firstName;
public $lastName;

public function __construct($firstName, $lastName)
{
$this->firstName = $firstNa

元記事を表示

委譲

## はじめに

委譲についてまとめる

### 委譲とは

再利用したい機能を持つオブジェクトを、現在のクラスのプロパティとして取り込む。
継承は`is-a`の関係であるが、委譲は`has-a`の関係であると言える。

#### 参考コード1

`file`プロパティに`SqlFileObject`オブジェクトを保持(has)し、必要に応じてそこから既成のメソッドを利用する。

“`php:delegate_basic.php
class fileLogger {
private DateTime $current;
private SqlFileObject $file;

public function __construct(string $logname) {
$this->current = new DateTime();
$this->file = new SqlFileObject(“{$logname}-{$this->current->format(‘Ymd’)}.log”, ‘a’);
}

元記事を表示

Webアプリ開発 ユーザー新規登録編

# 初めに
webアプリの開発ができたので、開発中に考えたことを書いていきます。
今回はユーザー新規登録についてです。

# 開発環境

macOS Sonoma 14.4.1
PHP 8.3.3
Laravel Installer 5.2.0
Laravel Framework 11.0.5

# ソースコード

https://github.com/opatu07/portfolio

# 考えたこと

## ユーザー新規登録編

### ビュー

ビューで意識したことは
新規登録フォームのコンポーネント化です。

フォームの外枠の設定をする
panel.blade.php

フォーム欄の名前をつける
label.blade.php

バリデーションエラーを出す
error.blade.php

フォームでよく使われるものはコンポーネント化をすることで機能修正する際に該当箇所を見つけやすくしました。

### ルート

次にルートは
“`web.php
Route::get(‘register’, [RegisterController::class, ‘create’])->

元記事を表示

【asdf】PHP 8.x をインストールするときに “No package ‘~~~’ found” と出てめんどかったのでメモ

# はじめに
Ubuntu 22.04 で、asdf を使って PHP のバージョン管理をしようと思ったが、
`asdf install php latest` と実行したとき、無限にエラー吐いてめんどくさかったのでメモ。

# 環境
– Ubuntu 22.04

# 解決コマンド (一発用)
“`sh
sudo apt install autoconf bison re2c pkg-config libxml2-dev libssl-dev libsqlite3-dev libcurl4-openssl-dev libgd-dev libonig-dev libpq-dev libreadline-dev libzip-dev
“`

# エラーと解決コマンド
## No package ‘autoconf’ found
“`
sudo apt install autoconf
“`
## No package ‘bison’ found
“`
sudo apt install bison
“`

## No package ‘re2c’ found
“`
sudo

元記事を表示

オーバーライド

## はじめに

継承についてまとめる・二回目

### オーバーライドとは

スーパークラスで定義された機能を他のクラスで再定義すること。

#### 参考コード

“`php:Person.php
class Person
{
public $firstName;
public $lastName;

public function __construct($firstName, $lastName)
{
$this->firstName = $firstName;
$this->lastName = $lastName;
}

public function show()
{
print “

私の名前は{$this->lastName}{$this->firstName}です。

“;
}
}
“`

“`php:BusinessPerson.php
require_once ‘Person.php’;

class BusinessPerson exte

元記事を表示

PHP array_rand()は配列の値ではなく配列のキーを返すので注意

## 概要

PHPの組み込み関数である`array_rand()`の仕様を勘違いして一瞬詰まったので簡単にまとめておく。

## array_rand()は引数の配列のキーをランダムで返す

言葉で説明するより見ていただいたほうが早い気がするのでまずはコードを掲載する。
「あ、い、う」をそれぞれランダムに返してほしくて下記のようなコードを書いた

“`php

元記事を表示

【Xserver】久々にcomposerを使ったらエラーが出る

XserverでLaravelを用いたアプリをデプロイしているときに、composerでエラーになってvendorフォルダが全くできずハマったので、将来の自分と同じ道でさまよっている方々のためにここに書き残しておきます。

## 1. 何をしていたか
数年ぶりにXserverにLaravelを用いた新しいアプリを置いていました。その時、うまく起動しないのはvendorフォルダがない、つまりcomposerを用いて必要なプログラムをダウンロードしていないというだけでした。そこで
“` bash
composer install
“`
を実行するとこんな感じでエラーが出てうまくいきませんでした。

“`
Your requirements could not be resolved to an installable set of packages.

Problem 1
– Installation request for laravel/framework v10.26.2 -> satisfiable by laravel/framework[v10.26.2].

元記事を表示

Webアプリ開発 ログイン編

# 初めに
webアプリの開発ができたので、開発中に考えたことを書いていきます。
今回はログインについてです。

# 開発環境

macOS Sonoma 14.4.1
PHP 8.3.3
Laravel Installer 5.2.0
Laravel Framework 11.0.5

# ソースコード

https://github.com/opatu07/portfolio

# 考えたこと

## ログイン編

### 作りながら考えたこと

まずはビューで意識したことは
ログイン機能のコンポーネント化です。

フォームの外枠の設定をする
panel.blade.php

フォーム欄の名前をつける
label.blade.php

バリデーションエラーを出す
error.blade.php

フォームでよく使われるものはコンポーネント化をすることで機能修正する際に該当箇所を見つけやすくしました。

次にルートは
“`web.php
Route::get(‘login’, [SessionsController::class, ‘create’])->middleware(‘g

元記事を表示

CodeIgniterについてアウトプットしてみた~Model編~

## はじめに

今回はCodeIgniterで用意されているModelクラスについて説明します。
Modelは、単一のテーブルを便利に扱うための機能を提供するクラスです。
クエリビルダだと煩雑になりやすい各CRUD操作が楽になったりします!

## Modelクラスの説明-設定
まず、設定系のプロパティについて、説明していきます。

“`php:app/Models/User.php

元記事を表示

ボタンのカスタムショートコードを作る

ボタンのカスタムショートコードの作り方を解説します。

## ボタンのカスタムショートコード

“`php
[btn link=”https://www.example.com”]クリック[/btn]
“`

投稿画面でブロック挿入ツールからショートコードを選択します。次に、上記のショートコードを記述します。

## functions.phpに記述するコード

“`php
function my_shortcode($attrs, $content = ”) {
return ‘

‘ . $content . ‘

‘;
}
add_shortcode(‘btn’, ‘my_shortcode’);
“`

functions.phpに上記のコードを記述します。

## コードの解説

### my_shortcodeという名前の関数を定義

“`php
function my_shortcode($attrs, $cont

元記事を表示

PHPでファイルをアップロードする 画像アップロード

# インストール

“`bash
wget https://gist.githubusercontent.com/GitHub30/d6960b85c73e6e5f20386fa665873183/raw/upload.php
“`

https://gist.github.com/GitHub30/d6960b85c73e6e5f20386fa665873183

# 動作確認

## JavaScript

“`javascript
var fd = new FormData()
fd.append(‘file’, new File([‘a’], ‘a.txt’))
await fetch(‘http://localhost/upload.php’, {
method: ‘POST’,
body: fd
})

var fd = new FormData()
fd.append(‘file[]’, new File([‘b’], ‘b.txt’))
fd.append(‘file[]’, new File([‘c’], ‘c.txt’))
await fetch

元記事を表示

継承

## はじめに

継承についてまとめる

### 継承とは

基になるクラスの機能(メソッド)を引き継ぎながら、新たな機能を追加したり、元の一部だけを修正したりする仕組み。

#### 参考コード

BusinessPersonクラスがPersonクラスを継承している。

“`php:Person.php
class Person
{
public $firstName;
public $lastName;

public function __construct($firstName, $lastName)
{
$this->firstName = $firstName;
$this->lastName = $lastName;
}

public function show()
{
print “

私の名前は{$this->lastName}{$this->firstName}です。

“;
}
}
“`

“`php:BusinessPerson.php

元記事を表示

[Ubuntu22.04+Redis7+php8]phpredisをインストール

## 環境

– さくらVPS
– Ubuntu(22.04)
– nginx(1.26.0)
– Redis(7.2.4)
– php(8.3.6)

## 手順

phpredis は git リポジトリ経由でインストールする

phpredis のインストールには phpize が必要で、phpize のインストールは php-dev という拡張パッケージをインストールすればよい

“`リモート
sudo apt -y install php8.3-dev
“`

phpredis をインストール

“`リモート
git clone https://github.com/phpredis/phpredis.git
cd phpredis
phpize
./configure –enable-redis-igbinary
sudo make && sudo make install
“`

php の redis 拡張モジュールを追加

“`リモート
sudo apt -y install php8.3-redis
“`

元記事を表示

PHPカンファレンス小田原に参加しました。

## はじめに

PHPカンファレンス小田原とは?

https://phpcon-odawara.jp/

PHPカンファレンスの小田原出張版です。
今回が初開催となりました。

2024年4月13日(土)開催でした。

## 気になった講演

### FigmaとPHPで作る、1ミリたりとも表示崩れしない最強の帳票印刷ソリューション

昔帳票のシステム開発に携わっていて、確かによくズレるし罠も多かった経験があるため気になって聞きに行きました。
svgから生成するのはなるほどーという感じでした。
とはいえ結局泥臭くやる必要がある部分は変わらず、そもそも帳票というものは複雑度が高く難しいものなんだな、という気持ちになりました。

### VAddy PHPカンファレンス全部スポンサーする!の裏側

https://drive.goog

元記事を表示

PHPの参照渡し方法

# PHPの参照渡し方法

参照渡しについて説明しているサイトは下記のようなプログラムの書き方をしています。

“`php

“`

これで**TestMessage** と出力されます。
**$message** を直接変更していないのに、**rewrite関数** 内での変更が **$message** に対して有効になります。
関数の引数に **&** をつけなければ、上書きされることはありません。

次に、変数代入の参照渡しを説明します。

## 変数代入の参照渡し

“`php

“`

これは、**TestMessge** と出力されます。
2行目で **$message** の持つ参

元記事を表示

CodeIgniterについてアウトプットしてみた~Entity編~

## はじめに

今回はCodeIgniterで用意されているEntityクラスについて説明します。
Entityクラスは、テーブルの1レコードの各カラムの`ビジネスロジック`を定義するクラスです。
DDDのドメインモデルに近い?のかもしれません。

:::note info
Entityは、CodeIgniterのversion4から導入されました。
:::

ビジネスロジックをEntityクラスに集約することで、コードの保守性が高まり、品質が高くなりそうです。

## Entityクラスを使わない場合の課題

例えば、ユーザテーブルが以下のようなテーブル構成になっているとします。

| 物理名 | 論理名 |
|:-:|:-:|
| id | ID |
| last_name | 姓 |
| first_name | 名 |
| login_id | ログインID |
| password | パスワード |
| is_active | 有効フラグ |
| created_at | 登録日時 |
| updated_at | 更新日時 |
| delete

元記事を表示

PHPUnitでデシジョンテスト

# 概要
PHPUnit + ソフトウェアテストの勉強の一環として投稿します。

# 開発環境
PHP 8.1.28
Composer:2.7.2
phpunit: 10.5
IDE:VSCode

# 題材
ATMの引出し手数料
以下ソフトウェアテスト技法練習帳~知識を経験に帰る40問2.2.1から引用
・平日の0:00~8:44は手数料は110円です。
・平日の8:45~17:59は手数料は0円です。
・平日の18:00~23:59は手数料が110円です。
・特定の条件を満たしたお客様(特別会員)は曜日や時間に限らず手数料が0円です。

# ソフトウェアテストの用語
## ブラックボックステスト技法
仕様に対してテスト設計する技法
入力したデータと出力したデータのみを対象にするテスト

## ホワイトボックステスト技法
テスト対象のソフトウェアの内部構造を検証するテスト

### ステートメントテスト
命令文に対するテスト

### デシジョンテスト
if-else switch-case分岐のテスト

### 具体的には

if文がない関数のコンポーネントのテスト
→ステートメ

元記事を表示

高階関数

## はじめに
配列に特化した関数です。応用情報の勉強をしていてphpの勉強がおざなりになっていたのでしっかりやっていこうと思います。

## 高階関数
配列に特化した関数といえばいいのでしょうか
引数に配列と関数を使用します。
array_mapとarry_filterを見ていきます。

## array_map()
配列の値全てに対して関数を実行します。
“`php
//渡された値を2乗して返す関数
function double($n){
return $n * $n;
}

$nums = [1,3,5,7];
$newNums = array_map(‘double’, $nums);
print_r($newNums);
“`
“`
Array([0] => 1 [1] => 9 [2] => 25 [3] => 49)
“`
array_mapの第一引数のdouble関数に、第二引数のnumsの値が1つずつ渡され実行されます。
doubleの返り値が入った配列が返ってきます。

## array_filter()
“`php
//渡された値が偶数なら返す

元記事を表示

カプセル化

## はじめに

カプセル化について整理する。

### カプセル化とは

クラスの機能のうち使い手に必要ないものを隠すこと。

### アクセサーメソッド

カプセル化の典型例として、プロパティを隠蔽するためにアクセサーメソッドを使用する例。
セッター(`setBase`, `setHeight`)では与えられた引数が負数の場合には例外を発生させている。

“`php:TriangleFigure.php
setBase(1);
$this->setHeight(1);
}

public function getBase(): float
{
return $this->base;
}

public function setBase(fl

元記事を表示

OTHERカテゴリの最新記事