2022/06/17

個人的によく忘れるPHPの記述についての備忘録です。
 
INDEX
1.三項演算子について
三項演算子とは、一つの演算子処理で3つの式を使用するための比較処理です。
### 書式
(条件) ? (真式) : (偽式);
### 実例
# $last_name(名字)があればフルネームで、なければ$first_name(名前)を代入
$last_name ? $name = $last_name." ".$first_name : $name = $first_name;
2.変数 命名規則
以下は個人的なルールです。
・「クラス名」「コントローラ名」「モデル名」→ パスカルケース
・「プロパティ名(メンバ変数)」→ キャメルケース
この辺りは好みだと思いますが、事前にルールを作っておくと統一感ができて綺麗なコードになると思います。
ちなみにCSSのクラス名はケバブケースがよく用いられます。
# スネークケースの例
# → 単語の間をアンダーバーでつなぐ命名規則
$the_pencil
$a_lot_of_pencils
# キャメルケースの例
# → 複合語をひと綴りで表現し、次の単語の始まりを大文字で表す
$thePencil
$aLotOfPencils
# パスカルケースの例
# → キャメルケースと似ているが、最初の単語も大文字で表す
$ThePencil
$AlotOfPencils
# ケバブケース
# 単語の間をハイフンでつなぐ命名規則
.the-pencil
.a-lot-of-pencils
3.例外処理
### 書式
try{
  // 例外が発生する可能性のあるコード
}catch(Exception $e){  
  // 例外が発生した場合に行う処理  
}
例外(Exception)が発生する可能性のあるコードには、「例外発生とする条件」や「例外を投げるコード」 が入ります。
「例外発生とする条件」は if文 が主に使われます。
「例外を投げるコード」は throw new Exeption() を使います。
※例外が発生することを、例外が投げられる(throwされる)といいます。
### 実例
# 1) 関数を定義
# arg → argument(引数という意味)
function func($arg){
  try{
      // $argが0だったら例外を投げる
      if($arg==0){
        throw new Exception();
      }
      // $argの値を表示
      echo "arg=".$arg;
  }catch(Exception $e){
    echo "例外をキャッチ";
  }
}
# 2) 関数を呼び出す
func(10); // 出力結果:arg=10
func(0);  // 出力結果:例外をキャッチ
例外メッセージ
例外には例外メッセージを持たせることができます。
### 構文
throw new Exception(例外メッセージ);
###実例
try{
  // 文字列 exception!! を投げる
  throw new Exception('exception!!');
} catch(Exception $e){
  // getMessage で例外メッセージを取得
  echo $e->getMessage();
}
# 実行結果
exception!!
例外処理については以前にもエントリーしたことがあるので、詳しくは以下をご参照ください。
4.見出しコメントの書き方
PHPでファイル全体の説明やクラス・メソッドの説明をする際は、PHPDocという記法を使って記述します。
ファイルの説明
/**
* 1行で処理の内容を記述
*
* 1行空けてもう少し詳しく記述することができる
* 複数行記述ができて、不要なら省略もできる
*
* @author 名前 <メールアドレス>
*  
*/
** は必ず二つなので気をつけてください。終了の
* はひとつで十分です。
クラス・メソッドの説明
/**
* 1行で処理の内容を記述
*
* @param int $example    第一引数の説明文をここに入れます。
* @param string $example2 第二引数の説明
*/
ブロックごとの処理
/*
|-----------------------------------------
|     入力処理
|-----------------------------------------
*/
if ($passwd == $_POST['passwd']) { 
:
# ----------------------------------------
#     入力処理
# ----------------------------------------
if ($passwd == $_POST['passwd']) { 
:
/*---------------------------------------
 *    入力処理
 *---------------------------------------*/
if ($passwd == $_POST['passwd']) { 
:
//----------------------------------------//
//    入力処理                            
//----------------------------------------//
if ($passwd == $_POST['passwd']) { 
:
//****************************************//
//    入力処理                            
//****************************************//
if ($passwd == $_POST['passwd']) { 
:
5.データ型
PHPは、型の宣言が必要ないプログラムと呼ばれたりもします。
型とは、変数の中に代入する値の種類を表します。
| データ型 | 内容 | 
|---|---|
| string | 「りんご」「ばなな」などの文字列です。 | 
| int(integer) | 1や100などの整数型。 | 
| float | 浮動小数点です。(※大抵のプログラミング言語では、小数は浮動小数点として扱われる) | 
| bool | true か false のどちらかです。(論理型) | 
| array | 配列型 | 
| object | オブジェクト型 | 
| void | 返り値の型が void である場合、返り値に意味がないことを表します。 | 
データ型判別関数
PHPにはデータ型を判別する関数が用意されてあります。
型がマッチすると論理値「TRUE」を返し、そうでない場合は「FALSE」を返します。
| 関数 | 内容 | 
|---|---|
| is_string() | 文字列型かどうかを調べる | 
| is_int() | 整数型かどうかを調べる | 
| is_float() | 浮動小数点型かどうかを調べる | 
| is_object() | オブジェクト型かどうかを調べる | 
| is_array() | 配列型かどうかを調べる | 
| is_resource() | リソース型かどうか調べる | 
| is_null() | NULL型かどうか調べる | 
6.アクセス修飾子
アクセス修飾子とはプロパティやメソッドに「どこからアクセスできるか?」を指定するものです。
指定には「public」「private」「protected」の3つのどれかを指定します。
### 実例
class AdminAuthController extends Controller
{
  # クラス内、クラス外のどこからでもアクセス可能
  public $userName = 'email';
  # 同じクラス内からのみアクセス可能
  private $userName = 'email';
  # 同じクラス、および子クラスからアクセス可能
  protected $userName = 'email';
}
7.エラー制御演算子
PHPでの @(アットマーク)はエラー制御演算子と言います。
関数や変数の前につけます。これを付けた関数や変数ではエラーを出力しないようにします。
### 実例
## 「input.txt」が存在しない場合、Warningが表示される
file_get_contents("input.txt");
# 表示画面には以下のようにエラーが表示される
PHP Warning: file_get_contents(input.txt): failed to open stream: No such file or directory in …略….php on line 2
## 「input.txt」が存在しなくてもエラーメッセージは表示されない
@file_get_contents("input.txt");
8.エラー関係
エラーは大まかに3種類あります。
| 出力エラー | 内容 | 対処 | 
|---|---|---|
| syntax error(シンタックス・パースエラー) | コンパイルが出来ない(実行前で止まる) | 文法の間違いなどでコンパイル出来ないなど | 
| fatal error(フェイタルエラー) | 実行が停止するもの | 定義していない関数を呼び出そうとした場合など | 
| warning(警告)、notice(注意) | 実行は継続されるが警告の出るもの | 初期化してない変数をいきなり使ったりなど | 
E_PARSE > E_ERROR > E_WARNING > E_NOTICE > E_DEPRECATED
(※E_DEPRICATEDはコーディング規約に関しての問題や将来廃止になる(非推奨)機能が使われている場合に発生)
9.擬似変数
クラス内でメンバ変数が定義されている場合、疑似変数 $this を使用することで、クラスの変数にアクセスすることができます。
class SampleClass{
 // プロパティ
 public $val = 'Laravel';
 // メソッドの宣言
 public function SampleMethid(){
   // メソッドのローカル変数
   $val = 'CakePHP';
   // 擬似変数を出力
   echo $this->val;
 }
}
// インスタンスの生成
$class = new SampleClass();
// メソッドの呼び出し
// 出力結果:Laravel
$class->SampleMehod();
サンプルでは SampleClass のプロパティ(Laravel)とメソッドのローカル変数(CakePHP)で、同じ変数名($val)を定義しています。
たとえクラスとメソッドで同じ変数が定義されていても、thisを使用すればクラスのプロパティを参照することができます。
10.配列の取り出し方
PHPの配列に関しては別ページでもまとめています。
$array は配列$value は $array に入っている要素$key は配列の番号
#-------------------------
# 一次元配列
#-------------------------
foreach($array as $value){
  実行処理文
}
# 例
$fruit=array("りんご","オレンジ","ぶどう")
foreach($fruit as $value){
  echo $value."
";
}
# 出力結果
りんご
オレンジ
ぶどう
#------------------------
# 連想配列
#------------------------
foreach($array as $key => $value){
  実行処理文
}
# 例
$fruit=array("apple"=>"りんご","orange"=>"オレンジ","grape"=>"ぶどう");
foreach($fruit as $key => $value){
  echo $value."は英語で書くと".$key."です
";
}
# 出力結果
りんごは英語で書くとappleです
オレンジは英語で書くとorangeです
ぶどうは英語で書くとgrapeです
・break は繰り返しを中断する
・continue は繰り返しの途中でスキップする
11.比較演算子
比較演算子は左辺オペランドと右辺オペランドを比較します。
比較の結果が真なら 論理値 の「true」を返します。
そうでない場合は論理値の「false」を返します。
PHP で使用する比較演算子は次の通りです。
演算の対象となる値や変数や式のこと。
オペランドには数値や文字列の両方が使用できます。
また他のさまざまな型を比較できます。
| 演算子 | 解説 | 
|---|---|
| $left == $right | $left と $right が等しい時に true | 
| $left != $right | $left と $right が等しく無い時に true | 
| $left > $right | $left が $right より大きい時に true | 
| $left < $right | $left が $right より小さい時に true | 
| $left >= $right | $left と $right が小さいか等しい時に true | 
| $left <= $right | $left と $right より小さいか等しい時に true | 
| $left === $right | $left と $right が等しく、かつ同じデータ型の場合に true | 
12.論理算子
複数の比較演算子の結果を組み合わせて評価する場合に使用されます。
そのため、論理演算子の $left や $right には比較演算子の結果などが入ります。
そして左辺と右辺の比較演算子の結果を組み合わせた結果として真(true)か偽(false)の値を取ります。
| 演算子 | 解説 | 別名 | 
|---|---|---|
| $left && $right(論理積) | $left と $right が共にtrue の場合に true | and | 
| $left || $right(論理和) | $left か $right のどちらかがtrue の場合に true | or | 
| !$right(論理否定) | $left が trueで無い場合に true | not | 
if($num > 10 && $num < 20){
  echo '10よりも大きく20より小さい値です。';
}
// 上と同じ意味
if($num > 10 and $num < 20){
  echo '10よりも大きく20より小さい値です。';
}
// 「aまたはb」が true かつ「cまたはd」が true
(a || b) && (c || d)
13.条件に応じて処理を分ける(switch)
$str = "apple";
switch($str){
  case "apple": //strが「apple」のときに実行
    print "リンゴ";
    break; //switch文から抜ける
  case "banana":
    print "バナナ";
    break;
  default:
    print "翻訳できませんでした。";
}
・単純な2分岐であれば、if文を使う
・多分岐(3分岐)以上であればswitch文を使う
14.PHP 設定に関する情報(phpinfo)
phpinfo() 関数を使うタイミングは
- PHP が作動していているかの確認したいとき
- PHP のバージョンを確認したいとき
- php.ini ファイルを探したいとき
- php.ini に設定されている内容を変更したとき
などがあり、主に PHP の設定情報を調べたり、確認したりという作業になります。
<?php
phpinfo();
?>
問題がなければ以下のように表示されます。
15.PHPに割り当てられているメモリ使用量を確認
現在、PHPに割り当てられているメモリ使用量を確認。
※SSHでサーバにアクセスして、Linuxコマンドで以下を実行します。
# メモリ使用量
$ php -i | grep memory_limit
16.PHPの設定ファイルを変更したい(php.ini)
PHP の設定ファイルは php.ini を変更します。
php.ini は以下のコマンドで調べることができます。
# php.iniのパス確認
$ php -i | grep php.ini
実演

/etc/php.ini にあるとは限らないので注意!
17.文字数制限し、超過分を『…』に置き換えるコード
記事タイトルや抜粋など、文字数は未確定だけど長くなりすぎると困るような文字列をさばく際に便利なコードです。
# 整形したい文字列
$text = "吾輩は猫である。名前はまだ無い。どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。";
# 文字数の上限
$limit = 32;
# 文字列が32文字以上の場合に、33文字目以降を…に置き換える
if(mb_strlen($text) > $limit) {
    $title = mb_substr($text,0,$limit);
    echo $title.'・・・';
} else {
    echo $text;
}
実行結果
18.日付計算
現在日時との差分を計算するコードです。
考え方としては、まずは比較対象となる日付を strtotime()関数 でUnixタイムスタンプに変換します。
それを time()関数 で現在時刻のUnixタイムスタンプから引きます。
コンピュータのシステム時刻の一種で、協定世界時(UTC)での1970年1月1日(午前0時0分0秒)からの経過時間を指します。
/*---------------------
 現在時刻から差分(日数)
---------------------*/
$time1 = strtotime("2022-04-21"); //strtotime()はUnixタイムスタンプを返す組み込み関数
$time2 = time(); //現在時刻
$diff_time = ($time2-$time1) / (60 * 60 * 24); //(日数)
/*---------------------
 現在時刻から加算
---------------------*/
$add_1day = strtotime("+1 day");
$add_1month = strtotime("+1 month");
$add_1year = strtotime("+1 year");
// 引数に変数も可
$add_xmonth = strtotime("+".$number."month");
19.PDO の利用(データベース接続)
PHPでデータベースを操作する場合は、まずPDOオブジェクトを生成します。
この時はコンストラクタでデータベース情報を設定しておきます。
後は、そのPDOオブジェクトのメソッドでデータベースを操作するだけです。
下記の例では、$dbh という変数で PDO オブジェクトを管理しています。
if($_SERVER["HTTP_HOST"]=='12.34.567.89'){
    // 開発サーバ環境
    define('DSN','mysql:host=127.0.0.1;dbname=product_db');
    define('DB_USER','laravel_user');
    define('DB_PASSWORD','laravel_pass');
}else{
    // ローカル環境(Docker)
    define('DSN','mysql:host=laravel_db;dbname=develop_db');
    define('DB_USER','laravel_user');
    define('DB_PASSWORD','laravel_pass');
}
// E_NOTICE 以外の全てのエラーを表示する
error_reporting(E_ALL & ~E_NOTICE);
/*-------------------------------------------------
 *  ファンクション管理ファイル
 ------------------------------------------------*/
function connectDb(){
    try {
        return new PDO(DSN, DB_USER, DB_PASSWORD);
    }catch(PDOException $e){
        echo $e->getMessage();
        exit;
    }
}
mb_language("uni");
mb_internal_encoding("utf-8"); //内部文字コードを変更
mb_http_input("auto");
mb_http_output("utf-8");
$dbh = connectDb();
/*-------------------------------------------------
 *  ここからデータベースを操作
 ------------------------------------------------*/
//---- PDOでSQL文を実行する ----
$sth = $dbh->prepare("SELECT * FROM users"); //prepareはSQL文の準備をするメソッド
$sth->execute(); //実行するにはexcuteメソッドを使う
//---- データを出力する ----
while($row=$sth->fetch(PDO::FETCH_ASSOC)){ //結果を配列で取得
  print($result['id']);
  print($result['name']);
}
20.isset, empty, is_null の違い
| 値 | if($var) | isset | empty | is_null | 
|---|---|---|---|---|
| $var=1 | true | true | false | false | 
| $var=""; | false | true | true | false | 
| $var="0"; | false | true | true | false | 
| $var=0; | false | true | true | false | 
| $var=NULL; | false | false | true | true | 
| $var | false | false | true | true | 
| $var=array() | false | true | true | false | 
| $var=array(1) | true | true | false | false | 
 
以上です。

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。



