PHP入門

JavaやJavaScriptなどと並行して学習を進めており、基礎的な文法は省略しているところも多いが、初心者がゼロからphpに関して学習した内容を以下に記述しています。

#PHPプログラミングの手順
　　①エディタを使用してプログラミングを記述
　　②任意の名前.phpで保存
　　③保存したphpファイルをサーバーへアップロード

#環境構築
　　今回はMAMPをインストールして利用した。


#PHPの書き方
　　<? php
　　　**ここにプログラミングを記述する**
　　?>
`PHPのプログラムのあとに何も書かない場合は、終了タグ「?>」の省略が推奨されている。`

#出力の方法
　　　**echo**　"Hello World";
　　または、
　　　**print**　"Hello World";

　　改行したい場合
　　　**echo**　"１行目＜br＞2行目";

#変数
　　変数名の前には**＄**をつける
　　大文字と小文字は区別される
　　変数名の先頭に数字、_以外の数字は変数名に使えない
　例)
　　＄ABC ＄abc ＄Abc

####代入
　　変数に値を代入するには「**=**」を使う
　　＄a = 1;
　　＄a = "文字列";　　　//文字列は「"　"」で囲む

#PHPのデータ型
　文字列　**string**
　整数　**intｅｇｅｒ**
　浮動小数点数　**ｆｌｏａｔ**
　論理値　**boolean**
　配列
　オブジェクト
　null

**PHPでは、変数を使用するときに、データ型の宣言が不要。**
##var_dump(変数名);
　変数のデータ型と値を出力する。
   
#定数
```php
  //定数の定義
　define("/*定数名*/", "/*値*/");
  //定数の利用
  echo /*定数名*/;
```

##自動的に定義される定数
```php
  var_dump(__LINE__);  //行数を表示
  var_dump(__FILE__);  //ファイル名を表示
  var_dump(__DIR__);   //ディレクトリ名を表示
```

#文字列
####シングルクォーテーションとダブルクォーテーションの違い

<table border="0" cellspacing="0" cellpaddiｎg="0'>
     <tr>
       <th></th><th>文字列</th><th>計算式</th><th>変数</th><th>処理速度</th>
     </tr>
　　　<tr>
       <td>シングルクォーテーション</td><td>そのまま文字列として表示</td><td>そのまま文字列として表示</td><td>そのまま文字列として表示</td><td>速い</td>
     </tr>
　　　<tr>
       <td>ダブルクォーテーション</td><td>そのまま文字列として表示</td><td>そのまま文字列として表示</td><td>変数を展開して中身を表示</td><td>遅い</td>
     </tr>
</table>


####［.］ドット
　　ドットは文字列の連結に使われる。
　例)
　　＄name = "田中";
　　＄age = 25;

   echo ＄name."さん（".＄age.”歳)”
　　↓
　　田中さん(２５歳)

##変数を展開する時
　echo "＄変数名";
　echo "{＄変数名}";
　echo "＄｛変数名｝";
　などの書き方があり、どう書いても展開される。

##文字列を連結する時は、ドット「.」でつなぐ
　echo "文字列１" . "文字列２";

#if文
　　if　(条件)　{処理内容}
　例）もし＄aが10より大きい場合は、Aと表示する
　　＄a = 15;
　　if (＄a > 10) {
　　echo "A";
　　}

#elseif文
　　if　(条件)　{処理内容}
　例）もし＄aが10より大きい場合は、Aと表示する
　　 そうでない場合で、＄aが10未満の場合は、Bと表示する
　　＄a = 15;
　　if (＄a > 10) {
　　echo "A";
　　｝　elseif　(＄a < 10)｛
　　echo "B";
　　｝

#else文
　　if　(条件)　{処理内容}
　例）もし＄aが10より大きい場合は、Aと表示する
　　 そうでない場合は、Bと表示する
　　＄a = 15;
　　if (＄a > 10) {
　　echo "A";
　　｝　else　｛
　　echo "B";
　　｝
　　
#switch文
　　switch　(＄a)　｛
　　　　case〇〇　:　処理内容;
　　　　break;
　　｝

#真偽値について
　＃＃falseになる場合
　　文字列:　空、　"0"
　　数値:　０、　0.0
　　論理値:　false
　　配列:　要素の数が0
　　null

#三項演算子

```php
 $max = ($a > $b) ? $a : $b;
  //(＄a > ＄ｂ)がｔｒｕｅの場合、＄maxに＄aを代入。
  //falseの場合、＄maxに＄ｂを代入。

  //if文で書くと・・・
  if ($a > $b) {
      $max = $a;
  } else {
      $max = $b;
  }
```



#配列
####配列の書き方
　　＄name = array("田中"、"高橋"、"斎藤");

　または
　　＄name[0] = "田中";
　　＄name[1] = "高橋";
　　＄name[2] = "斎藤";

####要素の追加
　　＄name = array("田中"、"高橋"、"斎藤");
　　**＄name[] = "新しい要素";**
　　※＄name[3]に新しい要素が追加される

####値の更新
　　＄name = array("田中"、"高橋"、"斎藤");
　　**＄name[０] = "加藤";**
　　※田中→加藤

####要素の削除
　　＄name = array("田中"、"高橋"、"斎藤");
　　**unset(＄name[０]）;**
　　※田中を削除

#連想配列
　例)普通の配列
　　＄name = array("田中"、"高橋"、"斎藤");
　例)連想配列
　　＄name = array("名前１" => "田中"、"名前2" => "高橋"、"名前3" => "斎藤");

　例)田中を呼び出す場合
　　echo ＄name["名前１"];

#多次元配列
　　配列の各箱の中に、さらに小さな箱を入れて管理する方法
　例）
　　＄name = array(
　　　　　　　　array("田中","高橋"),
　　　　　　　　array("Bob","Emily"),
　　　　　　　　array("キム","パク"),
　　);
　　
　例)田中を呼び出す場合
　　echo ＄name[0][0];

   多次元配列の値に、配列変数を指定することもできる
　例)アジア配列、アメリカ配列を、カントリー配列に代入
　　＄asia = array("日本","タイ");
　　＄america = array("アメリカ","ブラジル");
　　＄country = array(＄asia,＄america);

　例)日本を呼び出す場合
　　echo ＄country[0][0];

#多次元連想配列
　　配列の各箱の中に小さな箱が入っており、各箱の添え字に別の文字列等を使って管理する方法
　例)
　　＄country = array(
　　　"アジア" => array("東アジア" => "日本", "東南アジア" => "ブラジル"),
　　　"アメリカ" => array("北米" => "アメリカ", "南米" => "ブラジル"),
　　　"欧州" => array("西欧" => "フランス", "東欧" => "ロシア")
　　);

　例)タイを呼び出す場合
　　echo ＄country["アジア"]["東南アジア"]
　　

#関数
####関数の書き方
　　function 関数名(引数1、引数2、引数3・・・){
　　　処理1;
　　　処理2;
　　
　　return　戻り値;
　　}

**※引数に初期値を設定することも可能**
　　function 関数名(引数 = "初期値"){
　　　処理;
　　}

#PHPの組み込み関数
####ceil()
 小数点以下を切り上げる

```php:
  echo ceil(5.6); //6
```

####floor()
 小数点以下を切り捨てる

```php:
  echo floor(5.6); //5
```

####round()
　四捨五入をする

```php:
  echo round(5.6); //6
```

####rand()
　乱数を生成する

```php:１〜１０までの乱数を生成
  echo rand(1, 10);
```

####strlen()
　文字数を数える

```php:
  echo strlen("hello"); //5
```

####mb_strlen()
　マルチバイトの文字数を数える

```php:
  echo mb_strlen("ねこ"); //2
```

　
####printf()
　書式を指定して値を表示する

```php:
  printf("%s - %s - %.3f", "hello", "ねこ", 5.6);
  //hello - ねこ - 5.600
```

####count()
　配列の要素の数を数える

```php
  $colors = ["red", "blue", "yellow"];
  count($colors);
  //3
```

####implode()
　配列の各要素を、指定する区切り文字で連結する

```php:
  $colors = ["red", "blue", "yellow"];
  implode("@", $colors);
  //red@blue@yellow
```


#foreach文
　　配列に格納した情報を順番に表示する
　　＄配列変数名　=　array(値0、値1、値2);
　　　foreach(＄配列変数名　as　＄✕){
　　処理内容;}

```php:例)
<?php
  
$a = array("山田","佐藤","鈴木");
  foreach($a as $value){    //$aを$valueとして処理する的な意味
    echo $value;
  }
  
//  ↓
//  山田佐藤鈴木

```

####foreachでキーを表示する方法
　　＄配列変数名　=　array(値0、値1、値2);
　　　foreach(＄配列変数名　as　＄△　=>　＄✕){
　　echo　＄△.＄✕;}

```php:例)
<?php

$a = array("山田","佐藤","鈴木");
  foreach($a as $key => $value){  //＄aを＄b(キー)と＄c(値)として処理する的な意味
    echo $key.$value;             //キーと値をそれぞれ表示
  }
 
//  ↓
//  0山田1佐藤2鈴木

```

####連想配列で各キーに名前をつける方法

```php:例)

<?php
  $a = array("【名前1】" => "山田","【名前2】" => "佐藤","【名前3】" => "鈴木");
    foreach($a as $b => $c){     //＄aを＄b(キー)と＄c(値)として処理する的な意味
      echo $b.$c;                //キーと値をそれぞれ表示
    }

//  ↓
// 【名前1】山田【名前2】佐藤【名前3】鈴木
```

####foreach文の多次元連想配列

＄food
　　 ●＄vegetable(＄groupkey)
　　　　↓(＄namekey/＄eigoname) => (＄nihonname)
   　　 ・"carrot" => "にんじん"
   　　 ・"tomato" => "トマト"
   　　 ・"onion" => "たまねぎ"
　　　　
　　 ●＄fruit(＄groupkey)
　　　　↓(＄namekey/＄eigoname) => (＄nihonname)
   　　 ・"apple" => "りんご"
   　　 ・"orange" => "オレンジ"
   　　 ・"grape" => "ぶどう"
    
```php:例:上記の多次元連想配列のプログラム
  <?php
   $food = array(
   "vegetable" => array("carrot" => "にんじん", "tomato" => "トマト", "onion" => "たまねぎ"),
   "fruit" => array("apple" => "りんご", "orange" => "オレンジ", "grape" => "ぶどう");

    foreach($food as $groupkey => $namekey){
       echo "■".$groupkey."＜br＞";
       foreach($namekey as $eigoname => $nihonname){
         echo $eigoname.":"$nihonname."＜br＞";
       }
         echo "＜br＞";
    }
  ?>
```
　↓
  ■vegetable
　　carrot:にんじん
　　tomato:トマト
　　onion:たまねぎ

　■fruit
　　apple:りんご
　　orange:オレンジ
　　grape:ぶどう

####foreach文と配列とソート
　例)
　　<?php
　　　＄a = array("d","c","b","a");
　　　　**sort(＄a);**
　　　  foreach(＄a as 
＄key => ＄value){　　　　//＄aを＄valueとして処理する的な意味
　　　    echo ＄value."＜br＞";
　　　  }
　　?>
　　↓
　　a
　　b
　　c
　　d　と表示される

####rsort(変数)
　例)配列＄aの各値を**降順**に並べ替える
　　<?php
　　　＄a = array("d","c","b","a");
　　　　**rsort(＄a);**
　　　  foreach(＄a as 
＄key => ＄value){　　　　//＄aを＄valueとして処理する的な意味
　　　    echo ＄value."＜br＞";
　　　  }
　　?>
　　↓
　　d
　　c
　　b
　　a　と表示される(アルファベットの降順z→a)

####ksort(変数)
　例)配列$aの各キーを**昇順**に並べ替える
　　<?php
　　　＄a = array(
　　　　　　　　　　"1" => "d",
　　　　　　　　　　"2" => "c",
　　　　　　　　　　"3" => "b",
　　　　　　　　　　"4" => "a");
　　　　**ksort(＄a);**
　　　  foreach(＄a as ＄key => ＄value){　　　　//＄aを＄valueとして処理する的な意味
　　　    echo ＄key.":".＄value."<br>";
　　　  }
　　?>
　　↓
　　1:d
　　2:c
　　3:b
　　4:a　と表示される

<table border="0" cellspacing="0" cellpadding="0">
   <tr>
     <th>関数の書き方</th><th>並べ替えの基準</th><th>意味</th>
   </tr>
   <tr>
     <td>sort(＄配列変数)</td><td>値(バリュー)</td><td>配列変数の各値を昇順に並べ替え</td>
   </tr>
   <tr>
     <td>rsort(＄配列変数)</td><td>値(バリュー)</td><td>配列変数の各値を降順に並べ替え</td>
   </tr>
   <tr>
     <td>asort(＄配列変数)</td><td>値(バリュー)</td><td>配列変数の各値を昇順に並べ替え
連想配列において、各キーと値の関係を維持しつつソートする。</td>
   </tr>
   <tr>
     <td>arsort(＄配列変数)</td><td>値(バリュー)</td><td>配列変数の各値を降順に並べ替え
連想配列において、各キーと値の関係を維持しつつソートする。</td>
   </tr>
   <tr>
     <td>ksort(＄配列変数)</td><td>添字(キー)</td><td>配列変数の各値を昇順に並べ替え
連想配列において、各キーと値の関係を維持しつつソートする。</td>
   </tr>
   <tr>
     <td>krsort(＄配列変数)</td><td>添字(キー)</td><td>配列変数の各値を降順順に並べ替え
連想配列において、各キーと値の関係を維持しつつソートする。</td>
   </tr>
</table>


#問い合わせフォームの作成
####web上で問い合わせフォームが動く仕組み
　　①index.html(問い合わせ画面)ーーーユーザーが入力する
　　②mail_confirm.php（入力内容確認画面）
　　　→不備があれば①へ戻り、入力やり直し
　　③insert.php(SQL分を記述)
　　④phpファイルから、データベースへ通信
　　　HTMLから引き渡された情報がデータベースへ格納される。
　　　(SQLのinset文)

####問い合わせフォーム作成の手順
　　①設定ファイルの編集(やらないと、フォームから送信された文字列が文字化けしてデータベースに登録されてしまう)
　　②データベース上にtableを作成する
　　③HTMLとCSSを作成する
　　④phpファイルを作成する

####PHP側でのPOSTの使い方
　　echo $_POST['箱の名前'];　　//index.htmlで作成したform内のname名前を、formの入力欄ごとに指定する必要がある。

　　**処理の流れ**(イメージ)

```haml:index.html(問い合わせフォーム画面)
   <form method="post" action="abc.php">
     名前<input type="text" name="箱の名前"> //①
     <input type="submit" value="送信">      //②
   </form>
```
　　　↓　↓　↓　　　①テキストボックスに名前が入力される
　　　↓　↓　↓　　　②送信ボタンがクリックされる　index.htmlからabc.phpへ"箱の名前”の値が送られる
　　　↓　↓　↓　　　③引き渡されたPOSTをechoで出力する

```php:abc.php(フォーム入力内容確認画面)
    echo $_POST['箱の名前'];  //③入力された内容を表示して確認

　<form action="insert.php" method="post">　　//フォームクリックされた場合、insert.phpへ送信
    <input class = "submit" type="submit" value="送信する">　//送信ボタン
    <input type="hidden" value="<?php echo $_POST['箱の名前']; ?>" name="箱の名前">
  </form>   
```
　　　↓　↓　↓　　　
　　　↓　↓　↓　　　上記で送信ボタンがクリックされると、入力された情報がinsert.phpに送信される。
　　　↓　↓　↓　　　

```php:insert.php
   <?php
　　　mb_internal_encoding("utf-8"); //①DBへ情報を格納する際の文字化けを防ぐ文
     $pdo = new PDO("mysql:dbname=lesson01;host=localhost;" ,"サーバID","サーバpass");  //③DBへ接続するための文
     $pdo -> exec("insert into テーブル名(カラム名,カラム名)values
     ('".$_POST['箱の名前']."','".$_POST['箱の名前']."');");
   ?>
```
　　　↓　↓　↓　　　今回はPDOというライブラリを使ってphp上でSQL文を書いている。
　　　↓　↓　↓　　　①DB接続をして
　　　↓　↓　↓　　　②insert文でデータベースに情報を格納する

**データベース**


#PDOの使い方
　mb_internal_encoding("utf8);
 
　◆データベースと接続するための文
　$pdo = new PDO("mysql:dbname=lesson01;host=localhost;" ,"root" ,"");
　　※mysql:dbname=lesson01　MySQLに接続し、データベース「lesson01」を利用するという意味
　　※host=localhost　通常はDB用のサーバー名を記述する。ローカル環境を使用している場合はこの記述。
　　※"root","　"　サーバー接続する際のIDとパスワードを記述。

　◆データベースにデータを格納するための文
　$pdo -＞ exec("insert into テーブル名(カラム名,カラム名)values
　('".＄_POST['箱の名前']."','".＄_POST['箱の名前']."');");　　　//DBへ送るための情報

　◆データベースからデータを取り出すための文
　＄stmt = $pdo -＞ query("select * from テーブル名");


　※PDO実行時に気をつけること
　　①select文を使うときは
　　　＄stmt = ＄pdo -> query("sql文");

　　②insert文、update文、delete文を使うときは
　　　＄pdo -> exec("sql文");

#データベースから取得した情報を表示させる文の例
```php:データベースから取得した情報を表示させるループ処理の例
  while ($row = $stmt -> fetch()){
    echo $row[`取り出すデータのカラム名`];
    echo $row[`取り出すデータのカラム名`];
    echo $row[`取り出すデータのカラム名`];
  }
//または

  foreach ($stmt as $row) {
    echo $row[`取り出すデータのカラム名`];
    echo $row[`取り出すデータのカラム名`];
    echo $row[`取り出すデータのカラム名`];
  }
   //※rowは「行」のこと
   //※stmtは「statement/声明」の略
   //※fetchは「go and get/取ってくる」こと
```

#リダイレクト
　あるwebページから**自動的**に他のwebページに移動すること。
　PHPでリダイレクトを使用する場合は、下記のheader関数を使用する
　　**header("Location:　URL**　または　**相対パス**");

#session
　sessionとは、サーバー側でデータを保持することで、ページを飛び越えて情報を引き継ぐ技術
　
　　<POST通信>
　　これまでのPOST通信は、form内にPOSTの記述をすることで、
　　２つのページ間で情報を引き継ぐことが可能

　　<session>
　　sessionでは、複数のページ(ファイル)間で情報を引き継ぐことが可能

####sessionの書き方
　**session_start;**
　　sessionを使う場合、ファイル内にsession_start;と記述する必要がある。
　　session_start;以降はsessionが有効になる。

　**＄_SESSION['任意の変数名']** = "文字列等";
　　sessionでは、このように任意の変数に文字列等を代入できる。

　echo **＄_SESSION['任意の変数名'];**
　　一度、sessionに代入した文字列等は、どのファイル(ページ)でもsession_start;を記述した後であればechoなどで出力することができる。

####sessionー同じファイル内で出力する場合
```php:index.php
  <?php
    session_start();                //①session_start以降はsessionが有効になる。
    $_SESSION['name'] = "山田太郎";  //②$_SESSION['〇〇'] = "△△";
                                    //△△を〇〇に代入するという意味。(=サーバーに保存する)
    echo $_SESSION['name'];
  ?>
```

####sessionー複数のファイルで出力する場合
```php:index.php
  <?php
    session_start();                //①session_start以降はsessionが有効になる。
    $_SESSION['name'] = "山田太郎";  //②$_SESSION['〇〇'] = "△△";
                                    //△△を〇〇に代入するという意味。(=サーバーに保存する)
```

```php:xyz.php
  <?php
    session_start();                //他のページでもsession_startと記述すれば、そのセッションを使用できる。
    echo $_SESSION['name'];         //②で保存したSessionをechoで表示する。　　　
  ?>
```


####特定のセッション変数の削除
　　**unset(＄_SESSION['削除するセッション変数名']);**
　
####すべてのセッション変数の削除
　　**session_destroy();**

#cookie
　　webサイトを訪問したユーザー情報を一時的に保存する仕組み。
　　cookieはブラウザに保存される。

<table border="0" cellspacing="0" cellpadding="0">
<tr>
  <th></th><th>cookie</th><th>session</th>
</tr>
<tr>
  <td>保存場所</td><td>ブラウザ</td><td>サーバー</td>
</tr>
<tr>
  <td>有効時間</td><td>コード内で自由に設定</td><td>「php.ini」で設定(デフォルトは、24分)</td>
</tr>
<tr>
  <td>削除方法</td><td>有効期限を現在の時間よりも前の時間に設定することで、cookieを削除することができる。</td><td>session_destroy();
または、ブラウザを閉じたときに自動的に削除される。</td>
</tr>
<tr>
  <td>使用例</td><td>ログインフォームにおいて、「ログイン情報を保持する」
にチェックを入れると、ログアウトしても、ログインに必要なメールやパスワードが
フォームに入力されたままになる。</td><td>ログイン状態において、ページ間(=ファイル間)で情報を引き継ぐ。</td>
</tr>
</table>

####cookieの使い方
　　**setcookie(クッキーにつける名前,保存したいもの,有効期限);**
　　　※有効期限の書き方:1週間の場合→**time()+60*60*24*7**
　　　　クッキーを削除したい場合：**time()-1**と記述する


####cookieー同じファイル内で出力する場合
```php:index.php
  <?php
    setcookie(name,"保存したいもの",time()+60*60*24*7);  //nameという配列に、"保存したいもの"を格納する。保存期間は1週間
    echo $_COOKIE['name'];  //配列に格納した"保存したいもの"を出力。
  ?>
```

####cookieー複数のファイルで出力する場合
```php:index.php
  <?php
    setcookie(name,"保存したいもの",time()+60*60*24*7);  //nameという配列に、"保存したいもの"を格納する。保存期間は1週間
  ?>
```
```php:xyz.php
  <?php
    echo $_COOKIE['name'];  //配列に格納した"保存したいもの"を出力。
  ?>
```

#empty
　　ある配列や変数が空であるかを判定する
　　**if(empty(変数)){処理内容;}**
　　※空や0、NULLである場合はTrueを返し、それ以外はFalseを返す

```php:index.php
  <?php
    session_start();
    $_SESSION['mail']="〇〇@gmail.com";
  ?>
```
```php:xyz.php
  <?php
    session_start();
    if(empty($_SESSION['name'])){  //nameには何もセットされていないので、条件式はtrueとなり、echoが実行される。
      echo "nameは空です";
    }
    session_destroy();
  ?>
```

#isset
　　ある変数や配列に値がセットされていて、かつNULLでないかを判定する
　　**if(isset(変数)){処理内容;}**
　　※値がセットされている場合や、空や0の場合はtrueを返し、NULLがセットされている場合はFalseを返す。

```php:index.php
  <?php
    session_start();
    $_SESSION['name']="山田太郎";
    $_SESSION['mail']="〇〇@gmail.com";
  ?>
```
```php:xyz.php
  <?php
    session_start();
    if(isset($_SESSION['name'])){  //nameに山田太郎がセットされているので、条件式はtrueとなり、echoが実行される。
      echo "セッションあり";
    }
    session_destroy();
  ?>
```

#バリデーション
　　問い合わせフォームや会員登録などの際に、**各入力項目に適した内容が入力されているかどうかチェックすること**

#正規表現
　　特定の文字列のパターンを文字や記号で表現する手法


#PHPで正規表現を行うタイミング
　①HTMLのフォームで入力された情報が、PHPファイルへPOST通信で引き渡される。
　②POST通信で引き渡された情報をpreg_matchでチェックする。
　③チェック結果が正しい場合→insert文でデータベースに格納
　④チェック結果が正しくない場合→エラーメッセージ画面へリンク

#HTMLで正規表現を行うタイミング
　①index.htmlのform内のpatternでチェックする。
　②チェック結果が正しい場合→HTMLのフォームで入力された情報が、PHPファイルへPOST通信で引き渡される。
　③チェック結果が正しくない場合→フォーム画面でエラーメッセージを表示
　④insert文でデータベースに格納

#画像のアップロード方法
　①formに＜input type="file"＞を記述
　②form内でアップロードした画像ファイルはデータベースに格納せずに、
　　「move_uploaded_file(XXX,XXX);」という関数を使用し、指定したファイルへ移動
　③データベースにvarcharで画像用のカラムを作成
　④データベースの画像カラムには「移動先のファイルのパス」と「画像のファイル名」を格納
　⑤画像を表示させる際は、＜img src="XXXX"＞のXXXXに、
　　「移動先のファイルのパス」と「画像のファイル名」を記述

```html:form.html
<body>
  <form method="post" action="upload.php" enctype="multipart/form-data">  <!--ファイルをアップロードする際は「enctype="multipart/form-data"」を記述する-->
    <input type="hidden" name="max_file_size" value="5000000" />          <!--アップロードするファイルサイズの上限(5,000,000バイト(5メガバイト))-->
    <input type="file" name="upfile" size="50" />                         <!--ファイルを選択ボタンができる-->
<!--通常はサーバにアップロードするために、ここにFTP接続をするための関数を記述する-->
    <input type="submit" value="アップロード" />
  </form>
</body>
```
```php:upload.php
<?php
  $temp_pic_name = $_FILES['upfile']['tmp_name'];
  //POSTでアップロードされた「upfile」はサーバー上に一時保存されている。
　//一時保存されているファイル名を取得し、$temp_pic_nameに代入
  $original_pic_name = $_FILES['upfile']['name'];
  //サーバーに一時保存された「upfile」の本当のファイル名を取得し、$original_pic_nameに代入                                    
  move_uploaded_file($temp_pic_name,'./image/'.$original_pic_name);
  //アップロードされたファイルをサーバー上の一時保存領域からimageフォルダへ移動
?>
```



####move_uploaded_file
　アップロードしたファイルが有効なアップロードであるかどうか確認する関数。
　有効な場合は指定子たファイルの移動先に移動される。
　返り値として、有効だった場合はTRUE、有効ではない場合は移動されずFALSEを返す。
　move_uploaded_file(アップロードしたファイル名,ファイルの移動先);

####prepared statement
　予め(=prepared)SQL文の型を記述しておく手法。
　PDOでデータベース接続しselect文を実行する際にセキュリティを高めるために必要な方法。

####place holder
　prepared statementを使用する際に使われる手法で、prepared statementのSQL文の型の中に記述する。疑問符型と名前型がある。


####**ー＞**（アロー演算子)
　左辺から右辺を取り出す(インスタンスへのアクセス時)

####**：：**(スコープ演算子)
　左辺から右辺を取り出す(staticへのアクセス時)

####ファイルの読み込み
　PHPでは、外部の別ファイルの中身を呼び出すことができる。

|構文|処理内容|
|:-:|:-:|
|require|ファイルが読み込めない場合「fatal error」が出てその場で処理が終了する。|
|require_once|ファイルが読み込めない場合「fatal error」が出てその場で処理が終了する。<br>さらに、一度読み込んだファイルは読み込みができない。|
|include|ファイルが読み込めない場合「warning」が出るが処理は継続する。|
|include_once|ファイルが読み込めない場合「warning」が出るが処理は継続する。<br>さらに、一度読み込んだファイルは読み込みができない。|

　◆requieでファイルを読み込むプログラムの例

```php:name.php(nameクラスのファイル)
  <?php
    class Name{ //Nameクラス
    private $name; //フィールドの宣言

      public function __construct($name){ //コンストラクタ
        $this -> name = $name; //nameフィールドに引数nameを代入
      }

      public function Aisatsu(){ //Aisatsuメソッド
        return "私の名前は" .$this -> name. "です。"; //戻り値
      }
    }
  ?>
```
`↓↓↓requireでname.phpを読み込む↓↓↓`

```php:index.php
  <?php
    require "name.php"; //requireでname/phpを読み込み
      //読み込めない場合は「fatal error」が出てその場で処理が終了する。
    $instance = new Name(""); //読み込んだName型のインスタンスの生成
    echo $instance -> Aisatsu(); //メソッド呼び出し
  ?>
```

#名前空間
　クラス名、関数名、インターフェースなどが、他の開発者とバッティングしないようにする仕組み。
　**必ずファイルの先頭に書く**

```php:User.class.php
<?php

  namespace Project\Lib; //namespaceと書くことで指定できる。

  class User {
    public $name;
    public function __construct($name) {
      $this->name = $name;
    }

    public function sayHi() {
      echo "hi, i am $this->name!";
    }
  }

```

```php:index.php(名前空間をそのまま使用するパターン)
<?php
  require "User.class.php";

  $bob = new Project\LibUser("Bob");
  $bob->sayHi();

//  hi, i am Bob!
```

```php:index.php(名前空間に別名を指定するパターン)
<?php
  require "User.class.php";

  use Project\Lib as Lib;  //別名を指定できる。

  $bob = new Lib\User("Bob");
  $bob->sayHi();

//  hi, i am Bob!
```

```php:index.php(useを使って階層の最後の単語を使用するパターン)
<?php
  require "User.class.php";

  use Project\Lib;  //階層の最後の単語「Lib」を使えばOK

  $bob = new Lib\User("Bob");
  $bob->sayHi();

//  hi, i am Bob!
```



#オブジェクト指向
####クラスの書き方

```php:クラスの書き方
  class クラス名 {

    public $変数名; //プロパティ

    public function __construct(引数){ //コンストラクタ(クラスがインスタンス化されてからはじめに呼び出される関数)
      実行する処理;
    }
    
    public function メソッド名(){
      実行する処理;
    }
  }

  $インスタンス名 = new クラス名("引数");

```
####継承
　　継承とは、あるクラスのプロパティやメソッドを引き継ぎ、クラスを拡張すること

```php:継承の書き方
  class 子クラス名 extends 親クラス名{
    子クラス独自のプロパティやメソッドの追加のほか、
    この中で親クラスで定義したプロパティやメソッドの上書き(オーバーライド)
  }
```

####カプセル化
　クラス内部のプロパティにprivateを使い、クラス外部からアクセスできなくすること

PHPのプロパティやメソッドには３タイプの権限がつけられる

|権限|説明|
|:-:|:-:|
|public|どこからでも利用(参照)できる<br>※メソッドには基本的に「public」を使う|
|private|同一クラス内しか利用(参照)できない<br>※プロパティには基本的に「private」を使う|
|protected|親クラス、継承クラスからしか利用(参照)できない<br>※基本的に親クラスのプロパティで使う|

####getterとsetter
　カプセル化されたプロパティには、getterやsetterというメソッドを利用することで
　間接的にアクセスできるようになる。

```php:getterとsetterの書き方
  //getter--------------------
  function getプロパティ名 (){
    return $this -> プロパティ名;
  }

  //setter--------------------
  function setプロパティ名 (引数){
    $this -> プロパティ名 = 引数;
  }
```

#staticキーワード
　クラスをインスタンス化しなくても使えるメソッドやプロパティを定義することができる。
　インスタンス化される際に実行される__construct()等は使えない。

```php
<?php

  class User {
    public $name;
    public function __construct($name) {
      $this -> name = $name;
    }
    public static function getMessage() {}
  }

  User::getMessage(); //インスタンス化しなくても利用できる。
  self::getMessage(); //自分のクラスへの静的アクセスをする場合selfを使用する。
```

#抽象クラス
　他のクラスで継承して利用することを前提としたクラス。
　抽象クラス自身をインスタンス化はできない。
　**抽象クラスは、１つしか継承できない**。

```php
<?php

abstract class BaseUser
{  //abstract を付けることで、抽象クラスとして定義できる。
    public $name = "taro";
    abstract public function sayHi();  //メソッドにabstractを付けると抽象メソッドとなり、このクラスを継承したクラスで必ず実装しなければならない。
}

//BaseUserを継承したUserクラスを定義
class User extends BaseUser
{
    //override
    public function sayHi()
    {
        echo "\n";
        echo "Hi! " . $this->name;  //$nameプロパティも継承されているので使える。
        echo "\n";
    }
}

$test = new User();
$test->sayHi();

// Hi! taro
```

#インターフェース
　必ず実装するメソッドを指定できる。
　抽象クラスと違い、**複数実装することができる**。
　**抽象メソッド以外を定義することができない**。

```php
<?php
interface sayHi
{
    public function sayHi();
}

interface sayHello
{
    public function sayHello();
}

class User implements sayHi, sayHello
{
    public function sayHi()
    { //
        echo "\n hi! ";
    }
    public function sayHello()
    {
        echo "hello! \n\n";
    }
}

$test = new User();
$test->sayHi();
$test->sayHello();

//  hi! hello! 

```

#例外処理
　何らかの処理中に、予期せぬ結果が発生したときの処理を書ける。

```php
<?php
  function div($a, $b) {
    try {
      //$bが０の場合に例外を投げる。
      if ($b === 0) {
        throw new Exception("cannot divide by 0!");
           //Exceptionクラスのインスタンスを生成する際に、独自のメッセージを指定できる。
      }
      echo $a / $b;
    } catch (Exception $e) {
      //例外が投げられたときの処理
      echo $e->getMessage();
    }
  }

  div(7, 2);
  div(5, 0); //0になる割り算はPHPではエラーとなる。

//  3.5cannot divide by 0!
```