PHP オブジェクト・クラス・継承・インターフェース・名前空間
オブジェクト
object型は関数もまとめることが可能
オブジェクトを作成
// クラス class クラス名 //頭文字は大文字 { // プロパティ public $変数1; public $変数2; // メソッド public function 関数名() { 処理; //自分のクラスのプロパティを呼び出す $this->変数1; $this->変数2; } }
値を代入
// インスタンス $クラス名[0] = new クラス名(); // プロパティに代入 $クラス名[0]->変数1 = 値1; $クラス名[0]->変数2 = 値2; $クラス名[1]->変数1 = 値3; $クラス名[1]->変数2 = 値4; // 関数を実行 $クラス名[0]->関数名(); $クラス名[1]->関数名();
コンストラクタ
class クラス名 { public $変数1; public $変数2; // newでインスタンス生成時に実行される関数 public function __construct($変数3, $変数4) { // 引数で受け取った値を変数に代入 $this->変数1 = $変数3; $this->変数2 = $変数4; // 変数名は変数3を変数1に変数4を変数2と同じにすればより分かりやすい } public function 関数名() { 処理; } } // インスタンスとプロパティへの代入をまとめる $クラス名[0] = new クラス名(値1, 値2); $クラス名[1] = new クラス名(値3, 値4);
アクセス修飾子
アクセス修飾子をつけなかった場合はpublicとなる
アクセス修飾子 | 説明 |
---|---|
public | クラスの内外で利用可能 |
private | クラス内でのみ利用可能 |
protected | クラス内と子クラスのみ利用可能 |
型宣言
// 型を強調させる declare(strict_types=1); class クラス名 { private string $変数1; public function __construct(string $変数2) { $this->変数1 = $変数2; } public function 関数名() { 処理; } } $クラス名[0] = new クラス名(値1, 値2);
static (クラスにプロパティを設定)
class クラス名
{
// クラスプロパティ
アクセス修飾子 static $変数 = 値;
public function __construct(引数)
{
// staticをつけたプロパティにアクセスして+1する処理
self::$変数++;
}
// クラスメソッド
public static function 関数名()
{
printf(self::$変数);
}
}
// クラスメソッドを呼び出す
クラス名::関数名();
const ( 定数 )
class クラス名 { // 定数名には「 $ 」記号を付けない!また、全て大文字にするのが慣習 アクセス修飾子 const 定数名 = 値; public static function 関数名() { print(self::定数名); } } // 定数のアクセス修飾子がpublicだった場合にクラス外から呼び出す echo クラス名::定数名;
extends ( クラスを継承 )
// 新クラスが元クラスを継承 class 子クラス名 extends 親クラス名{ }
- 継承元 = 親クラス/Superクラス
- 継承したクラス = 子クラス/Subクラス
- PHPでは親クラスは必ず1つ
- クラスを継承すると型も継承されるため、継承したクラス全てのコードを変更せずにまとめて変更可能になる
function 関数名(親クラス名 $変数名) { 処理; } foreach ($変数1 as $変数2) { 関数名($変数2); }
parent ( 親クラスのコンストラクタを使う )
public function __construct(引数) { parent::__construct(引数); }
override
親クラスと同じ名前のメソッド名を使うこと
- overrideさせたくないメソッドは親クラスでメソッドの頭にfinalをつける
final アクセス修飾子 function 関数名() { 処理; }
abstract ( 抽象クラス )
- 特定のメソッドを子クラスで必ず定義させるのに使う
- 抽象クラスはインスタンスを作ることはできない
abstract class 抽象クラス名 { // 抽象メソッド // 定義は子クラスで記述するため中身は空のまま abstract public function メソッド名(); } // 親クラスで抽象クラスを継承する(よって、親クラスは抽象クラスとなる) class 親クラス名 extends 抽象クラス名{}
インターフェース
- 抽象メソッドだけを持つことができる
- インターフェースの実装をすることで、強制するクラスを自由に決めれる
- いくつでも実装可能
- 継承関係とは無関係
implements ( 実装 )
実装したクラスはインターフェースの型も引き継がれる(継承と同じ)
interface インターフェース名 { public function メソッド名(); } class 子クラス名 extends 親クラス名 implements インターフェース名
トレイト ( 共通のコードをまとめる )
// トレイトで共通のコードをまとめる
trait トレイト名
{
共通のコード;
}
class クラス名 extends 親クラス名 implements インスタンス名
{
use トレイト名;
}
外部ファイルを読み込む
require('外部ファイル.php'); // ファイルを読み込めなかったとき処理が止まる include('外部ファイル.php'); // ファイルを読み込めなくても処理が止まらない // 既にファイルが読み込まれている場合はスキップ require_once('外部ファイル.php'); include_once('外部ファイル.php');
sql_autoload_register() ( オートロード )
newでインスタンス生成時にクラスが読み込まれていなかった場合、呼ばれる関数
// 読み込まれていなかったクラスを引数で受け取る sql_autoload_register(function ($変数名) { // 引数で受け取ったクラスを読み込む require($変数名 . '.php'); });
名前空間 ( 名前の衝突を避ける )
namespaceはベンダー名とプロジェクト名がよく使われる
namespace ベンダー名\プロジェクト名; $変数名[0] = new ベンダー名\プロジェクト名\クラス名(値);
名前空間を短い別名にする
use ベンダー名\プロジェクト名 as 別名; // 別名をプロジェクト名にする場合 use ベンダー名\プロジェクト名;
PHP ディレクトリやファイル操作
ファイル操作
fopen('ファイル名', モード)|ファイルを指定したモードで開く |
//書き込みモード(上書き)でファイルを開く $ファイルポインタ変数名 = fopen('ファイル名', 'w'); //書き込みをして改行 ferite($ファイルポインタ変数, "hoge\n"); fclose($fp);
- モードについてはPHPサイトを参照 https://www.php.net/manual/ja/function.fopen.php
モード | 説明 |
---|---|
'r' | 読み込み |
'w' | 書き込み(上書き) |
'a' | 書き込み(追記) |
//読み込みモードでファイルを開く $ファイルポインタ変数名 = fopen('ファイル名', 'r'); //ファイルサイズ関数を使って内容を全て読み込み変数に代入 $変数 = fread($ファイルポインタ変数, filesize('ファイル名')); //ファイルの先頭から1行づつ読み込んで変数に代入 while (($変数 = fgets($ファイルポインタ変数)) !== false) { echo $変数; } fclose($fp); echo $変数;//1行づつ読み込むときはwhile文の中に記述しているのでここでは記述しない
ファイルにまとめて書き込む
$変数 = "ファイルに書き込む内容"; file_put_contents('ファイル名', $変数);
ファイルをまとめて表示 '''php $変数 = file_get_contents('ファイル名'); echo $変数;
ファイルの内容を1行づつ配列に格納して配列要素を表示
$配列名 = file('ファイル名', FILE_IGNORE_NEW_LINES);//改行を無視 var_dump($配列名);
# ディレクトリ操作
//ディレクトリを開いてディレクトリポインタ変数に代入 $ディレクトリポインタ変数 = opendir('ディレクトリ名'); //1行づつ読み込んで変数に代入 while *1 !== false) { //パスの「.」や「..」だったときはスキップ if $変数名 === '.' || $変数名 === '..') { continue; } echo $変数名; }
もっと簡略化
foreach (glob('ファイル名/*.拡張子') as $変数名) { //ディレクトリ名も一緒に表示 echo $変数名; //ファイル名のみ表示 echo basename($変数名); }
|関数|説明| | :--: | :--: | |file_exists('ディレクトリ名やファイル名')|ディレクトリやファイルがあるかどうかチェック(あればtrueなければfalse)| |is_writeable('ディレクトリ名やファイル名')|書き込みが可能かチェック| |is_readable('ディレクトリ名やファイル名')|読み込み可能かチェック|
PHP 書き換え防止・ヒアドキュメント・日付( UNIXタイムスタンプ )
書き換え防止( サニタイズ )
<?= htmlspecialchars(変換文字, ENT_QUOTES, 'UTF-8'); ?>
- 特殊文字をHTML エンティティに変換する
- ENT_QUOTESはクオーテーションも変換してというオプション
ヒアドキュメント
改行などがそのまま反映する
nowdoc(変数の利用不可)
変数 = <<<'EOT' hello! こんにちは! EOT; echo 変数
heredoc(変数の利用可能)
$ja = 'japan'; 変数 = <<<"EOT" hello! $ja こんにちは! EOT; echo 変数
UNIXタイムスタンプ
//現在のタイムスタンプ time(); //日時を表示(現在日時の場合はtime()を省略可) date('Y-m-d l', time()); //日時を指定 date('Y-m-d l', mktime(時, 分, 秒, 月, 日, 年)); //日時と思われる文字列からUNIXタイムスタンプを作る date('Y-m-d l', strtotime('2022-1-2')); //1日足して表示 date('Y-m-d l', strtotime('2022-1-2 +1 day'));//2020-01-03表示される
PHP 配列
配列
配列の作成
$配列名 = array(値1,値2,...); $配列名 = [値1, 値2,...];
配列の呼び出し
$配列名[インデックス番号];
配列の値を変更
$配列名[値を変更するインデックス番号] = 新しい値;
配列の中身を確認
var_dump($配列名); //要素数,値の型,インデックス番号(キー),値を表示 print_r($配列名); //インデックス番号(キー)と値を表示
連想配列
連想配列を作成
$配列名 = array(キー1 => 値1, キー2 => 値2,...); $配列名 = ['キー1' => 値1, 'キー2' => 値2,...];
- 取り出し方は配列と同じ
よく使う関数
関数名 | 説明 |
---|---|
count(配列名) | 要素数を調べる |
sort(配列名) | 値を昇順に並び替え(キーは0から振り直される) |
asort(配列名) | 値を昇順に並び替え(キーはそのまま) |
ksort(配列名) | キーを昇順に並び替え |
rsort(配列名) | 値を降順に並び替え(キーは0から振り直し) |
arsort(配列名) | 値を降順に並び替え(キーはそのまま) |
krsort(配列名) | キーを降順に並び替え |
shuffle(配列名) | 値をランダムに並び替える(キーは0から振り直し) |
array_push(配列,値) | 末尾に値を追加 |
array_pop(配列名) | 末尾から1つ値を取り出す(削除する) |
array_unshift(配列名,値) | 先頭に値を追加(キーは0から振り直し) |
array_shift(配列名) | 先頭から1つ値を取り出す(削除する(キーは0から振り直し)) |
array_value_count(配列名) | 同じキーの要素数を数える |
in_array(値,配列名) | 配列に指定した値が含まれているか |
array_key_exists(キー,配列名) | 配列に指定したキーが含まれているか |
array_search(値,配列名) | 配列に指定した値があるときキーを返す |
implode(区切り文字,配列名) | 配列内の文字列を指定した区切り文字で1つの文字列に連結する |
explode(区切り文字, 文字列) | 指定した区切り文字で区切って配列の要素に格納する |
array_rand($配列名, 個数) | 配列から指定した個数分のインデックス番号をランダムに返す |
array_fill(開始位置のインデックス番号, 個数, 値) | インデックス番号から個数分を指定した値で埋める |
range(開始数値, 終了数値, 刻む数) | 指定した数から順番に要素として値を入れていく(刻む数が1ずつの場合は省略可能) |
array_sum($配列名) | 配列の要素の合計値を返す |
max($配列名) | 配列の最大値を返す |
min($配列名) | 配列の最小値を返す |
count($配列名) | 配列の要素数 |
array_slice(配列名, 開始位置のインデックス番号, 個数) | 配列から指定した要素をコピーして別の配列として作成して返す(引数の個数は省略すると最後までの指定になる/インデックス番号を「-」にすると末尾から-1,-2と数える) |
array_splice(配列名, 開始位置のインデックス番号, 個数, 追加する要素) | 指定した要素を削除してそこに指定した要素を追加 |
array_splice
//指定した要素を削除 array_splice($配列名, インデックス番号, 個数); //指定した要素を削除してそこに要素を追加 array_splice($配列名, インデックス番号, 個数, 追加する要素);//追加する要素は配列で複数追加することも可能[数値, 数値,...] //削除はせずに要素の追加のみ array_splice($配列名, 開始位置のインデックス番号, 0, 追加する要素)
2つの配列を操作/配列から新しく配列を作成
関数 | 説明 |
---|---|
array_keys($配列名) | キーのみ返して配列を作成 |
array_values($配列名) | 値のみ返して配列を作成 |
array_merge($配列名1, $配列名2) | 配列1の後に配列2を連結した新しい配列を作成$配列名 = [...$配列名1, ...$配列名2]でも可 |
array_unique($配列名) | 重複データを取り除いた新しい配列を作成 |
array_diff($配列名1, $配列名2) | 配列名1から配列名2にある要素を引く |
array_intersect($配列名1, $配列名2) | 共通の要素だけの配列を作成 |
array_map($関数名, $配列名) | 関数を全ての要素に適用した結果を新しい配列として作成 |
array_fillter($配列名, $関数) | 要素にtrueかfalseを返す関数を適用しtrueだった要素のみで新しい配列を作成する |
特殊なsort
usort
usort(
$配列名,
//要素を並び替えるとき、二つの値をどう比較するかを定義
function ($a, $b) {
//二つの値が同じで、順番を変えたくないとき0
if ($a['比較する値のキー'] === $b['比較する値のキー']) {
return 0;
}
//$a['キー']が$b['キー']より大きいという並び替え
return $a['キー'] > $b['キー'] ? 1 : -1;
}
);
DBのデータのような配列の中に複数の配列がある場合のソート
関数 | 説明 |
---|---|
array_multisort($配列1, $配列2, $新配列) | 配列1が同じ値の時、配列2を比較。結果を新しい配列として作成 |
array_multisort
デフォルト時は小さい順、アルファベット順のため逆を指定するには
array_multisort( //大きい順で数値と指定 $配列1, SORT_DESC, SORT_NUMERIC, //アルファベットの逆順で文字列と指定 $配列2, SORT_DESC, SORT_STRING, $新配列 );
関数 | 説明 |
---|---|
reset() | 配列内のポインタを先頭の要素にする |
current() | 配列内の現在の要素を返す |
key() | 連想配列のキーを返す |
next() | 次の配列要素を返す |
配列の要素を全て取り出す
foreach ($配列名 as $変数名){
処理内容
}
//キーも取得
foreach ($配列名 as $キー用の変数名 => $要素用の変数名){
処理内容
}
- 全ての配列要素を全て取り出す
- 取り出した要素を変数に代入する
配列の中に配列を入れる
$配列名 = [値1, $別の配列名, 値2,...];
値を取得するには
$配列名[インデックス番号][入れ子のインデックス番号];
配列の中に別の配列の値を入れる
$配列名 = [ 値1, ...$別の配列名, 値2,... ];
- 配列の中身の型は統一されてなくても大丈夫
PHP 関数・ビルトイン関数
関数
function 関数名() { 実行したい処理; }
実行させるとき
関数名();
引数あり
function 関数名($変数名) { 実行したい処理; return 変数名など; }
実行させるとき
関数名(引数);
引数が渡されなかったときの値として初期値を設定する場合
function 関数名($変数名 = 値) { 実行したい処理; return 変数名など; }
無名関数
$変数 = function (引数) { 実行処理; return 変数など値; };
引数の型を指定
declare(strict_types=1); //型を厳密にチェックする時に記述 function 関数名(型 $変数, 型 $変数): 返り値の型を指定//返り値がない場合はvoidを記述
- 型の前に「 ? 」をつけると「null」か「型」どちらかという指定ができる(?string = nullか文字列という指定)
可変長引数
渡された全ての引数を配列にして代入する
function 関数名(...$配列名) { 実行処理; }
複数の返り値
function 関数名(...$配列名) { 実行処理; return [値1, 値2,...]; }
例
function sum(...$nums) { $ans = 0; foreach ($nums as $num) { $ans += $num; } return [$ans, $ans / count($nums)]; }
戻り値をまとめて変数に代入
list($変数名, $変数名...) = 関数名(引数, 引数,...); [$変数名, $変数名...] = 関数名(引数, 引数,...);
アロー関数
fn(引数) => 実行する処理;
ビルトイン関数
sprintf
sprintf("[%10s][%3.2f]", 文字列, 浮動小数);
- %の後に表示幅を指定できる(指定しなくてもOK)上記の10は10文字分3.2は整数が3桁と小数が2桁文という意味になる
%表示幅の後に型を指定(s=文字列, f=浮動小数)
表示幅の前に「 - 」で左寄せ
- 表示幅の前に「 0 」で数値の左側を0で埋める
関数 | 説明 | 日本語の場合 |
---|---|---|
strlen(文字列) | 文字数を返す | mb_strlen(文字列) |
trim(文字列) | 空白を除去 | |
strpos(文字列, '検索文字') | 指定文字の位置を返す | mb_strpos(文字列, '検索文字')|指定文字の位置を返す |
str_replace('古文字', '置換文字', 文字列) | 置換 |
文字列に関する関数
関数 | 説明 |
---|---|
substr(文字列, 開始位置, 桁数) | 文字列の指定した分を切り出す |
substr_replace(文字列, 置換文字列, 開始位置, 桁数) | 文字列の指定した部分を置換 |
正規表現を活用する関数
関数 | 説明 |
---|---|
preg_match(検索パターン, 文字列, $結果を格納する変数) | 最初にヒットした結果のみ変数に格納 |
preg_match_all(検索パターン, 文字列, $結果を格納する変数) | ヒットした結果全てを配列にして格納 |
preg_replace(検索パターン, 置換文字, 文字列) | ヒットした文字列を全て置換 |
数字に関する関数
関数 | 説明 |
---|---|
ceil(数値) | 小数点以下を切り上げ |
floor(数値) | 小数点以下を切り捨て |
round(数値, 四捨五入する位置) | 四捨五入 |
mt_rand(数値1, 数値2) | 乱数(数値1以上、数値2以下の乱数) |
max(数値,数値,...) | 引数の中から最大値を返す |
min(数値,数値,...) | 引数の中から最小値を返す |
M_PI | 円周率 |
M_SQRT2 | 2の平方根 |
PHP webクライアントからwebサーバへデータ送信
GET
- 送信データがURLに埋め込まれる
- 送信データが丸見えのため個人情報などの送信には使えない
- 大量のデータを一度に送信できない
- データ送信後のページをお気に入りに保存可能
POST
- 送信データがメッセージボディに格納される
- 送信データは直接確認できない
- 大量のデータを一度に送信できる
- データ送信後のページをお気に入り保存できない
- バイナリデータを送信できる
HTMLでGETかPOSTかを指定
<form action="PHPファイル名" method="get(post)">
PHPで値を受け取る
{$_method値['name値']}
チェックボックス
キーに[ ]を付ける
<input type="checkbox" name="キー名[]"value="値" />
- 選択した複数の値が配列として格納される
PHP if文・switch文・for文・while文
if文
if (条件1){ 処理1; } else if (条件2){ 処理2; } else { 当てはまらない時の処理; }
演算子 | 説明 |
---|---|
== | 値を比較( [ 数値 ]と[ 文字列の数値 ]でも真となる ) |
=== | 値とデータ型を比較 |
if文を短く(読み難くなるため注意)
条件式 ? trueの時の処理 : folseの時の処理;
switch文
switch(式または変数){ case 値1: 処理1; break; case 値2: 処理2; break; default: //どのパターンにも当てはまらない場合に実行される処理(不要な場合は省略可) 処理3; //defaultの場合、break;を省略可 }
for文
for (初期化式; 繰り返し条件; 変化式) { 繰り返す処理; }
- breakでループを抜ける
- continueでスキップ(下記if文をループ処理に記述)
if (条件) { continue; }
条件を満たす間は処理を実行(while / do ~ while)
while(条件を満たさない場合は1度も実行されない)
while (条件) { 実行したい処理; 変化式; }
do ~ while(条件を満たさない場合でも1度は実行される)
do { 実行したい処理; 変化式; } while (条件);