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);
モード 説明
'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('ディレクトリ名やファイル名')|読み込み可能かチェック|

*1:$変数名 = readdir($ディレクトリポインタ変数

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 (条件);