PHP

2022年11月1日

目次

PHP等

・PHPはサーバサイドスクリプト。
・ブラウザにはPHPの翻訳機能は無い。
・サーバ上でPHPを実行した結果をダウンロード。
・PHPを学ぶ為にブラウザとWEBサーバが必要(の為MAMP使用)。
・ApachがWEBサーバ(以前は主流)、今はnginXらしい。
・バックエンドの仕事はLinux等の広範囲な知識が必要。

・TeraPadは、ctrl+jで指定の行番号へ飛べる。
・起動時の設定で動き続けるので設定変更時はMAMPを再起動。
・ドキュメントルートは、サーバが管理している所(C:\MAMP\htdocs)。
・PHPでブラウザ表示されたもののコードは見えない。

VSCode拡張(PHP用)

①PHP Intelephense
・インストール
・拡張機能の設定から下記を確認
Environment: PHP Version を確認
Diagnostics: Argument Countのチェックを外す(上の方に項目有り)
Format: Enableのチェックを外す(下の方に項目有り)

②builtin php
・デフォルトで入っているので検索して、無効にする

③Open PHP/HTML/JS In Browser
・まずliveServerを止める
・localhost の port 番号が 80ならそのまま

④phpfmt ? PHP formatter
・インストール
・Detect_indentはチェック無
・Enable_auto_alignはチェック有
・Php_binはPHPのバージョン通りパス入力
・Psr1はチェック入れる
・Psr1_namingはチェック無
・Psr2はチェック無

④の拡張機能開く
・Indent_with_spaceのsetting.jsonをクリックし、Indent_with_space を2に変更
・Passesも同様にsetting.jsonで入って、"AlignPHPCode”を追加

Document Root Folder 検索して入力
C:\MAMP\htdocs\

Url To Open 検索して下記選択
http://localhost/

開始タグと終了タグ

<?php
echo "こんにちわ";
?>

・htmlにPHPを書く時はbodyタグの中に書く。
・文字列はダブルクォーテーションで囲む。
・シングルクォーテーションの場合、表示されるが動きがかわる。
・一行で書く場合、開始タグの後にスペースが必要。

・ステートメント(行、命令文)の最後はセミコロン。
・閉じタグ直前のセミコロンは省略可ではあるが、書く方がベター。

大文字小文字

・関数やクラス(は大文字小文字)の区別はされない。
・変数は区別される。

コメント

// 1行コメント
# 1行コメント

/*
複数行コメント
*/

echo

HTMLの中に文字列を出力し、複数の値を表示出来る。

// 変数Aを表示
<?php echo $A; ?>

// php echoの表記を=に省略可能
<?= $A; ?>

// htmlタグも文字列としてhtml内に出力して、ブラウザ上で改行されて表示。
<?php
echo "あいうえお", "<br>";
echo "かきくけこ";
?>

カンマとピリオド

「,」で区切ると複数を続けて扱える(タグも可)。
「.」は文字と文字を連結。

<?php
  $a = "犬";
  // どちらも「サルとキジと犬」が出力
  // 1行目の最後のタグで改行
  echo "サルとキジと", $a, "<br>";
  echo "サルとキジと" . $a;
?>

<script>
  let b = "犬";
  // JavaScriptの文字連結は「+」
  console.log("サルとキジと" + b);
</script>

定数

JavaScriptと同じで、constで定義。

<?php
const ●●
(省略)
?>

又は

define("●●", 代入する値)

定義済みの定数

・コアモジュール定数・・・コアで定義された定数。
・マジック定数・・・主にデバッグ時に使う定数。

// マジック(マジカル)定数
// 書いた場所によって値が変わる定数
// 例)__LINE__は書いた場所の行番号が格納
echo __LINE__, "<br>";
echo __LINE__, "<br>";

・タグ入力を機械がやってくれているので、改行したい時はbrタグを文字入力するとブラウザ上で改行される。

__LINE__

・マジック定数の一つ。
・ファイル上の現在の行番号。

変数

$文字列

// $who部分が変数
  <?php
    $who = "PHP 7";
    echo "こんにちわ、", $who;
  ?>

・JavaScriptの「let ●●」的なもん。
・「,」は、続きますという意味。
・PHPタグはページ内で何回区切ってもOK。

・変数には文字列でも数値でも可(型のチェック無)。
・変数は全て大文字が慣例。

変数の計算順

// 先に右辺の足し算をしてから最後に代入
$合計 = $A + $B + $C;

スコープ(変数の有効範囲)

変数には有効範囲が有る。

JavaScriptは、{}(ブロック)の中で宣言した変数は{}外では使用出来ない(ブロックスコープ)が、PHPは{}外でも使える(グローバル変数)。

グローバルスコープ・・・関数外で定義した変数の有効範囲
ローカルスコープ・・・関数内で定義した変数の有効範囲(関数内で有効)

・PHPは関数の中と外は別世界。
・同名の変数でも内と外は別物(JavaScriptなら使用可)

グローバル変数

関数内で書くと、外の変数(グローバルスコープ側)が関数内で使用可。

global 変数;

・但し、中から外の変数を変更出来てしまうのでエラーのもとになる可能性有り。

スーパーグローバル変数

PHPの定義済み変数で、ローカルとグローバルの両方のスコープを持つ変数。
・$_で始まる変数。$_SERVER等。

スタティック変数

ローカルスコープ側の変数だが、値はグローバルスコープ側同様に保持される変数。

static 変数名 = 初期値;

・初期化(変数=0)は最初の1回だけ。

“"の中で$●を表示したい時

・""の中で「$a」表示したい時は「\$a:」。

print()

1個の値を表示。

// 変数Aを表示
<?php
print($A)
?>

// ピリオドで連結して出力
print $A . "あ". $B;

・複数の値を表示出来ない(.で連結して1つの単語化すれば可)。
・今時は使用しないらしい。

preタグ

ソースコードの改行やインデントをそのまま表示したい時に使うhtmlのタグ。
・PHPの配列を表示する時に使うと便利(縦並びで見易くなる)。
・preformatted text(プレフォーマティッド)の略で整形済テキストと言う意味らしい。

print_r()

配列やオブジェクトを表示。

・print_r()を使用時は、preタグもセット(で覚える)。

// <pre>タグをつけるとブラウザ上の表示が見やすくなる
<pre>
<? php
print_r(配列);
?>
</pre>

// 別の書き方(上記と同じ表示)
echo "<pre>";
print_r(配列);
echo "</pre>";

・論理値やNULLは出力不可。
・alseは表示なし、trueは1と表示される。

var_dump

・理論値やデータ型等も出力出来る(デバッグ向き)。

var_dump($a);

エラー文

Notice: Undefined variable: (変数A) in C:\MAMP\htdocs\(省略)●●.php on line 20

// 訳)(エラーラベル):定義されていない 変数Aが パスにある●●.phpの20行目

・Notictは大したエラーではないらしい。

Parse error: syntax error, unexpected '、' (T_STRING), expecting ';' or ',' in C:\MAMP\(省略).php on line 15

// 構文のエラー,予期しない「、」が有り 「;」or「,」が必要

・syntax=構文
・unexpected=予期しない
・expecting=期待(必要?)

・token(トークン)=プログラム言語の中の言葉という意味

代入演算子(=)

左辺に右辺を代入。

$A = 1000;

複合代入演算子(+=、-=、*=、/=、%=、.=)

$a = $a + bを短くしたやつ、他も同様。

$a += 100;

算術演算子(+-*/%**)

// aのb乗
a ** b

// aをbで割った余り
a % b

文字列結合演算子

.(ピリオド)

$a = 10;
$b = 20;
print $a . "あ". $b;  // 「10あ20」と出力

・文字列でも数値でも連結。

変数を{}で囲む

変数を{}で囲むと、前後に空白を入れずに文字列化。

// 「あい、うえお」と文字列出力
$b = "い";
$c = "えお";
echo "あ{$b}、う{$c}";

余りは、整数で計算される

// phpタグの中に小数点以下付きの数字、%の式があったら・・・
12.345 % 7.89
→ 12 % 7
→ 余り5

オペレータとオペランド

演算子・・・オペレータ
演算対象の値・・・オペランド

12.345 % 7.89 の場合
% がオペレータで、12.345と7.89がオペランド。

数字入り文字列の計算

文字列の数字だけ抜き取って計算される(が、使わない方がいい)。

// 15と出力される
<?php
$a = "5円" + "10円";
echo $a;
?>

インクリメント(++)

変数に1を足す事を、インクリメント。

// $aに1を足す(変数自体が1増える為、出力が1)
$a = 0;
$b = ++$a;
echo $a;

// この場合は出力0
$a = 0;
$b = $a + 1;
echo $a;

デクリメント(–)

変数から1を引く事を、デクリメント。

// $aから1を引く
--$a

ポストインクリメント(ポストデクリメント)

インクリメントと逆側に++がつく。

// $bに$aを代入してから1を足す
$a = 0;
$b = $a++;
echo $a;  // 1が出力
echo $b;  // 0が出力

// --も同様

文字のインクリメント(デクリメント)

インクリメントは文字にも適用される。

例)
$a = "10";
++$a;  // 11

$b = "c";
++$b;  // d (アルファベットで1文字進む)

// --も同様

インクリメント系を日本語で言うと・・・

++ = 加算子
— = 減算子

インクリメント = 前置加算子
ポストインクリメント = 後置加算子
(減算子も同様)

比較演算子(>,<,<=,>=,==,===,!==等)

// 値が等しい時
==

// 値も型も等しい時
===

// 値が等しくない時
!=

// 値、又は型が等しくない時
!==

// aがbより小さい時は負の値、=なら0、aが大きい時は正の値。
a <=> b

// abcの順にみて最初にnullじゃない値。全てnullならnull。
a ?? b ?? c

・nullはコミュニティにより「ヌル」や「ナル」。

論理演算子

論理積=かつ
論理和=または
排他的論理和=どちらか片方
否定=ではない

// 両方がtrueの時true(論理積)
a && b

// a又はb、又は両方がtrueの時true(論理和)
a || b

// a又はbのどちらか片方だけtrueの時true(排他的論理和)
a xor b

// aがtrueならfalsefaleseならtrue(否定)
!a

・英単語のandもいけるが遅いので使用しない

mt_rand();

// 0~100の乱数を作る。
mt_rand(0,100);

三項演算子

// 条件式がtrueならa、falseならbを代入
変数 = (条件式)? a : b;

// 例
変数 = ($a>$b)? $a : $b

// 上記をif文で書くと…
if($a>$b) {
  変数 = $a;
} else {
  変数 = $b;
}

PHPの公式マニュアル

ここを見れば間違いないらしい
https://www.php.net/manual/ja/index.php

ビット演算子(<<、>>)

あまり使わない

// aを左へb桁シフトする
a << b

// aを右へb桁シフトする
a >> b

// 例
// 3は2進数で11。
// 11を左に1ずらすと110
3 << 1

キャスト演算子

PHPは変数に型宣言は必要無い(自動変換)が、指定したい時はキャスト演算子が使える。

// 例)$aをint型に指定
(int)$a

・但し、これもあまり使わないらしい

演算子の優先順位

・演算子には優先順位がある
・and xor orなどは低い
・算数的な感じ(掛け算が先とか…)

if文

// もし条件式がtrueなら処理A、falseなら処理B
if(条件式){
  処理A
} else{
  処理B
}

・else以下は無くてもいい(=false時は処理無)

ネスティング

ネスト=入れ子

<ul>
  <li>
   <a>
  </li>
</ul>

・ifの中にifがあるとif文のネスティング

// 条件式をまとめる時
if ((条件式A) && (条件式B)){
  処理a
};

if文(複数)

else ifで3択以上の条件式が出来る。

if(条件式A){
  処理A
} else if(条件式B){
  処理B
} else{
  処理C
};

・最後はif不要(elseだけ)。

・{}で囲まずコロンで区切り書式もある。

if(条件式A):
  処理A
else if(条件式B):
  処理B
else:
  処理C
endif;

// 例)
<?php
$age = 18;
?>
<?php if ($age<=15):?>
  15歳以下の料金は800円 <br>
<?php elseif ($age<=19):?>
  16歳~19歳は1200円 <br>
<?php else:?>
  20歳以上の大人は1500円 <br>
<?php endif;?>

・PHPはendとifは続けて書く

switch文

値で分岐する。

switch(式){
 case 値1:
  処理A
  break;
 case 値2:
  処理B
  break;
 default:
  処理C
  break;
}

・default以降を省略可。
・厳密判定に向かない。
(例)文字の"10″と数値の10の処理をわけたい時など

while文

繰返す回数が未定時向きの繰返し文。

while(条件式){
  処理
}

count(配列)

配列の要素数を数える関数。
・引数に「=●●」って書いてたら省略可(PHPマニュアル)。
・PHPの配列はオブジェクトではない。
・PHPにpushメソッドはないので関数で代用。

// JavaScript時
// 配列はオブジェクト
// lengthはプロパティ
// .push()はメソッド
let num = [1,2,3];
while(num.length < 5){
  num.push(4)
}

in_array(a,配列)

配列の中にaが入っているか確認する関数。

array_push(配列,a);

配列にaを追加する関数。
・mixedは何を渡してもOK(PHPマニュアル)。

do-while文

// 処理後に条件が合えば繰返すループ文。
do {
  処理
} while(条件式);

for文

カウンタを使った繰り返し文。

for(カウンタの初期化; 条件式; カウンタの更新){
 処理;
}

・カウンタの初期化は、繰返し前に一度だけ行う。
・カウンタの更新は、ブロック内を全て実行後に行う。

break;

繰返しを中断する。

continue;

繰返しをスキップする。
・breakよりは使わないらしい。

よく使う数学関数

abs(数値)
数値の絶対値。

ceil(数値)
端数を切り上げた数値。

floor(数値)
端数を切り捨てた数値。

round(数値)
端数を四捨五入した数値。

ユーザー定義関数

プログラマー自身が作る関数。

function 関数名(引数1,…){
  処理
  return 戻り値;
}

// 引数の初期値設定が有るユーザー定義関数
// 前から埋めるので一番最後だけ省略は可
// 前だけ省略とかは不可(引数がどこの値か不明の為)
function 関数名(引数1=初期値1,引数2=初期値2,…){
	処理
	return 戻り値;
}

// 引数の2個目以降の個数を固定しない場合
// 2個目以降は配列に保管(2個だけでも配列に入る)
function 関数名(引数1, ...引数){
	処理
}

// 引数の型指定:返り値の型指定
// 返り値の型指定を省略も可
function 関数名(型 引数):返り値の型{
	処理
	return 返り値;
}

PHP_EOL

コード上の改行(コードを見やすくする為)。
・brタグはブラウザ上の改行。

// 文字列を表示.(ブラウザ上で改行).(ソースコードを改行)
echo "文字列" . "<br>" . PHP_EOL;

functionを書く場所

・DOCTYPE宣言の上に書く事もある。
・ファンクション自体は上でも下でもどこに書いても呼び出せる。
・プログラムを読む時に、まずファンクションが無いか探している。

変数の値渡しと参照渡し(&変数)

値渡し・・・変数の値を渡す。
参照渡し・・・変数の参照(住所)を渡す。

可変変数

// 変数に入っている文字で新しい変数が作れる
// ${$color}ともかける
// $blueという変数を作って右辺を代入しているだけ
<?php
$color = "blue";
$$color = 123;
echo $blue;
?>

無名関数

// 名前の無い関数
function(引数){
	処理;
}

・名前かぶりを防ぐ為、出来る限り無名関数で作る流れ(JavaScript)。

文字列に変数を入れる時

// "文字列"の中に変数を入れる時は{}で囲む
"文字列{変数}文字列"

エスケープシーケンス

“"の文字列で使える物
\"・・・"だけ表示される。
\n・・・ラインフィード(LF)。ソースコード上の改行。
\r・・・キャリッジリターン(CR)。ブラウザ上の改行(preタグで囲む)。
・他にも色々有り。
・エンマークとバックスラッシュはイコール。

’’の文字列で使える物
\’・・・’が表示される。
\・・・\が表示される。

ヒアドキュメント構文

長い文字列を代入(出力)するのに便利な構文。

変数 = <<< "識別子"
ながい文字列
識別子;

・識別子はなんでもいい(ABCとか)。
・一般的なのはEOD(エンドオブドキュメント)、EOM(~メッセージ)、EOF(~ファイル)とか。
・改行コードやタブもそのままHTMLのソースコード側に表示される。
・終わり側の識別子の前にスペースやタブを入れるとエラー。
・変数が展開される。

Nowdoc構文

<<< '識別子'
文字列
識別子;

・変数が展開されない(変数をそのまま表示)

PREタグとは(HTML)

・PREとは「preformatted text(整形済みテキスト)」の略。
・preタグで囲んだ範囲の整形済みテキストを表示するためのタグ。

フォーマット文字列を表示

printf('フォーマット文字列',値1,…)
// 例)円周率を小数第2位まで表示
// printf(書式,円周率)
printf('%.2f', M_PI);

・フォーマット=書式。
・フロートのf(浮動小数点数)
・M_PIは、円周率。

フォーマット文字列の構文


'...%書式修飾子 型指定子...'

フォーマットされた文字列を返す

sprintf()

・フォーマット後の文字列を変数に代入出来る。

number_format(引数);

3桁区切りの文字列作成。

// 例)1,000円と表示される
$p   = 500 * 2;
$k = number_format($p);
echo $k, "円";

・画面表示直前に使用する(計算はそれ迄に)

mb_strlen(引数);

文字数を調べる。

// 例)(文字数)5が表示
$m = "あいうえお";
$l = mb_strlen($m);
echo $l

mb(マルチバイト)。
・strlen(ストリングレンジ)。
・日本語圏はmb_必要(全角文字)。
・英語はmb_不要。

mb_substr(文字列,文字位置,文字数);

文字列から途中の文字を取り出す。

// 例)表示は下記のコメント参照
// えお、かきくけ(4文字目から7文字)
// こ。(最後から2文字)
$m = "あいうえお、かきくけこ。"
echo mb_substr($m,3,7);
echo mb_substr($m,-2);

・1文字目は0。
・-1は最後の文字。

mb_convert_kana(文字列, option, encoding);

文字を変換する。

// 例)文字とスペースを半角にする
$m = "A B C D E F"
mb_convert_kana($m, "rs")

・option
r・・・全角英字を半角へ
n・・・全角数字を半角へ
a・・・全角英数記号を半角へ
s・・・全角スペースを半角へ
他にも色々有り(詳細はPHPマニュアル参照)。

・encodingは文字コードの変換?で省略可。

trim(文字列);

文字列前後の不要な空白を取り除く。

// 例)タブと空白を取り除く
$m = "\tあいうえお    \n";
$r = trim($m);

・\t・・・タブ
・\n・・・改行

htmlspecialchars(文字列, 変換パターン, 文字コード);

HTMLの特殊文字をエンティティ(実体)に変換する。

// HTMLエンティティ= &で始まり;で終わる文字列(例)&amp;
// ENT_QUOTES = 'と"を文字を変換
echo htmlspecialchars($m, ENT_QUOTES, 'UTF-8');

・これで攻撃を防いだり出来る。

文字列と数値を比較する時

==ではなく===で比較する。
==だと中途半端に変換されて誤審を招くから。

mb_strpos(文字列A, 文字列B)

文字列Aの中に文字列Bがあるか検索。
・なければfalse。
・あれば何文字目にあるか数字が出る。
・最初にあった場所の数字が出る。

正規表現

パターンを使って文字のマッチの有無を判定。通常の検索より複雑な文字検索が出来る。

正規表現のパターン構文

/パターン/後置きオプション

// 例)郵便番号を正規表現で表す
// 数字3桁ハイフン数字4桁で終わり
/^\d{3}-\d{4}$/

preg_match(パターン,対象の文字列)

対象の文字列にパターンのマッチを確認する関数。
マッチすれば1、しなければ2、エラーはfales。

メタ文字

正規表現パターンの中で意味のある記号。

.(ドット)・・・何でもいい

デリミタ(区切り文字)

区切る文字。
・英数字とバックスラッシュ以外の文字なら何でもOK。
・スラッシュを含む文字列の場合は#で区切ったりする。

文字クラスを定義([])

文字クラスを定義([])
[0-9]・・・数字どれか
[a-z]・・・小文字英字どれか
[a-zA-Z]・・・英字どれか
[0-9a-zA-Z]・・・英数字どれか
[689]・・・6か8か9どれか
[黒白]・・・黒か白どっちか
[^黒白]・・・黒か白ではない

定義済みの文字クラス

\d・・・数字。[0-9]と同じ。
\D・・・数値以外。[^0-9]と同じ。

他にも有り。

文字クラス定義外([]の外)で使うメタ文字

バックスラッシュ・・・エスケープ
^・・・先頭一致
$・・・終端一致
.・・・任意の1文字(改行は含まない)
|・・・選択肢の区切り
[]・・・文字クラスの定義
{n}・・・n回繰返し
{n,}・・・n回以上
{n,m}・・・n~m回の繰返し
*・・・0回以上の繰返し。{0,}の省略形
+・・・1回以上の繰返し。{1,}の省略形
?・・・0又は1回の繰返し。{0,1}の省略形

/ab*c/
abbbbbbbbcはマッチ
acもマッチ

選択肢

// A又はBにマッチする。
"/選択肢A|選択肢B/u";

・|・・・又は(or)。これもメタ文字。

繰返し

// 数字がn桁(n回繰返す)ならマッチ。
"/[0-9]{n}/u"

// 小文字が3~8文字ならマッチ。
"/[a-z]{3,8}/u";

// ハイフンが0個か1個
-{0,1}

// 携帯番号にマッチするか
  $p = "/^(090|080|070)-{0,1}[0-9]{4}-{0,1}[0-9]{4}$/u";
  var_dump(preg_match($p, "090-1234-5555"));
// 定義済みのクラスメタ文字を使用すると下記の用に短縮出来る
"/^(090|080|070)(-?\d{4}){2}$/u";

・{3,8}の8の前にスペースを入れるとダメ(プログラマー的には入れたいが要注意)。

マッチした文字列を取り出す

// 変数Aのパターンにマッチする物を、変数Bの文字列から探し
// マッチした物が有れば$matches(第3引数)の配列に1個だけ入る
// preg_matchは最初にマッチした物だけを見る関数
preg_match(変数A, 変数B, &$matches);

&$matchesは参照渡し(直接追加)
・実際にコード書く時は&不要。
・preg_match自体はfalseか0か1(マッチ)しか返さない。

マッチした全ての値を取り出す

// 文字列の中からパターンにマッチした物を全て
// &$matches配列に入る
preg_match_all(パターン, 文字列, &$matches);

・2次元配列で、0番目の0から順に入る(0-0、0-1、0-2…)。
・パターン内のサブパターンは1番目から入る(1-0…)

implode(文字, 配列);

// 例)配列に入っている値を文字を挟んで出す
// 1-2-3と表示される
配列 = [1, 2, 3];
echo implode("-",配列);

・よく使う

検索置換

// 検索対象内でパターンとマッチする文字列を置換える
置換え用文字列の変数 = ****$1
preg_replace(パターン, 置換え用文字列, 検索対象の文字列)

・パターン内にサブパターンが複数有れば、その分だけ$1、$2…と増えていく。
・$0はマッチしたパターン全体を表示(例)サブ1、2もひっくるめて全体。
・サブパターンは()で囲む。

配列

// 例)
<?php
  $a = [];
  $a[0] = "あ";
  $a[5] = "い";
  $a[]  = "う";
  print_r($a);
?>

・基本的にはJavaScriptと同じ感じ。
・飛び番OK(他の言語では基本無いらしい)。
・インデックス番号書かなくても代入可。
・[]の時は、空いてる所の最大の数+1の所から順に代入。

連想配列

キーと値を組み合わせた配列。

$配列名 = [
	キー名 => 値,
	キー名 => 値
];

// 例)
$配列名 = [
	"name" => "きつね",
	"age" => "9"
];

// キーの値を変更
$配列名['キー名'] = 値;

// 要素を追加
$配列名['追加したいキー名'] = 値;

・非常に良く使う。
・文字の括りはシングルでもダブルでもOK。

文字列⇔配列

// 文字列を配列にする
explode("区切り文字", 文字列)

// 配列を文字列にする
explode("連結文字", 配列)

// 例)
$p = " 一郎, 次郎, 三郎";
$delimiter = ",";
$nList  = explode($delimiter, $p);
print_r($nList);

// 配列から文字列にもどす(さんをつけて)
$moji = implode("さん、", $nList);
$moji .= "さん";
print($moji);

配列の要素を削除する

// 配列の指定位置から指定個数の要素を削除
// 配列を直接書き換える
array_splice(&配列, 位置, 個数);

コード書く際は、配列の前に&は不要。

配列を演算子+で連結

// 演算子+でたすと
// 「あいうde」が表示(空の所だけ入る)
$a      = ["あ", "い", "う"];
$b      = ["a", "b", "c", "d", "e"];
$r = $a + $b;
print_r($r);

array_marge()で連結

// インデックス配列
// 下記の場合、
// 「あいう12345」が表示(全部つながる)
$a = ["あ", "い", "う"];
$b = ["1", "2", "3"];
$c = ["4", "5"];
$r = array_merge($a, $b, $c);
print_r($r);

// 連想配列
// 下記の通り(bだけ8に上書き)
// [a] => あ
// [b] => 8
// [c] => う
// [d] => 3
$a = ["a" => あ, "b" => い, "c" => う];
$b = ["b" => 8, "d" => 3];
$r = array_merge($a, $b);
print_r($r);

array_merge_recursive(配列A, 配列B);

重複する項目は多重配列で全て残す形で連結。

2次元配列の出力方法

// 例)a-2を出力
echo 配列[a][2]:// a-2の出力方法
echo 配列[a][2]:

配列を切り出す

array_slice(配列,位置,個数);

配列から値を順に取出す繰返し

foreach (配列 as 変数) {
  変数を使った繰返しの処理;
}

・理由が無い限り、専用構文を使った方が効率が良い。

配列からキーと値を順に取出し繰返す

foreach(配列 as キー => 値){
	キーと値を使った繰返しの処理
}

配列から条件に合う値を抽出

// 配列から条件(第2引数の関数)合う値を抽出
array_filter(配列, コールバック関数名);

・コールバックは、関数から関数を取り出す。

配列を変数に展開

list(要素1, 要素2, 要素3…) = インデックス配列;

ソート

// 昇順にソートする(並べ替え)
sort(配列);

(余談)
new(Array)があったら気を付ける(参照渡し)。

値渡し・・・変数のコピーを渡す(渡し先で変数の値を変更しても、渡し元に影響無し)

参照渡し・・・変数がある住所情報を渡す(渡し先で変数を書き換えると、渡し元の変数も変更される)。

natsort();

自然順にソート。

// 1.3.2.10なら、1.2.3.10の順に並べるのが自然順。
natsort(配列);

in_array();

配列に値の有無をチェックする。

// 値が配列の中に有ればtrue、無ければfalse。
// インデックス配列、連想配列のどちらでも検索可。
in_array(値,配列);

array_diff();

配列を比較して一致しない値を配列にして返す。

// チェックする配列の値が、配列AとBに含まれていない値をチェック。
array_diff(チェックする配列,配列A,配列B);

array_walk();

各要素を引数にして関数を繰返し実行。


// 配列の値分、関数を繰返す
// 配列を直接書き換える(参照渡し)
array_walk(&配列, コールバック関数, ユーザーデータ);

// 第3引数が有る場合は、コールバック関数にも設定する
function 関数名(値, キー, ユーザーデータ){
	処理分
}

array_map();

配列の個々の値でコールバック関数を実行
// 処理した配列がAに入る(Bはそのまま)
// コールバック関数名だけで()不要
配列A = array_map(コールバック, 配列B)

// コールバック関数
// キープしてた結果をまとめて配列で返す
function 関数名(値){
	処理
	return 値;
}

複数の配列を並列的に処理
// 複数の配列を並列的にコールバック関数で処理
配列A = array_map(コールバック, 配列B, 配列C,…))

// コールバック関数
function 関数名(配列Bの値,配列Cの値,…){
	処理
	return 値;
}

クラス定義

// プロパティとメッソドがあるクラスの定義
class クラス名{
	// プロパティ
	public const 定数名 = 値;
	public $変数名;
	// メソッド
	public functionメソッド名() {
	}
}

・クラス名の頭は大文字(慣例)。
・クラスは、専門家。
・クラスの中身に、プロパティとメソッドが有る。
・プロパティは、データを保管する物。
・メソッドは、クラスが出来る行動。
・オブジェクトの中にあるとメソッド、単体だと関数(ファンクション)。
・オブジェクトの中にあるとプロパティ、単体だと変数。
・エラー出さない為に今はpublicをつける(privateが主?)。
・クラスのコピーをとってインスタンスを作る。
・右辺のnew~を、インスタンス化という。

// 例 クラス名Aを定義し、インスタンスを作る。
<?php
  class クラス名A {
  	// プロパティ
    public $プロパティ名A;
    public $プロパティ名B;
    // メソッド
    public function メソッド名() {
      処理;
    }
  }
?>

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>クラスを定義する</title>
</head>
<body>
<pre>
<?php
	// クラス名Aのインスタンスを作る
  $インスタンス名 = new クラス名A();

	// プロパティの値を設定
  $インスタンス名->プロパティA = "●●";
  $インスタンス名->プロパティB = 数字;

	// インスタンスを確認
  print_r($インスタンス名);


	// メソッドを実行
  $インスタンス名->メソッド名();
?>
</pre>
</body>
</html>

・インスタンスを作る時はnewをつける。
・->はインスタンスの設定の時だけ使う。
・プロパティの初期値の値に計算式は設定不可。

インスタンス自身を指し示す($this)

$this->プロパティ名

VScodeの補足

alt+上下矢印 行ごと移動
ctrl+c 行ごとコピー
ctrl+v 行ごと切取り
home 行の先頭
end 行の終わり

コンストラクタ

インスタンス作成時(newする時)に自動敵に呼ばれる関数。

function __construct(引数1, 引数2,…){
	インスタンス作成時に最初に実行したい処理
}

クラス定義ファイルの読込

// <!DOCTYPE html>の上に下記を記入
// 下記は同階層の場合
<?php
  require_once "クラス定義ファイル名.php";
?>

・ファイルの読込は、インスタンス作成前に読込必要。
・外部ファイル側の閉じタグは無くてOK。
・クラス定義ファイルは、出来れば別ファイルにする。

スタティックプロパティ(メソッド)

newしなくても使える静的プロパティ(メソッド)。

class クラス名{
	public static const 定数名 = 値;
	public static $変数名;
	
	public static function メソッド名(){
	}
}

送信フォーム(POSTメソッド)

// 例)単価と個数を指定しボタンを押すと結果ページが開く
// 前後のhtmlタグ等を省略(body内)
<!--
  methodをPOSTにするとデータ送信メソッドはPOSTに。
  POST送信はサーバーへのリクエストに追加され送られるのでURLに追加されない
 --><form method="post" action="calc.php">
  <ul>
    <!-- フォームの各要素に設定されたname属性の値で連想配列のキー名がつき、データが送られる -->
    <li><label>単価:<input type="number" name="tanka"></label></li>
    <li><label>個数:<input type="number" name="kosu"></label></li>
    <li><input type="submit" value="計算する"></li>
  </ul>
</form>

// calc.php側
<?php
  // POST送信されてきたデータは
  // スーパーグローバル変数の$_POSTに連想配列として格納
  // 連想配列のキーはフォーム要素のname属性の値
  echo "<pre>";
  print_r($_POST);
  echo "</pre><hr>";

  // フォーム入力の値を得る(単価と個数)
  // $_POSTのキー名はフォームの各要素name属性の値
  $tanka = $_POST["tanka"];
  $kosu = $_POST["kosu"];
  // 計算する
  $price = $tanka * $kosu;
  // 表示する(3桁位取り)
  $tanka = number_format($tanka);
  $price = number_format($price);
  echo "単価{$tanka}円 × {$kosu}個 は {$price}円です。"
?>

getメソッド

// 例)指定された番号の有無を調べる
// フォームを表示する側のphpより抜粋
<form  method="GET" action="checkNo.php">
  <ul>
    <li><label>番号:<input type="number" name="no"></label></li>
    <li><input type="submit" value="調べる"></li>
  </ul>
</form>

// getメソッドを処理する側のphpより抜粋
<pre>
<?php
  require_once "lib/util.php";
  $myCode  = "<h2>テスト1</h2>";
  $myArray = ["a" => "<p>赤</p>", "b" => "<script>alert('hello')</script>"];
  echo '$myCodeの値:', es($myCode);
  echo "\n\n";
  echo '$myArrayの値:';
  print_r(es($myArray));
?>
</pre>

再起呼び出し

関数Aを実行中に関数Aを呼び出す手法。

METHOD(マジック定数)

現在実行中のメソッド自身を指す特殊な定数。

XSS(クロスサイトスクリプティング)

GETリクエストのURLを改ざんしてブラウザで攻撃する手法。

htmlspecialchars(値, ENT_QUOTES, 'UTF-8’);

XSS対策の関数。
・ユーザから受けた値をブラウザ表示前に不正な文字をHTMLエスケープする。

if文の一般的な書式で書いた時

<?php if(条件式){ ?>
	true時のコード
<?php } else { ?>
	false時のコード
<?php }?>	

isset関数

引数(変数)の値をチェックする関数。
値有り、かつNULLでは無い…true
それ以外…false

ctype_digit関数

整数かどうかチェック関数。

preg_match(パターン, 文字列);

パターンと文字列がマッチしてるか。

isSet(値);

値があるか。

in_array(値,配列);

配列の中に値が有るか。

is_array(配列);

配列かどうか。

strip_tags(文字列);

HTMLやPHPタグをを取り除く。

mb_substr(文字列, 開始位置, 文字数);

文字列の開始位置から指定の文字数を取得する。

mb_strlen(文字列);

文字列の長さを取得する。

nl2br(文字列,bool値);

文字列の中の改行コードの前に<br>タグを挿入。
・エヌエル2br(ニューライントゥービーアール)。
・bool値は、XHTML準拠の改行を使うか否か。
・trueなら<br />を入れる。
・falseなら<br>を入れる。

DBMS

データベースマネージメントシステム。

・MySQL、Oracle、SQLite、postgre等

UNSIGNED(属性)

正負の桁をやめる設定。
・プラスの値しか必要ない時(IDや年齢)。

AUTO INCREMENT

値が自動的にカウントアップ。

サーバー

サービスを提供する。
・webサーバーやDBサーバー、メールサーバー(POP3等)がある。

PDO(PHP Data Objects)

抽象化レイヤ。
・webサーバーと各種DBサーバー(DBMS)間のプログラムの違いを対応してくれる機能。

try~catch(例外処理)

try{
	例外処理が組み込まれているメソッドを実行
} catch(Exception $e){
	エラー処理
} finally {
	エラーの有無に関わらず実行する処理
}

bindValue(プレースホルダ, 値, 値の型)

プレースホルダに値をバインドする。
・プレースホルダ・・・仮確保した場所
・バインド・・・関連付ける

header関数

// 例 ●●.htmlへ遷移
header('Location:●●.html');

・echoなどの出力前にコードを書く

empty関数

// 例 変数●が空ならtrue
empty($●);

・empty=空

SQLインジェクション対策

フォームからの攻撃防止策。

・プリペアドステートメント(SQL文を変数っぽく準備)
・プレースホルダ(後から値を入れる為の状態)
・バインド(プレースホルダに値を関連づけ)

トランザクション処理

複数のデータ処理時に1つでも処理が失敗したら元の状態に戻す仕組み。

// トランザクション開始
beginTransaction()

// 完了
commit()

// 元に戻す
rollBack()

セッション

WEBページを移動すると変数の値は使用不可になるが、セッション機能を使うと複数のWEBページでセッション変数が利用出来るようになる。

1.ブラウザからWEBサーバーにログインした時にセッションファイルが作成される。
2.セッションファイルにはセッションIDなどがテキストファイルで保存されている。
3.その情報(セッションID等)をブラウザ側で同意を得た上でcookieに保存する。
4.次にアクセスした際にそのセッションID(貸金庫の鍵みたいなもん)でアクセスする。

<?php

// セッションの開始
// これより前にHTMLコードは書いたらダメ
session_start();

?>

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
    <?php
     // セッション変数(スーパーグローバル変数)
		 $_SESSION["変数名"] = "値";

PHP

Posted by ippei