🦔

php 基礎

2020/10/25に公開

以下の記述は自分の知識+先人たちの断片的な知見をまとめたもの。
あなたたちが共有してくれるから私がいます。ありがとう。

アクセス修飾子

  • public どこからでもアクセス可能
  • protect そのクラス自身と継承クラスからアクセス可能
  • private クラスの外からは触れないぞ

アクセス修飾子が必要な理由として保守の容易さに挙げられる。
チーム開発をしていて自分がクラスを作る際、
他人に使って良い機能だけ公開し、使ってほしくない機能は隠す。
このようなシステムを作るときコイツが役立つのだ。

use namespace

use: クラスなどのインポート
namespace: 名前の衝突(同名の関数など)を避けるために使用

!は否定(!!で否定の否定、!+n、否定+n)

if文でよく使われる。

= 代入演算子

左辺に右辺を代入するもの。厳密には("等しい")ではないと言うこと。
詳しくは公式へ:phpマニュアル

a==b
データ型は無視し、内容が等しいか(一致)
a===b
値と「データ型」まで含めた意味で等しい

?は三項演算子で使われる

条件式 ? 式1 : 式2

条件式を評価し、TRUEであれば式1、FALSEであれば式2を返す。
三項演算子は式であり、値としては評価されずに式の結果として評価されることに注意。積み重ねて使用することは避けるべし。

詳しくは公式へ:phpマニュアル

関数・変数・引数

  1. 関数:幾つかの処理をまとめて入れておくもの
    最初から用意されている「組み込み関数」と、自分で定義する「ユーザ定義関数」がある
  2. 変数:値を入れておく箱 表す記号は 「$」
    同じ数値・計算式をその都度同じデータを書き込むのは大変でしょ?
    そのときに箱に入れて使いまわせば楽になるから使われる。
  3. 引数:関数を呼び出すときに渡す値
    関数の処理は同じでも、一部分だけを変えて書き出したい時に使う。
function outputName($last_name, $first_name){
echo “私の名前は” . $last_name . $first_name . “です。<br>;
}
outputName(“鈴木”, ”太郎”);
// 実行結果は”私の名前は山田太郎です"

クラス

クラス=関数(処理:メソッド)+変数(データ:プロパティ)

class クラス名 {

    $プロパティ名 = "プロパティ";
    
    function メソッド名() {
        //処理
    }

オブジェクト

オブジェクトとはクラスを元にしてつくられたコピーのこと。
複数の処理でひとつのクラスにアクセスした場合、データの上書き(不整合)を引き起こす危険があるためコピークラスを作成しプログラムを組んでいく。

インスタンス

オブジェクトを生成することをインスタンス化という。

インスタンス作成
$変数名 = new クラス名([引数,,]);

オブジェクトは「$変数名」に格納され、以降はこの変数をオブジェクトとして扱う

アロー演算子 - >

オブジェクトのメソッドやプロパティにアクセスするための演算子で
左の中にある右のものを取り出しているだけ

よく見かけるヤツ
$date = new DateTime(); // インスタンス化
echo $date->format('Y-m-d H:i:s'); // formatメゾットを呼び出す

コンストラクタ

インスタンス化のときに自動的に呼び出されるメソッド。
オブジェクト作成時に初期化処理が必要な場合など、コンストラクタ内に記述しておけば自動的に実行。
クラスと同じ名前のメソッドがクラス(オブジェクト)内に存在する場合には優先して処理される。

プロパティ(メンバ変数)の初期化や、クラスで使用する各種リソースの初期化といった呼び出されて最初の一回だけ処理を必要とするものを記述するのが一般的。

https://www.php.net/manual/ja/language.oop5.decon.php

使用することで初期化処理の忘れがなくなるし、
オブジェクト作成時に1回だけ呼ばれるメソッドとして意図を明確にすることが出来きる。
(initメゾットを定義したりその忘れによるエラーを防げる)

$this

クラスのインスタンス自身(自クラス)のことを指すもの。
自身(class内)のプロパティやメソッドにアクセスするために使用。

staticメゾット

静的なメゾット。
インスタンス化されていなくても外部から直接呼び出すことができる。
$thisは使用せず、代わりにselfを使用。

ゲッター、セッター

クラスのプロパティにクラス外部から直接アクセスして直接値を書き換えるという行為は、基本的によくない。そこで、メソッドを用意しておいて、set(書き込み専用)のメソッドでプロパティを変更、getのメソッド(読み取り専用)でそれを返すようにする。setとgetで指定したメソッドは()を付けない。つまり見た目的にはプロパティにアクセスしているようにみえる。

クラス内のprivate変数にアクセスするためのメソッドのことをアクセサメソッドと言う。
プロパティを隠蔽して、アクセサメソッドを介して参照、設定することで、

  • 読み書きの制御が可能となる。
  • プロパティ値を設定する際に値の検証を行える
  • プロパティ値を参照する際に値の加工を行える
    などのメリットがある。

基本型

class Person{
    private $name;

    public function get_name($name){
        return $this->name;
    }

    public function set_name($name){
        $this->name = $name;
    }
}

参考:https://qiita.com/mikakane/items/00c798964f7c2c122e7d

継承

 class サブ(子)クラス名 extends スーパー(親)クラス名 {
        サブクラスの処理定義
}

(親)クラスの機能を引き継ぎつつ機能追加、変更などの新しい(子)クラスをつくる時に使用

オーバーライド
引き継いだクラスのメンバやメゾットを一部編集したい時に行われる
大規模になる程似た機能を持つクラスに必要になるからそう言う場面で使われる

配列 Array()または []

配列とは「複数のデータを格納したタンス」といったイメージで
複数の関連するデータをひとまとめにするための仕組み。

一つの変数に一つの値を代入することが多いけど、データによっては複数の関連するデータをまとめたい時があるがあるよね。
友達の数だけ変数を作るのは大変でしょう?そこで配列です。

配列のインデックス(番号)を指定することで、番号(x段目)にある値を取り出すことができる
⚠️「0」で1段目のデータにアクセス可能

$配列= array("要素A","要素B","要素C")
$追加したい配列の変数[] = 追加する値	

参考&具体例
公式:phpマニュアル
余談:array関数と[]どっちが速い?
**「=>」は配列に値を代入するための演算子 **
値の紐付けに使う。右から左へ値を紐付けている。

連想配列 多次元配列

要素に名前をつけ(key)、そのkeyでアクセスする配列のことを連想配列という。

連想配列
$fruits_color = array(
  'apple' => 'red';
  'banana' => 'yellow',
 );
 echo $fruits_color['banana'], PHP_EOL; //yellow

配列の中に配列が入っている、ネストされた配列のことを多次元配列という。

多次元配列
$fruits_color = array(
  'apple' => array(
     'price' => 100,
     'count' => 2,
  ),
  'banana' => array(
     'price' => 90,
     'count' => 5,
  ),
);
foreach ($fruits as $name => $value) {
   echo "$name は1つ {$value['price']}円で、{$value['count']}個だ", PHP_EOL;
}

foreach文

配列専門のループ処理
配列の要素がある分だけ繰り返し処理するという内容の文だよ

//一次元配列
foreach (配列変数($array) as 変数($value)){
  実行する処理;
}
//連想配列
foreach ($array as $key => $value){
実行処理文
}

$arrayは配列変数、$valueは$arrayに入っている要素、$keyは配列の番号
配列や連想配列を展開したいときや、配列などの値を変更する必要がない場合に便利
詳しくは公式へ

if文

条件分岐では、上から順に条件が一致した時点で処理が実行されることに注意

if(条件A){
条件Atrueであれば実行
}elseif(条件2){
条件Btrueであれば実行
}
else{
条件A,Bfalseであれば実行
}

具体例

for文 while文 繰り返し処理

  • 繰り返し回数を優先的に指定したい場合はfor文
  • 条件を優先的に繰り返したい場合はwhile文
  1. while文は指定した条件式が真(true)の間、繰り返し実行する。
初期値;
while(条件式){
処理を実行する増減式;
}
  1. 対してfor文、はじまりから終わりまでの数値を把握するために( )内に全て書く
for(カウンタの初期値; ループ処理の条件式; 処理を実行する増減式){
処理を実行する
}

使い分ける際、以下を明確にしておくと良い

処理中に変更したり、繰り返す回数がわからない場合や
特定の条件にて途中で中断する場合にはwhile文の方が便利

具体例

より複雑なwhile文、if文混合

  • break;でfor文(繰り返し文)を途中で抜ける
  • continue;でfor文の途中で次の繰り返し処理へ移らせる
$count = 1;   //変数の定義
 
while($count <= 10){     //変数countが10以内だったら繰り返す
  if($count % 2 == 0){   //変数countが2の倍数なら
    $count++;            //変数countに1を足す
    continue;            //次の週へスキップ
  }
  echo $count;          
  $count++;             //変数countに1を足す
}

whileしますよ→ただし条件分岐します と読むだけ。
10以内ならループ→2の倍数の時は、1だけ足して次の週へスキップするよ→実行結果は13579
引用元:具体例と解説がわかりやすい

シングルクォーテーションとダブルクォーテーション

  1. シングルクォーテーション('')
    文字列中の変数を変数値に置換しない
  2. ダブルクォーテーション("")
    文字列中の変数を変数値に置換する

ダブルクォーテーションの方が高機能な処理を行っているため、シングルクォーテーションの方が処理が速い。

$str = 'pen';

//「This is a pen.」 と表示、''の場合「this is a $str.」 
echo "This is a $str.";

(勝手ながら引用させていただきました><)[http://www.24w.jp/study_contents.php?bid=php&iid=php&sid=string&cid=006]

変数の型変換 キャスト(型変換)演算子

書式:(型) $変数

型の種類
int(整数) bool(論理型) string(文字列)   array(配列)
float,double(浮動小数点) object(オブジェクト) が指定可能。

PHPでは変数の型を変換する際、上記のように型を指定する「型キャスト」、もしくは(以下に示す)関数を使う

$data = intval($hensu); // 「整数」にしたい場合
$data = strval($hensu); // 「文字列」にしたい場合

(より詳しく)[https://qiita.com/mpyw/items/3aac811629622f7f4d8b]

render メゾット

renderメソッドは別のViewファイルを指定して描画を行いたいときに使う

implode join関数

配列要素を文字列により連結する
https://www.php.net/manual/ja/function.implode.php

具体例
$pieces = ["2020", "11", "01"];

echo implode("-", $pieces).PHP_EOL; // 2020-11-01

echo implode($pieces).PHP_EOL;      // 20201101

日付関数 date strtotime DateTimeクラス

PHPの日付や時間を「○年○月○日」や「○-○-○」など所定のフォーマットで出力する時に使う

date(フォーマット形式 [, タイムスタンプ]([ ]は省略可));
strtotime(日時, タイムスタンプ)

date関数
タイムスタンプは省略可能で、省略するとtime()つまり現在の日付を自動で取得してくれる

strtotime関数
英文形式の日時をUnixタイムスタンプに変換してくれます。
日付の差分を計算したり、1週間後の日付を取得したりと日付の計算の時によく使われる

Unixタイムスタンプとは、協定世界時(UTC)での1970年1月1日午前0時0分0秒からの形式的な経過秒数

DateTimeクラス
PHP5.2からサポート

$day = new DateTime('日時(省略したら今の時点での日時)');

echo $day->format('Y-m-d'); //2020年11月1日

参考:ありがとうございました

より体系的なものにするために今後も追記していきます。
https://www.php.net/manual/ja/function.date.php
https://qiita.com/shuntaro_tamura/items/b7908e6db527e1543837

php基礎
http://www.cc9.ne.jp/~initialize/text/php/php_02.html
https://www.wcguru.net/php-source-imi-10-syoshinsya/

Discussion