php勉強ブログ

基礎文法

phpの関数

更新日:2022-05-18

phpの関数の基本的な構文は以下です。

function name(arg1,arg2,...){
    //何らかの処理
    return val;
}

関数は通常、値を1つだけ返します。 複数の値を返したい場合は、配列の形で返します。

return array(val1,val2,...);

戻り値をreturnで指定しなかった場合、NULLを返します。 また、関数名に大文字・小文字の区別はありません。

関数における変数のスコープ

関数内で定義した変数は、関数の外からはアクセスできません。 また、基本的に関数の中から関数の外で定義した変数にもアクセスできません。 関数の中から関数の外の変数にアクセスしたい場合は、globalキーワードを使います。

$exval=5;

function add($num){
    global $exval;
    var_dump($exval+$num);
}

add(3);
//8

通常、関数の中で宣言した変数(ローカル変数)は、関数が終了すると値が破棄されます。 関数の終了後も値を保持したい場合は、staticキーワードを使います。

関数の終了と共に値が破棄される例

function subtract(){
    $val=10;
    return $val--; 
}

for($i=0;$i<10;$i++){
    var_dump(subtract());
}
//10 10 10 10 10 10 10 10 10 10

関数の終了後も値が保持される例

function subtract(){
    static $val=10;
    return $val--; 
}

for($i=0;$i<10;$i++){
    var_dump(subtract());
}
//10 9 8 7 6 5 4 3 2 1

はじめに

更新日:2022-05-21

このブログでは、webデザイナーである著者がphpについて学んだことを、個人の備忘録として書いていきます。 勉強中の身ですので、記載の内容に間違い等を発見された方はコメント欄よりご指摘いただければ幸いです。

ちなみに、このブログ自体、WordPressなどのCMSを使わずphpでフルスクラッチして作成しています。 phpでのブログのフルスクラッチ開発についても、このブログ上でおいおい書いていければと考えています。

なお、本ブログに記載のコード及び内容に基づく運用結果については、 いかなる場合でも本ブログの著者は責任を負いかねます。あらかじめご了承ください。

phpの文字列

更新日:2022-05-21

phpの文字列の表現方法は3つあります。

シングルクオートで囲む
$string='Hello,world.';

シングルクオートで囲った文字列の中では、 '\''はシングルクオートに、'\'はバックスラッシュに変換されます。

ダブルクオートで囲む
$string="Hello,world.";

ダブルクオートで囲まれた文字列の中では、 '\n'(改行)などのエスケープシーケンスが使えます。

ヒアドキュメントを使う

複数行にまたがる文字列を扱うときに使います。

$string = <<< EndOfQuote
            Lorem ipsum dolor sit amet, 
            consectetur adipiscing elit, 
            sed eiusmod tempor incididunt 
            ut labore et dolore magna aliqua.
            EndOfQuote;

文字列を表示する方法

文字列をブラウザに表示する方法は、以下の6つです。 このうち、print_r()とvar_dump()は主にデバッグ時に使います。

echo

echoは関数ではなく言語構造なので、()が不要です。 ただし、式の一部として使うことができません。

print()
print('Hello,world.');

print()は1つの値をブラウザに送信します。 複数の引数を取ることはできません。

printf()
printf('%s','Hello,world.');

printf()は書式文字列を指定された値で置き換えた文字列を出力します。 C言語のprintf()と同じような使い方をします。

sprintf()
$string=sprintf('%s','Hello,world.');

sprintf()はprintf()の出力内容を文字列として返します。

print_r()
$charactor=array('Harry','Ron','Hermione');
print_r($charactor);
var_dump()

var_dump()はprint_r()が出力するデータ型以外に、bool値やNULLも表示できます。

文字列を操作する組み込み関数

その他、phpで文字列を操作する組み込み関数には、以下のようなものがあります。

関数 定義
strlen()文字列の長さを返す
mb_strlen()日本語を含むマルチバイト文字の文字列の長さを返す
trim(文字列,除去する文字)文字列の先頭と末尾の空白を除去
ltrim(文字列,除去する文字)文字列の先頭の空白を除去
rtrim(文字列,除去する文字)文字列の末尾の空白を除去
strtolower()文字列全体を小文字に
strtoupper()文字列全体を大文字に
ucfirst()文字列の文頭の文字だけを大文字に
ucword()単語の先頭を大文字に

エンコード

ユーザーがフォームから入力した値を安全にデータベースに格納する際などに必要なのがエンコード作業です。 <&などの特殊文字をHTMLエンティティに変換する(エンコードする)際は、htmlentities()を使います。

htmlentities(文字列,quote_style,charset);

quote_styleには、以下の3つが指定できます。

引数 意味
ENT_COMPACTダブルクオートのみ変換(デフォルト)
ENT_QUOTESシングルクオートとダブルクオートの両方を変換
ENT_NOQUOTESシングルクオートとダブルクオートのどちらも変換しない

htmlspecialchars()は、&,"",'',<,>の文字をそれぞれエンティティに変換します。

htmlspecialchars(文字列,quote_style,charset);

その他、HTMLタグに関わる関数は、以下があります。

関数 定義 
strip_tags()文字列からHTMLタグを削除
get_meta_tags()HTMLのmetaタグの情報を取得

phpの演算子

更新日:2022-05-21

算術演算子

phpの四則演算は、以下の演算子で行います。

演算子 定義 
+加算
-減算
*乗算
/除算
%剰余

値を1つずつ増やす(インクリメント)は++、1つずつ減らす(デクリメント)は--で行います。

インクリメント

for($i=0;$i<=10;$i++){
    var_dump($i);
}

デクリメント

for($j=10;$j>0;$j--){
    var_dump($j);
}

代入演算子

演算結果を左の変数に代入する演算子が以下になります。

名前 演算子意味 
加算代入演算子+=左 + 右
減算代入演算子-=左 - 右
乗算代入演算子*=左 × 右
除算代入演算子/=左 ÷ 右
剰余代入演算子%=左 % 右
連結代入演算子.=左 . 右

文字列連結演算子 .

phpで文字列を連結する場合は、文字列連結演算子 . を使います。

$lastName='なかやま';
$firstName='きんに君';
var_dump($lastName.$firstName);
var_dump('なかやま'.'きんに君');
//なかやまきんに君

比較演算子

値の比較は、以下の演算子で行います。

演算子意味 
==値が等しい
===値とデータ型が等しい
!=,<>値が異なる
!===値もしくはデータ型が異なる
>より大きい
>=以上
<より小さい
<=以下

論理演算子

論理演算は、以下の演算子で行います。

演算子 意味 
&かつ(論理積)
||または(論理和)
!でなければ(論理否定)

三項演算子 ? :

三項演算子は、?の前にある式がtrueの場合は?と:の間にある値を返し、 falseの場合は:の後ろの値を返します。 書き方は以下です。

$a ? $b : $c;
//$aが真なら$bを、偽なら$cを返す

例えば以下のような使い方をします。

$Harry=true;
var_dump($Harry ? 'Gryffindor!' : 'Slytherin!');

型演算子 instanceof

instanceof演算子は、ある変数が特定のクラスのインスタンスであるかどうかを調べる演算子です。

class fruits{};
$apple=new fruits;

if($apple instanceof fruits){
    var_dump($apple.' is fruits.');
}else{
    var_dump($apple.' is not fruits.');
}

phpの変数・データ型

更新日:2022-05-21

変数

phpの変数は、先頭に$をつけて宣言します。

$num=3;//整数
$fnum=0.333;//浮動小数点
$string='Hello,world';//文字列
$isPhoneNumber=true;//真偽値
$Gryffindor=array('Harry','Ron','Hermione');//配列
$db=new PDO;//オブジェクト
$empty=NULL;//NULL値

変数のスコープは、その変数が宣言された場所によって変わります。

関数の中で宣言された変数は、原則その関数の中でしか使えず、関数が終了したら値は破棄されます。 (このような変数を「ローカル変数」といいます。)

関数の外で宣言された変数は、プログラムのどこからでも参照できます。 (このような変数を「グローバル変数」といいます。) グローバル変数へは、通常関数の中からアクセスすることはできません。 関数の中からグローバル変数へアクセスしたい場合は、 その関数内で global キーワードを使って アクセスしたい変数を宣言する必要があります。

関数内で宣言した変数の値を、関数の終了後も保持したい場合は、static キーワードを使って宣言します。 

ある変数に値が設定されているかどうかを調べるには、isset()関数を使います。

$name=`Harry PotterI;
$house;
var_dump(isset($name));//true 値が設定されている
var_dump(isset($house));//false 値が設定されていない

isset()関数は、フォームに値が入力されてPOSTされてきたかどうかを判定する場合などに使います。

変数に設定された値を破棄する場合は、unset()関数を使います。

$house='Slytherin';
unset($house);
var_dump($house);//NULL 値が破棄された

定数

phpで定数を宣言する場合は、defineを使います。 定数は一度宣言すると、値を変更することができません。

//define('定数名','値');
define('PI',"3.141592653589");

phpのデータ型

phpで扱えるデータ型は、以下の通りです。

データ型 例 判定する関数 
整数3,10,50000などis_int(),is_integer()
浮動小数点1.4142,0.5などis_float(),is_real()
文字列'Hello,world.' などis_string()
論理値true,falseis_bool()
配列(1,2,3,4,5),('Harry','Ron','Hermione')などis_array()
オブジェクト$db=new PDOなどis_object()
リソース型外部のデータベースなどとやりとりするデータを格納is_resource()
NULL何も値が設定されていない状態is_null()

データ型を変換する(キャストする)場合は、変数の前に(変換したい型)をつけます。

$PI=3.1415926;
var_dump(is_float($PI));//true
$strPI=(string)$PI;
var_dump(is_string($strPI));//true
//浮動小数点型だった$PIの値が文字列型に変換された

phpに外部のファイルを読み込む方法

更新日:2022-05-22

webサイトを制作していて、グローバルナビやフッターなど、全ページに共通する部分を 一つのファイルにまとめてページごとに読み込む、といった場面が多々あります。 共通する箇所を一つのファイルにまとめることで、更新の際に一つのファイルを修正するだけで 他のページが自動的に更新されるので、効率的にサイトを更新できるようになります。

phpファイルに外部のファイルを読み込むには、2つの方法があります。 違いは「読み込もうとしたファイルがなかった場合の挙動」です。

require

ファイルが見つからなかった場合、エラーを出してそこでプログラムを終了する

include

ファイルが見つからなくても、エラーを出してそれ以降のプログラムを継続

requireとincludeの先頭にエラー抑制演算子@をつけることで、 ファイルが見つからないなどのエラーが発生した場合でも、 クライアント側にエラーのアラートを出さないようにすることができます。

@require('header.php');
@include('header.php');

グローバルナビなどサイトの共通部分を外部ファイルから読み込む場合、 仮に読み込むファイルにエラーがあってもサイト自体の表示はできるように、 @include を使ってファイルを読み込んでおくと安全です。

また、ループの中でrequireやincludeを使って同じファイルを何度も読み込む、 といった事態を避けるために、ファイルを1回だけ読み込む include_oncerequire_onceもあります。

phpの制御構文

更新日:2022-05-29

phpの制御構文には以下のものがあります。

構文内容
if文式の真偽値によって処理を振り分ける
switch文変数の値によって処理を振り分ける
while文式の値がtrueの間処理を繰り返す
do while文ループの最初の1回を必ず実施した後、式の値がtrueの間処理を繰り返す
for文指定した回数を繰り返して処理する
foreach文配列の各要素を順に処理する
try catch文エラーが起こった時の処理を指定する
exit文スクリプトの実行を終了する
return文関数などから値を返す

if文

if文の構文は以下です。

if(式){
    //式がtrueの場合の処理
}else{
    //式がfalseの場合の処理
}

または、以下のような書き方も可能です。

if(式):
    //式がtrueの場合の処理
else:
    //式がfalseの場合の処理
endif;

if文は式の真偽値によって処理を振り分けます。 式が複数ある場合は、elseif(式2)で繋げます。

if(式1){
    //式1がtrueの場合の処理
}elseif(式2){
    //式2がtrueの場合の処理
}else{
    //式1も式2もfalseの場合の処理
}

switch文

switch文は変数の値に応じて処理を振り分けます。 switch文の構文は以下です。

switch(変数){
    case '値1':
        //変数の値が値1の場合の処理
        break;
    case '値2':
        //変数の値が値2の場合の処理
        break;
    case '値3':
        //変数の値が値3の場合の処理
        break;
}

または、以下のような書き方も可能です。

switch(変数):
    case '値1':
       //変数の値が値1の場合の処理
        break;
     case '値2':
        //変数の値が値2の場合の処理
        break;
    case '値3':
        //変数の値が値3の場合の処理
        break;
endswitch;

while文

while文は式の値がtrueの間処理を繰り返します。 構文は以下です。

while(式){
    //処理
}

または、以下のような書き方も可能です。

while(式):
    //処理
endwhile;

ある条件になったらループを抜け出したい場合は、breakを使います。

while($i<10){
    //処理
    if($i==5){
        break;
        //$iが5になったら処理をやめる
        //つまり$i=6以降はループしない
    }
}

多重にループしている場合、breakの後ろに数値を指定することで、 何段階ループを抜けるかを指定できます。

do while文

while文では、ループの1回目で式がfalseになった場合、そこで処理を中断しますが、 do while文は式の真偽がどうであれ、ループの1回目の処理は必ず実行します。

do while文の構文は以下です。

do{
    //処理
}while(式);

for文

for文は指定した回数処理を繰り返します。 for文の構文は以下になります。

for(初期値;終了条件;インクリメント){
    //処理
}

foreach文

foreach文は配列の各要素に対して順に処理を加えるときに使います。 構文は以下です。

foreach($array as $current){
    //配列$arrayの各要素
    //$array[1],$array[2]...を$currentに代入して
    //順番に処理
}

または、以下のようにも書けます。

foreach($array as $current):
    //処理
endforeach;

try catch文

try catch文は、エラーが起こった際の処理を指定することができます。 データベースに接続するプログラムなどで、データベースへの接続が 何らかの理由で失敗した場合に処理を中断する、といった場面で使います。

try{
    //データベースに接続
    //接続に成功した場合の処理を記述
    catch(エラーの条件文){
        //エラー時の処理
    }
}

exit文

exit文はスクリプトの実行を終了します。

return文

return文は関数などから値を返します。

正規表現の基本

更新日:2022-12-26

任意の文字列の中から、特定のパターンを持った文字列を検索したい時や、 与えられた文字列が、特定のパターンに適合するかを判定したい場合などは 正規表現を使います。 正規表現とは、特定の文字列をその文字列を構成する条件で表現したものです。

例えば、ある文章から、世紀を表す「00th Century」という文字列を全て検索したいとします。 「00th Century」という文字列を構成する条件を考えてみます。

  1. 先頭に1桁もしくは2桁の数字が来る
  2. 2文字目もしくは3文字目から「th」もしくは「nd」「rd」が続く(1stや2nd、3rdの場合を考慮する)
  3. 4文字目もしくは5文字目に空白文字が来る
  4. 5文字目もしくは6文字目にCenturyが来る

という感じで表現できそうです。 では、これを正規表現で表すと、

[0-9]?(st|nd|rd|th)\sCentury

となります。

正規表現一覧

おもな正規表現は下記になります。

特殊文字 意味例 マッチするもの
.任意の一文字c.t catやcutなどにマッチ
*直前の文字の0回以上の繰り返しw*wwやwwwなどにマッチ
[][]内の文字のいずれか1文字(文字クラス) -で範囲を指定、^で否定 [abc]aかbかc
^行頭 ^HelloHelloで始まる文字列
$行末 world.$world.で終わる文字列
\直後の文字を普通の文字として処理する\$5$5という文字列として扱う
|選択肢 st|nd|rd|thstまたはndまたはrdまたはth
?0回あるいは1回の繰り返し [0-9]?0から9の一桁の数字または00から99までの2桁の数字
+1回以上の繰り返し1+11や111、1111など
{n}n回の繰り返し 9{3}999
{n,m}最低n回、最高m回の繰り返し 9{3,5}999,9999,99999
{n,}n回以上の繰り返し 9{3,}9999,99999など

正規表現に関するphpの関数

preg_match()関数

preg_match()関数は引数を2つ取り、 第一引数で与えられたパターンが第二引数にマッチすれば1を、しなければ0を返します。 第一引数のパターンは"/ /"で囲みます。

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

「00th Century」がある文章の中に含まれるかを判定する場合は、

preg_macth("/[0-9]?(st|nd|rd|th)\sCentury/","20th Century Boy");
//1(マッチした)
preg_replace()関数

preg_replace()関数は、パターンにマッチした文字列をすべて指定の文字列に変換します。

preg_replace("/パターン/","文字列");
preg_replace("/<.*?>/","tag","<h1>Hello, World.</h1>");
//<h1>をtagに置き換える
preg_split()関数

preg_sprit()関数は、パターンにマッチした文字列のみを取り出し、配列として返します。

preg_split("/パターン","文字列");

例えば、文字列「at Spring In 2022.」という文字列から、数字だけを取り出したい場合は、以下のように書きます。

preg_split("/[0-9]*/","at Spring In 2022.");
//array('2','0','2','2')

phpの配列

更新日:2022-12-26

phpで扱える配列には、「インデックス配列」と「連想配列」の2種類があります。

インデックス配列

インデックス配列は、キーに「0,1,2,3,4...」のように0から始まる連番の整数を取る配列です。 インデックス配列の特定の要素にアクセスしたい場合は、[]内でインデックスを指定します。

//インデックス配列
$members = Array("Harry","Ron","Hermione");
echo $members[1];
//Ron

インデックス配列の末尾に新しい値を追加する場合は、[]を使います。

$members = Array("Harry","Ron","Hermione");
$members[] ="Draco";
echo $members[4];
//Draco

連想配列

連想配列は、キーと値の組み合わせでデータを格納している配列です。 インデックス配列とは違い、キーは文字列で表現されます。 =>記号を用いてキーと値のペアを指定します。

//連想配列
$members = Array(
    "Potter" => "Harry",
    "Weasley" => "Ron",
    "Granger" => "Hermione"
);
echo $members["Weasley"];
//Ron

配列の長さを求める関数 count() sizeof()

配列にいくつの要素が格納されているかを調べるには、count()関数とsizeof()関数を使います。 どちらの関数もインデックス配列・連想配列のどちらにも使えます。

//インデックス配列の長さを求める
$members = Array("Harry","Ron","Hermione");
echo count($members); //3
echo sizeof($members); //3
//連想配列の長さを求める
$members = Array(
    "Potter" => "Harry",
    "Weasley" => "Ron",
    "Granger" => "Hermione"
);
echo count($members); //3
echo sizeof($members); //3

配列の要素を順番に処理する

配列の各要素に対して、ある処理を一律に行うには、foreach文を使う方法と、for文を使う方法があります。 foreach文を使う方法は、インデックス配列・連想配列のどちらにも使えますが、 for文を使う方法はインデックス配列にしか使えません。

foreach文
//foreach文を使って配列の各要素を処理

//インデックス配列の場合
$members = Array("Harry","Ron","Hermione");
foreach($members as $value){
    echo $value;
}
//Harry, Ron, Hermione

//連想配列の場合
$members = Array(
    "Potter" => "Harry",
    "Weasley" => "Ron",
    "Granger" => "Hermione"
);
foreach($members as $value){
    echo $value;
}
//Harry, Ron, Hermione

また、連想配列の場合、 $key => $value のように書くことで、キーと値どちらにもアクセスすることが可能です。

foreach($members as $key => $value){
    echo "名前:{$value} 苗字:{$key}";
}
//名前:Harry 苗字:Potter
//名前:Ron 苗字:Weasley
//名前:Hermione 苗字:Granger
for文
//for文はインデックス配列にしか使えない
$members = Array("Harry","Ron","Hermione");
for($i = 0; $i < count($members); $i++){
    echo $members[$i];
}
//Harry, Ron, Hermione