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

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

phpunitでprivateメソッドのテストを簡単に記述する

## 結論

`ReflectionWrapper` クラスを通すことで,可視性を気にすることなくメソッド/プロパティへアクセスできる.

“`php
$testClass = new ReflectionWrapper(
// テスト対象クラスのインスタンスを渡す
new TestClass()
);

// private/protected なメソッドがそのまま呼び出せる
$testClass->doPrivate();

// private/protected なプロパティへもアクセス可能
$testClass->privateProperty = ‘private’;
“`

`ReflectionWrapper` のコードはこちら

[https://github.com/ueba1110/utilities/tree/master/php/tests](https://github.com/ueba1110/utilities/tree/master/php/tests)

## 解説

### Reflectionクラスは記述が面倒

priva

元記事を表示

PHPUnitでプライベートメソッドのテストを行う方法

## はじめに
通常の方法ではpublicメソッドしかテスト対象とすることができませんが、少しコードに手を加えることでprivateやprotectedのメソッドもテストができるようになります。
このページでは、private(protected)メソッドのテストを簡単に行うためのメソッドの紹介をします。

## 対象
– Laravel
– PHPUnit

## ソースコード
“`php
/**
* Execute private function test.
*
* @param $class 対象とするクラス
* @param string $methodName メソッド名
* @param array $arguments 引数(配列指定)
* @return mixed
*/
protected function executePrivateFunction($class, string $methodName, array $arguments)
{
$reflection = new ReflectionClass($class);

元記事を表示

PHPマニュアル完全解読 ※しばらく更新

PHPマニュアルをこれから作っていく

1・文字列:
2・戻り値:
3・評価
4・&記号
5・integer:整数
6・string:文字列
7・参照渡し
8・パラメータ
9・[]:オプション(あってもなくても良いもの)

返り値
1・【: string】文字列が返り値として返ってくる
2・【: void】返り値なし

元記事を表示

web proxyを構築したら凄い勢いで草が生えた話

#経緯
iframeなどで他サイトのページを画面に組み込む時にweb proxyがあると便利な事はよくあると思う(httpとhttpsが混在する時など)。
phpで受け取ったurlをcURLで取りに行ってbaseタグを書き加えるようなweb proxyを作り1ヶ月ほど放置していたら、徐々に動作が重くなり遂に動かなくなった。
メモリ不足かストレージが埋まったかと思ったが違った。
#原因
server-statusでも見るかと思って表示した状態がこちら。
![www.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563735/d7f0f5f0-a25c-e270-7dc3-bd362a8cd4a2.jpeg)
**埋まってるWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW**

公開proxyとして捕捉され、free proxyサイトに掲載されていました。
#対策
もともと公開proxyにならないようにhashキーを持ったアクセス以外は制限する機能はあったが、デバグのためにoffにしていた。

元記事を表示

laravelミドルウェアについて[メモ]

laravelで自作のミドルウェア作成する機会があったのでメモとして残していこうと思います。

■目次
・laravel MVC+(ルーティングとミドルウェア)について [図]
・ミドルウエア実装

■環境
・laravel5.8
・php7.2

#laravel MVC+(ルーティングとミドルウェア)について [図]
![Untitled (Draft)-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700700/46834ab6-abf8-0550-e66b-4731d912faac.jpeg)

図で書くとこんな感じです。
ミドルウェアは
ルーティングからコントローラ行くまでに実行されます。
(例)認証チェックなど

#ミドルウェア実装
■前提(投稿アプリ作成)
現状として、
投稿4つあります。
id:4が自分が投稿したidとします。
しかし、localhost/post/1/editにアクセスするとid:1の投稿にアクセスでき変更更新ができてします。
今回はミドルウェアを使って解決し

元記事を表示

【MySQL】データベースからデータの取得 クエリ(query)

MySQLデータベースからphpでデータを取得するメモ。

“`php
$records = $db->query(‘select * from [テーブル名]’);
while ($record = $records->fetch()){
print ($record[‘[カラム名]’].”\n”);
}
“`

元記事を表示

【MySQL】PHP $_POSTの値をデータベースに挿入する

PHPで作成したフォーム等から受け取った$_POSTの値をMySQLデータベースに挿入する方法をメモ。

###DB接続
どのデータベースにどのユーザーが何のパスワードで接続しようしているかを記述。

“`php
$db = new PDO(‘mysql:dbname=[データベース名];localhost=[ホスト名またはIPアドレス];charset=utf8mb4′,'[ユーザー名]’,'[ログインパスワード]’);
“`
例えば、
・データベース名:mydb
・ホスト:ローカルホスト(ローカルホストの場合は、localhostか127.0.0.1と記述する)
・ユーザー名:root
・パスワード:root
の場合

“`php
//例)
$db = new PDO(‘mysql:dbname=mydb;localhost=127.0.0.1;charset=utf8mb4′,’root’,’root’);
“`
オプションを記述する場合

“`php
$db = new PDO(‘mysql:dbname=mydb;localhost=127.0.0.1;charse

元記事を表示

Laravel PHP 送信されたファイルの拡張子をMIMEの情報から取得する

# 目的

– Postされた拡張子を取得する方法をまとめる

# 方法

1. inputのnameでimageとしている場合に受け取るときに受け取り側のコントローラーに下記を記載する。

“`php
$extensions = $request->file(‘image’)->guessExtension();
“`

1. `$extensions`にファイルの拡張子が格納される。

元記事を表示

LaravelでSwaggerを自動生成する

## 環境
– Laravel 8.35.1
– PHP 7.4.16

## l5-swaggerを追加する
“`
$ cd /path/to/project
$ composer require “darkaonline/l5-swagger”
“`

## 書き方
### @OA\Info
プロジェクト内のどこか1か所に定義すれば良い。
複数存在するとエラーになる。

“`php
/**
* @OA\Info(
* version=”1.0.0″,
* title=”Swaggerタイトル”,
* description=”Swaggerの説明”,
* )
*/
“`

#### 設定例
“`php

元記事を表示

Uncaught Error: Call to undefined method PhpCsFixer\Config::create()

## PhpCsFixer で以下のようなエラーが出るようになった
“`
PHP Fatal error: Uncaught Error: Call to undefined method PhpCsFixer\Config::create()
“`

`php-cs-fixer` の `v3.0.0` が `2021-05-03 21:51 UTC` にリリースされました。
その際、破壊的な変更として、
> method create of class Config has been removed, use the constructor

が行われた様子。詳しくは、以下参照のこと。
https://github.com/FriendsOfPHP/PHP-CS-Fixer/blob/3.0/UPGRADE-v3.md

結果として、前述のエラーが出るようになりました。
> PHP Fatal error: Uncaught Error: Call to undefined method PhpCsFixer\Config::create()

## とりあえずの対策
`v3

元記事を表示

spotify x LINEで音楽をタイマー替わりにするLINEBOT作った

## はじめに
LINEBOTでなにかつくりたかった・・!
https://qiita.com/inoue2002/items/7e47283ba9affa0fac82
こちらの記事を見た時、音楽をタイマーがわりにできないかな、と思ったのがきっかけです。

## 作成したBOTの使い方
以下のQRコードから友達追加
![947sybkb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435661/a835cfee-1063-8fcf-cc69-0df3a6cfc0b0.png)

1.メニューから「get music!!」をタップ
2.「1分,2分,3分,,」と選択肢が出るので、返して欲しい分数の曲を指定する
3.spotifyのURLが返ってくる

![ezgif-2-e1a8c0c8a3f7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435661/df47893a-705f-0591-5c47-08ade0bc

元記事を表示

SQLインジェクションが話題になってるけど

SQLインジェクションが話題になっている。多分あの話題はデマだとは思うが、それが何なのかの知識はあったほうが良いと思う

## SQLインジェクションとは

まず、以下のようなテーブルが存在するとする。

“`sql
CREATE TABLE `table` (
`id` INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
`content` VARCHAR(255) NOT NULL
) Engine=InnoDB;
“`

次に、以下のようなコードを考える。

“`php
query($sql);
// 以下、$resを使って処理を行う
“`

これを使うと何が起きるか説明すると、qパラメータに`A%’ OR ‘%’ = ‘`と指

元記事を表示

UTCタイムスタンプ(UNIX時間)をJSTに変換して表示するワンライナー

<追記>
さらに短く書けると @nazka9o さんからコメントいただきました。コメントのワンライナーのほうがさらにラクかと思います。

https://qiita.com/ryoto20707/items/19c5bc6646db99bd3acb

こちらの記事のphpスクリプトを参考にして、ワンライナーでUTCなUNIX時間からJSTの見やすい表示に変換するワンライナーを作りました。
頭が悪いため、UTCとJSTの変換で毎回悩んでしまうのです。

“`shell
$ echo 1620889236 | (read t; php -r “echo (new DateTime())->setTimestamp($t)->setTimezone(new DateTimeZone(‘Asia/Tokyo’))->format(‘Y/m/d H:i:s’) . PHP_EOL;”;)
2021/05/13 16:00:36
“`

キモは変換させたいUNIX時間をphpスクリプト内に書かず、スクリプトの最初のほうに書いてあるってところです。echoとreadを駆使してSHEL

元記事を表示

日付関連のテストを書く時は絶対にスタブ化しろ

## サンプルコード

スタブ化しないとまずいケースを紹介します。

“`ProductCode.php
cancelDate = $cancelDate;
}

/**
* @param string キャンセル日
*/
public function setCancelDate($cancelDate){
$this->cancelDate = $cancelDate;
}

/**
* 有効なユーザーか無効なユーザーかを文字列で返す
*
* @return string
*/
public

元記事を表示

laravel8 authインストール(メモ)

laravel/uiインストール

“`
composer require laravel/ui

php artisan ui vue –auth
“`

ルートに

“`
use Illuminate\Support\Facades\Auth;
“`

元記事を表示

「WP-PostViews」プラグインでタグを人気順(閲覧数順)に表示する方法

WordPressって情報が豊富にあって便利な分、情報が無いときにしんどい思いをすることもあります。
最近開発したWebメディアで、タグを人気順に並べる要望があったのですが、全く情報がなかったので自分で作ることになりました。
知識のある人からすると何てことはないと思うのですが、誰か同じことで困っている人のためになればと思い、まとめてみようと思います。

##結論
まず結論から。
WordPressで「WP-PostViews」プラグインを有効化し、以下のコードでタグを人気順に並べて表示することが可能です。
(ここでは紹介のためにHTMLと混合して書いていますが、実際はそれぞれの環境に合わせてfunction.phpにまとめてメソッド化するべきでしょう。)

“`php

‘post’,
‘post_status’ => ‘publi

元記事を表示

Apache2 + phpのサイトでEUC-JPのHTMLが文字化けする

## 初めに
大昔にPHPで作られたWebサイトのローカル開発環境を構築した際、文字コードの周りでちょっと詰まったので解決策を記しておく。

## TL;DR
Apacheのconfファイルに`php_value default_charset EUC-JP` を書く

## 発生した問題
EUC-JPで書かれているコンテンツ(PHP, HTML, CSS, JavaScript等)をApacheというWebサーバーを使って返すサイトのローカル開発環境を、ホスト上に立てた仮想マシン上のDockerコンテナ上に作成した。各システムの概要は以下の通り。

– ホスト:Windows10 Home 20H2
– 仮想マシン
– 仮想化ソフトウェア:VirtualBox 6.1.16
– Box:bento/ubuntu-20.04
– コンテナイメージ:php:7.2-apacheのベースイメージでApacheのrewriteモッドを有効化したもの

開発環境が出来上がり、いざブラウザからアクセスしてみると、ページ上の日本語がすべて文字化けしていた……

## 原因調

元記事を表示

PHP Laravel アクセス修飾子のルールを一旦整理する

# 目的

– PHPのアクセス修飾子をなんとなくで使用していたのでこの機会にちゃんと整理する

# 記事を書いた経緯(自分用)

– LaravelでDI(依存性の注入)をしている時になんとなくコントローラークラスの最初の方で`private $userService;`と記載してコントローラークラスのプロパティを定義していた。
– ちゃんと意味を理解できておらず「とりあえずこういうふうに記載するとDIできる」と覚えていた。
– `private`がどのような意味を示しているかを整理してみる。

# アクセス修飾子

### private

| ケース | アクセス可否 |
| — | — |
| 同クラス内アクセス | ○ |
| 継承先でのアクセス | ✕ |
| インスタンス化後のアクセス | ✕ |

### protected

| ケース | アクセス可否 |
| — | — |
| 同クラス内アクセス | ○ |
| 継承先でのアクセス | ○ |
| インスタンス化後のアクセス | ✕ |

### public

| ケース | アクセス可否 |

元記事を表示

[php初学者]型宣言とかnull系について

#phpの型宣言
phpは[7.0](https://www.php.net/manual/ja/migration70.new-features.php)以降型宣言ができるようになりました。
元々は自動で型変換をしてくれていました。(coercive)
しかし、それだと見落としがちなバグなどに気づかないまま開発している…なんてことも多々あるらしく、この新機能はとても嬉しいものであったりします。

“`sample.php

元記事を表示

PHP:Laravel Strageを利用した複数画像uploadする方法1つとFlysystem-aws-s3で複数画像をuploadする方法2つとその処理速度

## 前提
・AWSアカウントが存在していてS3バケットが作成済である。
https://qiita.com/Yorinton/items/bdf5f9bc05629c9a0df7
・laravel Strageが利用できる。
https://readouble.com/laravel/8.x/ja/filesystem.html
・Flysystem-aws-s3をインストール済みである (AWS SDK for PHP laravelでもよいかな?)
https://www.ritolab.com/entry/8
https://qiita.com/ucan-lab/items/61903ce10a186e78f15f

## laravel Strageを利用したupload方法

**upload方法その1**

“`PHP
foreach (Storage::disk(‘public’)->files(‘TARGET_DIR’) as $fileName){
$contents = Storage::disk(‘public’)->get($fileName);

元記事を表示

OTHERカテゴリの最新記事