PHPまとめ・MVCフレームワークとは

##string型　　
データ型の1つ、文字列のこと
##integer型　
データ型の１つ、整数型
##float型　
データ型の１つ、浮動小数点型
##boolean 型　
データ型の１つ、論理値　真偽の値を表す型。
true/falseのいずれかになる。if文などの条件分岐で演算子とともに使われることが多い

##var_dump 
 データ型を調べるときに用いる
var_dump() のカッコ内に変数を入れて表示させる

##定数：変更されない値につけるラベル
define(“MY_EMAIL”,”kurata.miraidenshi@gmail.com”);
左：定数名　右：値


##四則演算
- +（足し算） 
- -（引き算） 
- *（掛け算） 
- /（割り算）
- ％（余り） 
- **（べき乗）（PHP5.6－）  
- ++(+1) 
- --(-1)

例）　

```
$x=10 %3   //1
$y=30.2 / 4  //7.55
```

##文字列
””　特殊文字（\n,\t)や変数
‘’　特殊文字や変数が表示されない

##文字列の連結
結合演算子(. )を使う ⇒単に結合する
結合代入演算子（.=)を使う　⇒右側の引数に左側の引数を追加

- 例１）
\$a= “Hello”;
\$b= \$a .  “World” ;    //\$bは、”Hello World”になる
- 例２）
\$a= “Hello”;
\$a .=  “World” ;    //$bは、”Hello World”になる

##if条件分岐

```
＄score=（数値）

if($score >80 ) {
 echo “great!” ;
}elseif($score > 60) {
echo “good!” ;
} else{
 echo “so so…”;
}
```

以上の場合では\$scoreが80より大きい値の場合、great!
\$scoreが80以下で60より大きい値の場合、good!
\$scoreがどちらの範囲にも存在しない数値（60以下）の場合、so so...　と表示される

##比較演算子
- >（より大きい） 
- <（より小さい） 
- >=（以上） 
- <=（以下） 
- ==（等しい※値の比較） 
- ===（等しい※値とデータの型の比較）
- !=　（等しくない※値の比較） ! ==（等しくない※値とデータの型の比較）


##三項演算子

```
$max= ($a > $b) ? $a : $b

```
意味：$a > $bが真だったら$aを、$a > $bが偽だったら$bを$maxに代入せよ　という意味

##switch 条件分岐
変数の取りうる値によって、出力する値を変えることができる
例）

```
$signal= “red”;

switch($signal) {
 case “red”:
    echo “stop!”;
 break;
 case “blue”:
    echo “go!”;
 break;
 case “yellow”:
    echo “stop!”;
 break;
default:
 echo “wrong signal”;
}
//stop!
```

##while文　ループ処理

```
$i = 0;
while ($i < 10) {
 echo $i ;
 $i++;
}
この場合、$iは０であり、$I < 10が真であるため、下に続く処理が行われる。
これが、カッコ内が偽になるまで続く。（ループ）
//0123456789
```

以上と同様の処理をdo ... while文でも表すことができる

```
$i = 0;

do {
 echo $i;
 $++;
}while($i < 10);   //0123456789
```

while文との違いは真偽の判定位置。
例えば、$iが100の場合、while文では先に$ < 10が真か偽かの判定を行い、これが偽になるため、何も表示されない
しかし、do...while文の場合は、判定位置が処理の後であるため、最初の100は表示される。（判定は偽になるため、以降は表示されない。）


##for文

```
for($i = 0; $i < 10; $i++) {
 echo $i;
}
//0123456789
```

カッコ内は、「ループが始まる前の初期条件」「ループが終わる条件」「ループの処理が終わるごとに行われる条件」の順に書く。

break:ループを抜ける
continue:それ以降の処理を実行せずに次のループに移る

```
for($i = 0; $i < 10; $i++) {
　if($i  === 5) {
    break;
    }
 echo $i;
}
//01234

for($i = 0; $i < 10; $i++) {
　if($i  === 5) {
    continue;
    }
 echo $i;
}
//012346789
```

##配列
key value

```
$sales = array(
   “taguchi” => 200,
   “fkoji” => 800,
   “dotinsatall” => 600,
);
```

PHP5.4以降では大かっこで括ることでarrayを書かなくてもいい。

```
$sales = [
   “taguchi” => 200,
   “fkoji” => 800,
   “dotinsatall” => 600,
];
```

また、keyは省略することができ、その場合はそれぞれのvalueは0からの連番で表される。

```
$colors = [“red”,”blue”,”pink”];
var_dump($colors[1]); //blue
```

##foreach
配列の内容をループ処理で取り出すことができる

```
$sales = [
   “taguchi” => 200,
   “fkoji” => 800,
   “dotinsatall” => 600,
];

foreach ($sales as $key => $value) {
 echo 
“($key) $value “ ;
}
//(taguchi)200 (fkoji)800 (dotinstall)600

$colors = [“red”, “blue”, “pink”];

foreach ($colors as $value) {
 echo “$value “ ;
}
//red blue pink
```

##関数

```
function sayHi(){
  echo “hi!”;
}

sayHi();  
呼び出すときは関数名とカッコを書く。
関数の値に引数というデータを指定することができる。

function sayHi($name){
  echo “hi!” . $name;
}

sayHi(“Tom”) ;
```

##組み込み関数
\$x =5.6
\$s1  =”hello”;
\$s2 = “ねこ”;


- ceil：小数点以下を切り上げる
- floor：小数点以下を切り上げる
- round： 四捨五入
- rand ：ランダム
- strlen ：文字数を数える
- mb_strlen ：日本語の文字数を数える
- count：配列の要素の数を数える
- implode：配列から文字列を作成する

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

```
　printf(“%s - %s - %.3f”, $1,$2,$x)　
```

##クラスとインスタンス

データ構造を定義して変数や関数をまとめる⇒クラス

変数はプロパティ
関数はメソッド

クラスを基に実際にデータを持たせたオブジェクトをインスタンスと言う。

クラスは必ず1文字目が大文字になる

```
class User {
 //property
　public $name;

//constructor（メソッドの一種）引数はインスタントを作るときに渡される値   
　public function __construct($name) {
　$this->name =$name //クラスの中のnameプロパティに$nameを渡す
　}
//クラスの中のメソッドやプロパティにアクセスするには$thisを使う

//method
　public function sayHi() {
 　echo “hi, i am $this->name !”;
　}
}

$tom= new User(“Tom”);
$bob= new User(“Bob”);

echo $tom->name;  //Tom
$bob->sayHi(); //hi, i am Bob!

```
##クラスの継承

```
class User {
　public $name;
　public function __construct($name) {
　　$this->name =$name ;
　}
　public function sayHi() {
 　 echo “hi!, i am $this->name !”;
　}
}     //親クラスと呼ばれることもある

class AdminUser extends User {
 public function sayHello() {
 echo “hello from Admin!”;
 }
}//子クラスと呼ばれることもある

$tom =new User(“Tom”);
$steve = new AdminUser(“Steve”);
echo $steve->name;
$steve->sayHi();
$steve->sayHello();

//Steve hi , i am Steve! hello from Admin!

```

###子クラスで親クラスを上書きすることも可能（オーバーライド）

```
class AdminUser extends User {
 public function sayHello() {
 echo “hello from Admin!”;
 }
//override
public function sayHi() {
 　 echo “[admin] hi, i am $this->name !”;
　}

$tom =new User(“Tom”);
$steve = new AdminUser(“Steve”);

$Tom->sayHi();  //hi, i am Tom! 
$steve->sayHi(); //[admin] hi , i am Steve!

```

親クラスがオーバーライドを禁じる場合は、メソッド名の前にfinalを付ける

##アクセス権
public：どこからでもアクセス可能
private：そのクラス内からのみアクセス可能
protected：そのクラス＋親子クラス内からのみアクセス可能

##static
インスタンス化しなくても使えるメソッドやプロパティ

```
class User {
　public $name;
//インスタンス化された数を数えるstaticプロパティをクラスに対して設定する
   public static $count = 0;
　public function __construct($name) {
　　$this->name =$name ;
       self::$count++;
　}
　public function sayHi() {
 　 echo “hi!, i am $this->name !”;
　} 
    public static function getMessage() {
      echo “hello from User class!”;
 }
} 

User::getMessage(); //staticメソッド
//hello from User class!
$tom  = new User(“Tom”);
$bob  = new User(“Bob”);
  
echo User::$count; // 2

```

##抽象クラス
他のクラスで継承されることを前提としたクラス
それ自身をインスタンス化することはできない。

```
abstract class BaseUser {
  public $name;
  abstract public function sayHi();　　//実装の中身を書く必要はない
}

class User extends BaseUser {
    public function sayHi(){
 　 echo “hello from User”;
 }
}
//アクセス権、引数の数は合わせる
```

##インターフェース
###インターフェースの定義
「このクラスではこのメソッドを必ず実装してください」というルールを定義するための仕組み

```
interface sayHi() {
 public function sayHi();
}

interface sayHello() {
 public function sayHello();
}
```

###インターフェースの実装

```
//implementはextendsと違って複数のインターフェースを指定することができる
class User implements sayHi, sayHello {
   public function sayHi() {
 　echo “hi!”;
　}

   public function sayHello() {
　 echo “hello!”;
　}
}
```

##requireとincludeの違い
require：エラーが出た場合にfatal errorを発生させてその場で処理を終了する
include：エラーが出た場合にwarningを発生させて処理を続行させる

###requireとrequire_onceの違い
require_once：PHPが自動的にそのファイルが読み込まれているかチェックしてくれる
（もし読み込まれている場合は、処理をスキップしてくれる）

##名前空間
ファイルを分割して、他の人が作ったファイルを読み込んだときにクラス名などがバッティングしてしまうことがあると問題に繋がる。
他の人と被らないようにするために、自分が作ったクラスや関数、インターフェースなどに名前空間をつける。

例）

```
[User.class.php] namespace Dotinstall\Lib
[Index.php] $bob= new Dotinstall\Lib\User(“Bob”);
```

##名前空間が長い時は
名前空間を階層的に管理していると名前が長くなってしまうことがある。
useを使うことで名前を一部省略できる。
例）

```
use Dotinatall\Lib as Lib;　
　　(use Dotintsall\Lib;)

　$bob= new Lib\User(“Bob”);
```

##例外処理
予期しない結果が発生したときに適切に処理をしていく方法
例外を発生させたい箇所をtryで囲う。

```
function div($a, $b) {
  try {
   if ($b === 0) {
    throw new Exception(“cannot divide by 0!”);
    }   
    echo $a/ $b;
 } catch (Exception $e) {
    echo $e->getMessage();
 }
}

div(7,2);
div(5,0);

```
##server
$_SERVER は、ヘッダ、パス、スクリプトの位置のような 情報を有する配列です。この配列のエントリは、Web サーバーにより 生成されます。

###'REQUEST_METHOD'
ページにアクセスする際に使用されたリクエストのメソッド名。 'GET', 'HEAD', 'POST', 'PUT' など。


##XSS

XSSとはクロスサイトスクリプティングのこと。

>クロスサイトスクリプティングとは、ユーザのアクセス時に表示内容が生成される「動的Webページ」の脆弱性、もしくはその脆弱性を利用した攻撃方法のことです。動的Webページの表示内容生成処理の際、Webページに任意のスクリプトが紛れ込み、Webサイトを閲覧したユーザ環境で紛れ込んだスクリプトが実行されてしまいます。
（引用：https://www.trendmicro.com/ja_jp/security-intelligence/research-reports/threat-solution/xss.html）

セッションIDやCookieの情報の漏えいの危険がある。

htmlentities — 適用可能な文字を全て HTML エンティティに変換する
htmlspecialchars — 特殊文字を HTML エンティティに変換する

##Cookie
アクセスしてきたユーザーのブラウザにデータをセットできる。
しかし、データ改ざんの可能性がある。
###Cookieの設定の仕方

####有効期限を設定する場合

例）

```
setcookie(“username”,”taguchi”,time()+60*60);
echo $_COOKIE[‘username’];

```
####Cookieの削除の仕方
有効期限を過去のものにする。

例）

```
setcookie(“username”,”taguchi”,time()-60*60);
echo $_COOKIE[‘username’];
```
##SESSION
cookieと同じようにアクセスしてきたブラウザに応じてデータを保存できる仕組み。
ブラウザ側ではなく、サーバー側にデータを保存できる。
session_start();で開始する。
cookieとは違い、「大きなデータが保存できる」「改ざんされにくい」「中見が見られない」という良さがある。

例）

```
session_start();　

$_SESSION[‘username’] = “taguchi”;

echo $_SESSION[‘username’];

```
###削除の仕方
unset ($_SESSION[‘username’]);

##PDO（PHP Data Object）

```
define(‘DB_DATABASE’, ‘dotinstall_db’);
define(‘DB_USENAME’, ‘dbuser’);
define(‘DB_PASSWORD’, ‘’);
define(‘PDO_DSN’, ‘mysql:dbhost=localhost;dbname=’’ . DB_DATABASE );

try {
// connect
 $db= new PDO(PDO_DSN, DB_USENAME, DB_PASSWORD);
 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

} catch (PDOException $e) {
 echo $e->getMessage();
 exit;
}

```

##MVCフレームワーク

MVCとはModel・View・Controllerの略で、処理を3つの役割に分割して実装する手法のこと。

- Model：処理のメインロジックやデータアクセスを担当
- View：処理結果として画面表示（HTML出力）を担当
- Controller：クライアントよりのリクエストを直接受け取って処理を行う、一番前面となる部分で、ModelやViewを制御する

①クライアントがControllerにリクエスト
②ControllerがModelに処理指示
③ModelがControllerに結果データ返却
④ControllerがViewに出力指示
⑤Viewがクライアントにレスポンス

![mvc.gif](https://qiita-image-store.s3.amazonaws.com/0/255872/9793ab59-8901-ae28-17ec-3a855fbeba2b.gif)

このように分割することで、分業が可能になり、変化させることが容易になります。