PHP - user000422/0 GitHub Wiki

インタプリタ言語(逐次翻訳)である

Ver セキュリティサポート (RHEL別)セキュリティサポート 備考
5.6 2019/01 RHEL7 2024/06 ?要確認
7.4 2022/11 RHEL8 2029/05
8.2 2025/12 RHEL9 20xx/xx 2024/06時点 安定版
項目 役割
コントローラー(Controller) アクションを実行
アクション(Controller) ビジネスロジックを実行
ビジネスロジック(Model) DAOを実行
DAO(Model) SQL処理担当
テンプレート(View) HTML 表示を担当

myadminへアクセス … URL http://localhost/phpmyadmin/index.php

導入

PHPダウンロード https://www.php.net/downloads > Windows downloads > Thread Safe Zip
PHPインストール 環境変数 > Path > C:\php

■XAMPP
管理者として起動する必要がある(毎回の管理者起動が面倒な場合は下記)

iniファイルで管理者設定をする手順 xampp\xampp-control.ini > プロパティ > セキュリティ > Everyone フルコントロール設定

基本

コーディング規約 : https://www.php-fig.org/psr
インデント … 半角スペース4つ(パーフェクトPHPより)

スクリプティングデリミタ(PHPタグ)<?php ~ ?>
ファイル末尾に閉じタグ ?> が来る場合は省略すること(昨今のコーディング規約)

スコープ … javaやc#より緩い(有効範囲が広い)ので注意
ifブロック内で宣言した変数は、ifブロック外で有効

■変数

$sample_text = "Hello"; // 文字列
$sample_num = 100;      // 数値

■定数
グローバルなため名前重複に注意
マジック定数 … 定数が記述された場所によって動的に値が変化する定義済み定数

// 定数 第一引数 定数名、第二引数 値
define('SAMPLE_DATA', 100);
echo SAMPLE_DATA; // 呼び出し(先頭に「$」は必要ない)

// マジック定数(PHPがデフォルトで持っている)
__FILE__ // 実行中のファイル名(フルパス)

$sample_eol = PHP_EOL; // 改行コードを出力(OSを自動で判別)

■配列
最後のデータ行の末尾のカンマは不問(要素を追加記述したくなった時にカンマがあるとカンマ忘れのエラーを防ぐことができる)

$sample_array = array("スライム", "ドラキー"); // 宣言と同時に値を設定

$result = $sample_array[0]; // 値を取得(インデックス指定)
$sample_array[0] = 'apple'; // 値を格納(インデックス指定)
$sample_array[] = 'apple';  // 値を格納(末尾に)
array_push($sample_array, 'apple'); // 配列を格納(末尾に)

array_pop($sample_array);   // 値を削除(末尾の要素)
array_shift($sample_array); // 値を削除(先頭の要素)

$array_result = array_slice($sample_array, 2, 3); // 値を取得(第二引数:開始位置インデックス、第三引数:取得対象要素数)

$sample_array = array(); // 配列を初期化

$result = count($sample_array); // 配列の要素数を取得

■連想配列 … キーと値で管理
入力順が保証される
キーとして用いることができる型(※基本的に) … 整数、文字列

$sample_array = array( // 宣言と代入
  'apple' => 'red',
  'banana' => 'yellow'
);

$sample_array = [ // 宣言と代入(短縮構文)
  'apple' => 'red',
  'banana' => 'yellow',
];

$result = $sample_array['apple']; // 値を取得
$sample_array['apple'] = 'red';   // 値を追加
$sample_array += $add_array;      // 値を追加
unset($sample_array['apple']);    // 値を削除

$array1 + $array2; // 連想配列の結合 重複キーは結合しない

$result = isset($sample_array['apple']); // キーが存在するか確認

■if
カッコは省略可能だが、ブロックの範囲が不明確になりバグの温床となるため非推奨

if (1 < $data) {
  return true;
} elseif (1 == $data) {
 return false;
}

if (!$data == 100) { return true; } // 真偽逆転
if ($data == null) { return true; } // nullチェック(is_nullよりパフォーマンスが良い)
if (empty($data)) { return true; } // 空、未定義、null、空配列チェック
if (isset($data)) { return true; } // 未定義とnullチェック

if ($data) { return true; } // bool判定 空文字、「0」はfalse

// データ型判定
if (is_array($data)) { return true; }   // TRUE 配列
if (is_numeric($data)) { return true; } // TRUE 数値

■for

// foreach(連想配列)※配列でこの型を使用する場合、$keyにインデックスが設定される
foreach ($array as $key => $value) {
  continue; // ループをスキップする(次のループへ)
  break;    // ループを終了する(ループを抜けて終了する)
}

foreach ($array as $value) { /* innner */ } // foreach(配列)

■function(関数)

// 基本型 PHP6まで
function sampleMethod($data) { return true; }

// 基本型 PHP7型(引数の型、戻り値の型)
function sampleMethod(string $data): string { return True; }

function sampleMethod(&$data) { return true; } // 引数で参照渡し(引数の先頭に「&」)
function sampleMethod($data, $num=10) { return true; }  // 引数にデフォルト値設定(メソッドを呼び出す際に引数を省略可能に)

クラス

クラス名は大文字で始める(Pascal記法)が一般的
プロパティ(メンバ変数) … クラス内部で定義される変数
メソッド(メンバ関数) … クラスで管理される値を編集する関数
アクセス修飾子を省略すると public として扱われるが、コードの読みやすさのために明示することを推奨
コンストラクタ名は「__construct」にすること(PHP4まではクラス名と同じだったが以降は余程のことが無い限りそうしないこと)
staticについて … 使用機会は少ない、原則として読み取り専用の用途で使用する
クラス定数 … クラス内部で使用する定数

class SampleClass extends Master { /* innner */ } // extends(継承)

$sampleClass = new SampleClass();       // インスタンス化
$result = $sampleClass->sampleMethod(); // インスタンスメソッドを実行
$result = $sampleClass->name;           // インスタンスプロパティ(変数)へアクセス

// クラス 基本型
class SampleClass {
  public $sampleData; // プロパティ(アクセス修飾子必須)
  const APPLE_COLOR = "red"; // クラス定数

  // コンストラクタ 基本型 ※記述方法は固定(public function __construct)
  public function __construct($name) { this->name = $name; }

  // メソッド(アクセス修飾子必須)
  public function sampleMethod() {
    // this … インスタンスのプロパティを参照
    echo $this->sampleData;

    $this->sampleMethod2(); // 同じクラスのメソッドを呼ぶ 

    // クラス定数をクラス内部から参照する場合は「self::定数名」
    $result = self::APPLE_COLOR;

    parent::sampleParentMethod(); // parent:: 親クラスのメソッドを呼び出す
  }
}

アクセサメソッド(ゲッター、セッター) … カプセル化を意識した外部からアクセスするための仕組み
マジックメソッドを使用した処理も可能(使い分けは要検討)

private $data; // アクセス修飾子をprivateにする

// ゲッターメソッド
public function getData() {
  return $this->data;
}

// セッターメソッド(データ型などを意識して簡単な型チェックを行うこともある)
public function setData($data) {
  $this->data = $data;
}

// マジックメソッド ゲッター
public function __get($key) { return $this->$key; }

// マジックメソッド セッター
public function __set($key, $val) { $this->$key = $val; }

その他

ヒアドキュメント … 複数行の文章を出力する場合に用いる
コメントアウトを含めることはできない(記号がそのまま出力されるため)
IDの前後に空白や文字列が記述されているとエラー
EOM(End Of Message)、EOF(End Of File)

$result = <<< EOM
Hello
World
EOM;

文字列操作

// 文字列比較 ※「==」で比較はしないこと
// 「第一引数 < 第二引数と一致」の場合は「負の整数」、「第一引数 > 第二引数と一致」の場合は「正の整数」、等しければ「0」
$result = strcmp("こんにちは", $sample_text); // 大文字と小文字を区別する
$result = strcasecmp("HELLO", $sample_text); // 大文字と小文字を区別しない

// 連結(ドット)
$result = $str."apple"; // 変数と文字列の連結も可能
$result .= $str2;       // 同じ変数に連結して代入

// mb_strlen 文字列の長さを取得 文字数(全角半角無関係)
// ※CRLF(改行)は2文字分として扱われるバグ(微妙な仕様)がある。
$result = mb_strlen($str);

// mb_substr インデックスは「0」から
$result = mb_substr($str, 2);         // 文字列を部分取得 3文字目以降を取得
$result = mb_substr($str, 5, 2);      // 文字列を部分取得 6文字目から2文字取得
$result = mb_strstr($str, ",");       // 文字列を部分取得 指定文字より後
$result = mb_strstr($str, ",", true); // 文字列を部分取得 指定文字より前

$result = trim($str); // 文字列の先頭及び末尾の空白文字を除去

// str_contains 文字列検索 指定文字列が含まれるか bool ※PHP8以降
$result = str_contains('Hello world', 'Hello');

$result = mb_strtolower($str); // 英字の文字列を小文字に変換 アルファベット以外はそのまま(全角半角無関係)

// substr_count 指定文字が何文字含まれているかカウント 戻り値:整数
$result = substr_count($str, 'A');
$result = substr_count($str, '\n'); // 改行文字

// 文字列置換 第一引数:対象文字、第二引数:置換文字、第三引数:対象文字列
// str_replaceは、パフォーマンスも最高
$result = str_replace('apple', 'google', $str); // 指定文字列を置換
$result = str_replace(',', '', $str);           // 指定文字列を削除(例は「,」を削除)

$array = mb_split(",", $str); // 文字列を指定文字部分で分割し配列に格納(例ではカンマで分割)

ログ(error_log)

// php.iniで設定しているエラーログへ出力
error_log('Hello');

// ログファイルとして出力(第1引数に「print_r」を使用することで配列にも対応)
error_log(print_r($data, true), 3, "sample_dir/sample.log");
error_log(print_r($data, true).PHP_EOL, 3, "sample_dir/sample.log"); // 改行込み

require_once("sample.php"); // 外部ファイル読み込み(対象がない場合はエラー)

$result = ceil($data); // 小数点以下繰り上げ

// フォーマット
$result = number_format($data); // 千円単位でカンマ

header … リダイレクト

header('Location:'.$url); // URLは「http」から「ファイル名」まで
exit;

名前空間 … フルパスを省略するために定義(PHP5.3 から導入)
可読性を考慮するため1ファイルにつき名前空間は1つとする
use命令 … 名前空間にエイリアス(別名)を付与
※名前空間と、use命令は同時に扱うものではない(要調査 自信がドキュメントを見る限り)

<?php
namespace sampleDir1/sampleDir2; // 定義(ソースの最初に記述)

use /sampleDir1/sampleDir2/sampleClass; // use命令 クラスエイリアス(クラス名まで)
$sample = new sampleClass(); // フルパスで指定しなくてもよくなる

パターンマッチ
正規表現より定義済み関数を使用すること(パフォーマンス差3倍)

// preg_match 第一引数 正規表現、第二引数 対象文字列
$result = preg_match("/Hello/", "Hello World");
$result = preg_match("/^[\da-zA-Z]+$/", $sample_data); // 半角英数

フォーム

FORM

<!-- html -->
<!-- 基本型 雛形 -->
<form method="post" action="sample.php">
  <input type="text"> <!-- 実行(送信)時にPOSTされる値 -->
  <input type="submit"> <!-- form の action を 実行(送信) -->
</form>

// ファイルアップロードなどはenctypeを指定
<form method="post" action="upload.php" enctype="multipart/form-data"> <!-- sample --> </form>

スーパーグローバル変数 … PHPが最初から持っている変数、スコープも縛りがない
REQUEST非推奨の理由 … どこから取得したものか曖昧、同名キーで事故がおきる

// POST POST形式のHTMLフォームから送信された情報(formでsubmit)
$result = $_POST['sample_data']; // 取得

// GET クエリ情報経由で渡された情報

// SERVER ヘッダ情報
$result = $_SERVER['SERVER_NAME'];  // 要素「SERVER_NAME(サーバーのホスト名)」を取得
$result = $_SERVER['HTTP_REFERER']; // 要素 遷移前のページURL

// REQUEST GET、POST、COOKIEをまとめて管理
$result = $_REQUEST["sample_data"]; // 取得
$result = htmlspecialchars($_REQUEST["sample_data"], ENT_QUOTES); // 基本型 xss対応(htmlspecialchars)

セッション … セッション経由で渡された情報
ブラウザを閉じるまで有効
データはサーバに保管される
セッションは「PHPSESSID」というcookieで管理される

session_start(); // セッション開始
$_SESSION['userId'] = $_POST['userId']; // POST送信されてきた値を格納

cookie … ブラウザにデータを保存
文字列を扱う
カート情報などに使用する(画面から離れたとしても一定期間は保存しておきたい情報)
実際に使用した例)apple=100,banana=20,melon=300
有効期限にはtime()を推奨(DataTime()よりシンプルに記述が可能なため)

// 基本型 クッキーを送信する
// 第一引数:クッキー名、第二引数:データ、第三引数:有効期限
setcookie("sampleCookie", $value);
setcookie("sampleCookie", $value, time()+3600); // 有効期限 3600=1時間

// クッキーを取得(文字列で返却)
$result = $_COOKIE["sampleCookie"];

ファイル

ディレクトリ存在確認

if(file_exists($path)) { return true; }

読み込み
fopenは使わない

// ファイルの中身をすべて読み込む
$result = file_get_contents('sample_folder/sample.txt');

書き込み

// 書き込み上書き : 第一引数 ファイルパス、第二引数 書き込み内容
file_put_contents("./sample.txt", $data);

// 書き込み追記 : 第三引数に「FILE_APPEND」
file_put_contents("./sample.txt", $data, FILE_APPEND);

ファイルアップロード処理

// POSTされたファイル情報を取得
// _FILES[ input要素のname属性 ][ _FILES情報名 ]
$extension = pathinfo($_FILES['upfile']['name']);

エラー

エラーログの場所 … php.ini の err.log

E_PARSE … シンタックスエラー(文法違反)
E_ERROR … 実行時の致命的なエラー

例外処理

例外処理が導入されたのは PHP 5 からである(finally句は、PHP 5.5
例外処理が導入される前は、エラー報告で処理を行っていた
getMessage … 例外メソッド 例外メッセージを取得

try {
  // 例外が発生する可能性のある処理
} catch(Exception $e) {
  echo $e->getMessage();
}

if(true) {
  throw new Exception('例外が発生しました。'); // 例外を発生させる(処理は親のcatchへ渡す)
}

DB

PDO(PHP Data Objects)
基本的なDBに対応している

// インスタンス化(第一引数:DB接続情報、第二引数:ユーザ、第三引数:パスワード)失敗の場合 PDOException
$db = new PDO($dsn, $usr, $pass);

// prepareメソッド … SQL実行準備 プレースホルダー(後続のバインドで値を設定する)
$stmt = $db->prepare('SELECT * FROM sample_table WHERE id = :id'); // 名前付きパラメータの場合「:foo」
$stmt = $db->prepare('SELECT * FROM sample_table WHERE id = ?'); // 名前なしパラメータの場合「:foo」

// bindValueメソッド … プレースホルダーへ値を設定
$stmt = bindValue(':id', $sample_id); // 名前付きパラメータの場合
$stmt = bindValue(1, $sample_id); // 名前なしパラメータの場合 ※インデックスは「1」から

$stmt->execute(); // 実行

// fetchAllメソッド … 実行結果を配列で取得 引数でモードを設定
$result_list = $stmt->fetchAll(PDO::FETCH_ASSOC); // PDO::FETCH_ASSOC … カラム名と値のみ ※基本はこのモード

トランザクション

try {
  $db->beginTransaction(); // トランザクション開始

  // DB処理

  $db->commit(); // コミット(処理の最後に)
} catch(PDOException e) {
  $db->rollBack(); // ロールバック
}

date

$result = date('Y/m/d'); // 現在日時を取得 引数フォーマット

$result = date('Y/m/d', strtotime('+1 day', date('Y/m/d'))); // 翌日を取得 strtotime応用
$result = date('Y/m/d', strtotime('-1 day', date('Y/m/d'))); // 昨日を取得 strtotime応用

DateTime … 日付や時刻の整形、演算を行う

$date = new DateTime(); // オブジェクト生成(引数なしの場合は現在時刻)
$result = $data->format('Y-m-d'); // 形式を変更( 2020-12-31 )
$result = $data->format('Y-m-d H:i:s'); // 形式を変更( 2020-12-31 23:59:59 )

(エラー)PHPランタイムが見つかりません
brackets.json
右部のパスはそれぞれの環境に合わせて。この一文を記述すると直る。
"php":{"executablePath":"C:/xampp/php/php.exe"}

製作中に検証するページ
URL http://localhost/htdocs以降のパス及びファイル名
例)http://localhost/test/index.html

⚠️ **GitHub.com Fallback** ⚠️