PHP関連のことを調べてみた2022年06月14日

PHP関連のことを調べてみた2022年06月14日

Capter2 ルーティングとコントローラー

# 2-1 ルーティング

## トップページの記述について

ルーティングに関する記述は「routes」フォルダで行う。

“`web.php
Route::get(‘/’, function () {
return view(‘welcome’);
});
“`

上記の記述はトップページにアクセスした時、
「welcome」というテンプレートを返すといいう記述です。
*VIEWという関数で渡されるテンプレートは、
 「resources」の「views」に格納されている。

## 下層ページへの記述について

下層ページ「/hello」へルーティングさせたい場合、
下記のように記述する

“`web.php
Route::get(‘/hello’, function () {
return ‘

hello

This is sample page.

‘;
});

“`

## ヒアドキュメントの利用

“`web.php
$html = <<

元記事を表示

【PHP基礎③】入力フォームを使おう

[問題]
整数値を入力させ、その入力値を表示するプログラムを作成しなさい。

# コード
“`php
$a = intval(fgets(STDIN));
echo $a;
“`

↓ 入力フォームに「70」と入力

# 結果
“`
70
“`

☆$a = intval(fgets(STDIN)); →変数$aに、入力された整数値を代入する、という意味。
 変数には数値を1つ代入できる。

☆intval() →文字列(string)を整数(int)にする。

☆fgets →第一引数に指定したファイルポインタから1行取得し、その文字列を返す(※もっとわかりやすい説明がほしい…)

☆STDIN(=standard input 標準入力) →ターミナルで入力した文字を標準入力としてPHPに渡す(※こちらももっとわかりやすい説明がほしい…)

元記事を表示

PHP 問題集 メモ

★問題
あなたは、以下のようなキーボードのシミュレーションをするプログラムを作成したいと考えました。

・キーは a, b, …, z と shift, capslock のみ
・a, b, …, z キーと shiftキーを同時に押すと、対応する大文字が出力される
・capslockキーを押すと、再びcapslockキーが押されるまで大文字が出力される

キーボードで押されたキーが入力として与えられるので、

パソコンの画面に表示される文字列を出力してください。

★入力される値
入力は以下のフォーマットで与えられます

n
c_1
c_2

c_n

・入力される文字列数n
・c_1, c_2, …, c_n は押下されたキー
・入力はn + 1行となり、末尾に改行を一つ含みます。

★期待する出力
押したキーによって表示される文字列を1行で表し、
最後に改行して出力してください。

★条件
すべてのテストケースにおいて、以下の条件をみたします。

1 ≤ n ≤ 10
c_1, c_2, …, c_n は、以下のいずれかの文字列です。
・x
・shift x

元記事を表示

初心者プログラマーのための英語命名法

## はじめに
「なんか、レビューのたびに変数名を指摘されてる気がする…」
「日本人なんだから、英語で命名とか無理…」
こんなお悩みありませんか?

この記事では、「プログラマーが英語の命名で悩んだ時にどうすれば良いか」をフローチャート形式で解説します!
これであなたも駆け出しエンジニアを卒業できるかも!?

※本記事はLaravel,Vue.jsのプロジェクトで運用されているルールを元に解説しています。
プロジェクト内だけの内輪ルールも含まれていますので、ご了承ください。

## 対象者
この記事は下記のような人を対象にしています。

– 駆け出しエンジニア
– プログラミング初学者
– PHP(Laravel),JavaScript(Vue.js)で英語のネーミングに苦戦中

## 前提知識
下記のような中学・高校で学ぶ内容については理解していること前提で解説します。悪しからず。
– 三単現のsって何?
– 5文型(SV/SVC/SVO/SVOO/SVOC)って何?
– 品詞(名詞/形容詞/動詞)って何?
– ~ingとか~edで形容詞になるってどういうこと?

## 結

元記事を表示

Glitch で PHP を使う方法

# はじめに
[Glitch](https://glitch.com)はPHPを公式にサポートしていませんが、いくつかの設定を変更することで、PHPを使用することができます。

# 手順
## プロジェクトの作成
実際にはどのテンプレートを使ってもいいのですが、今回は「glitch-hello-website」を選択してプロジェクトを作成します。

## glitch.jsonを作成
[New file]ボタンを押し、glitch.jsonファイルを新規作成します。ファイルには、以下の情報を入力してください。
“`json
{
“install”: “composer install”,
“start”: “php -S 0.0.0.0:8080”,
“watch”: {
“ignore”: [
“logs”
]
}
}
“`
・phpコマンドの-Sオプションは、組み込みのPHPウェブサーバーを起動します。このウェブサーバーは元々実稼働環境での使用を想定していないため、良い方法とは言えません。

・PHPのビルトインWebサーバーは、in

元記事を表示

【Laravel】どのクラスに置くか・if文は文章化しよう【リファクタリング】

## 環境
Laravel v9.5.1 (PHP v8.1.3)

## 前提
恥ずかしながらリファクタリングをまともにやったことがなく、最近覚えたリファクタリングの際の小ネタをまとめる。

## 小ネタ①

“`$request->user()“`の情報を使わないならそのクラスに置くべきでない。

### before

– ポイントを加算し、ポイント履歴をつける“`addPoints“`メソッドのリファクタリング
– User – PointWallet=“`1:1“`
– User – PointHistory=“`1:多“`

“`user“`が“`addPoints“`するものだと思い、“`addPoints“`メソッドをUserモデルに置いていた。
“`addPoints“`メソッドで“`$request->user()“`の情報が使われていないなら、このメソッドがUserモデルのインスタンスメソッドであるとはいえないので、適したクラスに置こう。

“`AddPointController.php
class AddPointCo

元記事を表示

【PHP基礎②】割り算の余りを求める

[問題]
15000を7で割った余りを表示するプログラムを作成しなさい。

# コード
“`php
echo 15000 % 7;
“`

# 結果
“`
6
“`

☆ a % b =aをbで割った余り

元記事を表示

【PHP基礎①】数値の入力と文字列の入力の違い

[問題]
1789+1758を計算して結果を表示するプログラムを作成しなさい。

# コード
“`PHP
1. 数値として数字を入力する場合
echo 1789+1758;

2.文字列として数字を入力する場合
echo ‘1789+1758’;

“`
# 結果
“`
1. 3547
2. 1789+1758
“`

☆数値として表示させたい、計算させたい時は、’ ’を付けない。

元記事を表示

【Laravel】enumで管理する場合引数に渡すIDをオブジェクトで渡そう【リファクタリング】

## 環境
Laravel v9.5.1 (PHP v8.1.3)

## 前提

– User -> Bookは1対多
– Bookのプロパティ:“`user_id“` “`title“` “`content“` “`genre“`
– “`genre“`はenumで定義されている

“`app/Enums/Genre.php
namespace App\Enums;

enum Genre: int
{
case Fantasy = 1;
case DetectiveAndMystery = 2;
case Horror = 3;
case Romance = 4;
}
“`

## Bad
“`genreId“`をenumで定義している場合、“`createPost“`メソッドの“`genreId“`の型宣言を“`int“`にしてしまうと、enumに存在しない値が入る可能性がある。
例えばenumには定義されていない“`5“`が入ってしまうとか。
DB上は問題ない値なのでもし“`5“`が入っても保存されてしまうが、

元記事を表示

Laradockを利用せずにLaravelのDocker環境を構築する

:::note warn
クローズ予定の[技術ブログ](https://www.yurikago-blog.com/)に投稿した過去の記事です。
投稿日: 2020/08/22
:::

Laradock は便利ですが自分が必要としない機能まで含まれた状態でコンテナが作成されるためセットアップに時間がかかります。この記事では Laravel が最低限動作するコンテナを作成します。※DB なし

## 検証環境

– Docker 19.03.1
– PHP 7.4.9
– Laravel 6.18.35
– Nginx 1.19.2

[ソースコード](https://github.com/krabben16/sandbox-laravel)

## コンテナ作成

PHP 用、Nginx 用のコンテナをそれぞれ作成します。PHP と Nginx の間の通信は UNIX ドメインソケットを利用します。([参考](https://qiita.com/ucan-lab/items/5fc1281cd8076c8ac9f4))

クライアントからの HTTP リクエストを Nginx コンテ

元記事を表示

PHP5.3 全角ひらがなの濁点を削除する

:::note warn
クローズ予定の[技術ブログ](https://www.yurikago-blog.com/)に投稿した過去の記事です。
投稿日: 2020/03/25
:::

`mb_convert_kana` を使って全角ひらがなから濁点を削除する方法をまとめました。

## コード

“`php
/**
* 全角ひらがなの濁点を削除する
*
* @param $zenkakuHiragana
* @return string
*/
function removeDakutenFromZenkakuHiragana($zenkakuHiragana) {
$encode = “utf-8”;

// 全角ひらがなを半角カタカナに変換
$hankakuKatakana = mb_convert_kana($zenkakuHiragana, “h”, $encode);

// 半角カタカナを全角ひらがなに変換する
// 濁点が含まれる場合は1つの文字として変換される
$zenkakuHiragana = mb_convert_kana($hanka

元記事を表示

デカルト「自分の認識疑わないヤツおる?」

# 目次(3分で読めます)

1.[それはアルゴリズムの問題文を読んでいた時のこと。](#それはアルゴリズムの問題文を読んでいた時のこと)
2.[デカルトが聞いて呆れるぜ](#デカルトが聞いて呆れるぜ)

## それはアルゴリズムの問題文を読んでいた時のこと。

問題文「カードの束について、上から一番目のカードを下から一番目に、上から二番目なら下から二番目に並び替えてください。」



一般自然人なら間違いなく、配列を反転する関数が存在するか疑問に思い、そしてググるはずだ。
### しかし、「法学部卒・自称論理自信ニキ」であるワイは違った。



論理自信ワイ「あっ、配列を反転する方法閃いちゃったわ(ニチャア)」



ぼくがかんがえたさいきょうの配列反転アルゴリズム
![1655051258989.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311883/50da40de-b29b-6

CentOS6 Xdebug+VSCodeでPHP5.3をデバッグする

:::note warn
クローズ予定の[技術ブログ](https://www.yurikago-blog.com/)に投稿した過去の記事です。
投稿日: 2020/01/01
:::

PHP のデバッグやプロファイリング機能を提供する PHP 拡張機能 Xdebug を利用して、CentOS6 環境で動作する PHP を VSCode からデバッグする方法をまとめました。

## 検証環境

– Windows 10 Home
– Visual Studio Code 1.41.1
– PHP Debug 1.13.0
– Docker Toolbox 19.03.1
– Virtual Box 5.2.34
– CentOS 6
– PHP 5.3.3
– Xdebug 2.2.7

## ディレクトリ構成

“`
/
– .vscode
– launch.json
– src
– index.php
– docker-compose.yml
– Dockerfile
– xdebug.ini
“`

launch.json

オリジナルアプリ作成で分からないこと

オリジナルアプリ作成で分からないことが生じています。
# その1:現象
スクレイピング元サイトからデータを取ってきて、連想配列で表示したとき、スペースで分かれているとスペース区切りになり、名前の姓名が別々になってしまう。
(例:村田 一成→[0]=>”村田”, [1]=>”一成”)
スクレイピング元サイトはヤフースポーツの該当プロ野球チームの選手データ。

# その2:対策
調べると、array_mergeで結合できるみたいだが、配列がたくさんあり、その部分だけ結合する方法が分からない。
foreach内でifを使いその部分だけ結合できるようにするか。でも、どうやって??

#結局
結局、対策が分からず止まっています。
単なる連想配列なら出来るんですが。

参考にgithubを載せます。
https://github.com/kazunarigit/baystarsapp

PHPの連想配列でUndefined indexを出さない実装:あなたはどちら派?

|[../](https://qiita.com/taconana/items/3f5424f9abfc755772c2) |
|—|

連想配列(個人的にassociation listと呼んだ方が親しみがある)を使って、該当するキーがないときにnullなどを返すようにしたい。例えば、以下のような連想配列`$arr`から`French`で検索すると、「PHP Notice: Undefined index: French」のエラーが出る。

“`php
$arr = [
‘Japanese’ => ‘こんにちは’,
‘English’ => ‘Hello’
];

echo $arr[‘Japanese’].PHP_EOL;
echo $arr[‘French’].PHP_EOL;
“`
そこでUndefined indexのエラーを出さないように、以下のコードが考えられる。`getValue1()`と`getValue2()`である。

“`php
function getValue1(&$arr, $key){
if (isset($arr[$key]))

PHP7.4でEnumライクなものを実装してみた

|[../](https://qiita.com/taconana/items/3f5424f9abfc755772c2) |
|—|

PHPでもJavaのEnumのようなものを使いたい。最新のPHPでは提供されているようだが、PHP7.4にはなかったのでそれっぽいものを作ってみた。とりあえず、整数の`$ordinal`に対応する文字列を返す関数`value(int $ordinal):string`が提供できていればいいだろう。

“`php:Enum.php

TryHackMe Writeup:RootMe

# はじめに
本記事はTryHackMeのWriteupです。
Roomは[RootMe](https://tryhackme.com/room/rrootme)で、Difficulty(難易度)はEasyです。

RootMeは一般的なハッキングフローの流れに沿って、偵察行為を皮切りに発見したコンテンツから脆弱性を特定します。脆弱性特定後、攻撃手法を確立させてリバースシェルの取得及び、管理者権限(root権限)の取得等について学習します。

セキュリティの本質に関わる基礎的な部分を学習するにはうってつけのRoomだと思います。
Deploy the machineでマシンデプロイ後、以降のTaskについて解説していきます。

## Reconnaissance
はじめに偵察行為から行います。
偵察行為については以前書いた[Content Discovery Webアプリケーションに対する偵察行為](https://qiita.com/Brutus/items/6b89c9518ea90695232f)を参照。

### ポートスキャン
空いているポートを特定するためには**Nmap*

PHP8.2に読み取り専用クラスが追加

## Proposal
クラスのすべてのインスタンスプロパティが読み取り専用となる。
“`php5
readonly class Foo
{
public int $bar;

public function __construct() {
$this->bar = 1;
}
}

$foo = new Foo();
$foo->bar = 2;
// Fatal Error: Uncaught Error: Cannot modify readonly property Foo::$bar

$foo->baz = 1;
// Fatal Error: Uncaught Error: Cannot create dynamic property Foo::$baz
“`

## Restrictions
型指定されていないプロパティと静的プロパティは、
読み取り専用クラスとして宣言できません。
“`php5
readonly class Foo
{
public $bar;
}
// Fatal error: Readonl

Laravelの自動テストでDBの汚染を避けようとした結果、DBのテーブルを全て吹き飛ばした話

# Laravelの自動テストでDBの汚染を避けようとした結果、DBのテーブルを全て吹き飛ばした話

タイトルの通りですが、自分のようにドキュメントを流し読みしてしまっただけで同じ過ちを犯してしまう人が出ないよう、また使用するライブラリのコードはきちんと読みましょうという自身への戒めを兼ねて記録します。

## 自動テスト実行時に生成されたレコードを共有開発環境のDBに残したくない

この問いに対してLaravelは有効な機能を提供してくれています。
今回の主役である **Illuminate\Foundation\Testing\RefreshDatabaseトレイト** です。

> 前のテストがその後のテストデータに影響しないように、各テストの後にデータベースをリセットできると便利です。インメモリデータベースを使っていても、トラディショナルなデータベースを使用していても、RefreshDatabaseトレイトにより、マイグレーションに最適なアプローチが取れます。テストクラスにてこのトレイトを使えば、すべてが処理されます。
https://readouble.com/laravel

PHPで「お問い合わせ画面」を実装してみた

|[../](https://qiita.com/taconana/items/3f5424f9abfc755772c2) |
|—|

PHPの練習のため、お問い合わせの画面を実装してみた。画面遷移は以下の感じ。
![contact-states.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39200/9e4058f0-8057-491d-6dd8-e4cac35dd5c3.png)
オブジェクト指向でモデルを実装する。クラス図は以下の感じ。
![contact-classes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39200/5d9686ab-635e-83ca-87b1-89f0ab3f97a3.png)

問い合わせのエンティティ(Contact)は、とりあえずシンプルに名前、メールアドレス、問い合わせの内容の3属性とした。setter/getterは割愛。今回は永続化していないので、エンティティ