PHP入門　ドットインストール編

#データ型
- 文字列　string
- 数値　integer float 整数と不動小数
- 論理値　boolean / true false
- 配列
- オブジェクト
- null　何もない

などがある。

##文字列
""と''の２通り。
""は特殊文字（\n→改行,\t）、変数の展開ができる。(''ではできない)

文字列の連結には.(ドット)を使うといい。


#変数と定数
##変数
データにつけるラベル。htmlの`class`のようなもの？
`$変数名="~~~"`
変数の=は右辺を左辺に代入するという意味。
phpでは変数を使う際、型を宣言する必要がない。
型を知ろうと思えば
`var_dump(変数)`を使えば良い

###変数の展開

変数を展開するとは、
変数に格納されている値（`ex.$name="西村"`）
を出力(ex.`echo "こんにちは $name";`→こんにちは西村)すること。

変数を展開する際は、変数が文字列に紛れてごちゃるので、**波カッコ{}でくくってあげる**と分かりやすい。
(ex.`echo "こんにちは {$name}";`)


##定数
定数はプログラミング上で変更されない値（後から変更しようとしたらエラーに）
`define("定数名","内容");`を使う。
定数名は慣習的に全部大文字




#var_dumpとechoの違い

var_dumpは、データの型と値を表示してくれるのに対し
echoは値だけを表示する。
var_dumpに自動的に定義されている定数を扱うと

- `var_dump(__LINE__)` 行数 
- `var_dump(__DIR__)` ディレクトリ名 
- `var_dump(__FILE__)` ファイル

などを知ることができる。

#演算子
`$x = 5`
`$x = $x + 2`　←7
`$x +=2 `  ←省略形

#条件分岐

##比較演算子と論理演算子

比較演算子…＞、＜、＞＝、＜＝、＝＝（値の比較）、＝＝＝（値とデータの型）、！＝（～と値だけが等しくない）、！＝＝（～と値、データが等しくない)

論理演算子…and←→&&、or←→||、!→not

##if文
もし~なら~を表示する。

変数の場合分け

`$score = 85;`

- もし(～)だったら、{～}といった処理を行う
`If($score > 80){
 echo “great”;
}`

- eleseif　→　もしifではなく、(～)だったら{~}といった処理を行う

`elseif($score > 60) {
 echo “good”;
}`

- もし、それ以外の条件なら(～)といった処理を行う（elseの場合”それ以外”がすべて対象なので()はいらない）

`else{
 echo “good”;
}`

###真偽値
真偽値（データの値自体でtrue と falseになる定義がある）
Falseになる場合

- 文字列　空文字列 "0"
- 数値 0
- 論理値　falseの場合
- 配列　要素の数が０だった場合
- Null

`$x = 5;`
`$x = 5;{
 echo "great";
}`
(true)もし$xが5ならgreatと表示しなさい。
→数値は0ではないので5(true)が表示される。

###三項演算子

`$max = ($a > $b) ? $a : $b;`
 
()の中の条件が真だったら$aを、偽なら$bをｄ代入する

##switch文

変数がすでに決まっている。それに対して処理を振り分ける方法。
If,elseによる分岐が多い複雑な場合に用いられる。
Switch(式)の式がcaseの値と一致した時、ブロックが実行される。
どれにも当たらなかったとき、defaultのブロックが実行される。
Ex.)Case 1:とcaseはコロン
ブロックの最後にbreak命令は必須

ex.

`$signal = "green";`

`switch ($signal) {
  case "red":
    echo "stop!";
    break;
  case "blue":         
  case "green":`←caseの追加は簡単にできる
    `echo "go!";
    break;
  case "yellow":
    echo "caution!";
    break;
  default:
    echo "wrong signal";
    break;
}`

#繰り返しの処理
##While文

`$i=1;`　←初期化
`while
($i<=100)` ←ループ終了条件
`{
echo $i;`　←繰り返す処理
`$i++`	←変数の更新
`}`

###do while文
`$i=”100”;
do{
echo $i;
$i++;
}while ($i<10)`

これだと一旦`$i(100)`は表示される
While文が前半で先に判定しているのに対し、doは後処理判定。
`$i`の表示条件が後に出てくるのでいったん`$i`が表示されるが、その後のループは行われない。

##for文

`For(①$i = 1;②$i <=100;④ $i++){
③Echo $i;
⑤echo ‘<br>’
}`
①初期状態②ループ終了条件③繰り返す処理④変数の更新⑤echoの改行

足す数字が１の時だけ++で省略可--もある

###break
ループを強制終了する命令。繰り返し分の中で利用することができる。
条件文と組み合わせて利用するのが一般的。
`For($i=1;$i<=10;$i++){
If($i>5){
break;
}
Echo $i;
}`

###continue
ループを抜けるbreak文に対しcontinue文は現在の周だけをスキップしループそのものは継続して行う。

`For($i=1;$i<=10;$i++){
If($i%3==0){`                ←`$i`の値が3の倍数の時、
`continue;`      		　　　その週のループを実行し次のループを実行
`}`			　　　つまり、３の倍数だけ飛ばしてループを実行する。
`Echo $i;`

#配列

keyとvalueがペアになった値
配列を用いることで、複数の値をまとめて１つの変数で保存することができる。
`$``配列名=array(値１、値２…)`
配列データには先頭から０、１、２…と順に「インデックス番号が割り振られる」
配列データを取り出す際には、＄配列名[インデックス番号]といった手順で取り出す。
配列の末尾に値を追加する際には
`$``配列名[]=値`
既に存在するインデックス番号を[]に指定すると上書き
また、


`$sales = array(
  "taguchi"=>200,
  "fkoji"=>800,
  "dotinstall"=>600,
);`

を`array`を省略して

`$sales = [
  "taguchi"=>200,
  "fkoji"=>800,
  "dotinstall"=>600,
];
var_dump($sales["fkoji"]);`
`$sales["fkoji"]=900`←値の書き換えも可能

こうした書き方もある。

##foreach文
配列、連想配列を行う中で、ループ処理で先頭から順にデータを取り出す。

`$sales = [`
` "taguchi" => 200,
 "fkoji" => 800,
 "dotinstall" => 600,
 ];
 foreach ($sales as $key => $value) {
  echo "($key) $value ";`  ←(taguchi)200 (fkoji)~~~~
 `}
$colors = ["red", "blue", "pink"];
foreach ($colors as $value) {
 echo "$value ";`

##コロン構文

Foeach for while if文で役立つ　省略文
End~で代替
利点はすっきりしていること
Htmlなどで応用しやすい
対応がわかりやすい

```php

<?php
$sales = array(
  "taguchi"=>200,
  "fkoji"=>800,
  "dotinstall"=>600,
);
foreach($sales as $value):
  echo "$value ";
endforeach;`             ←ここ
`?>
<html>
<ul>
  <?php foreach($sales as $value): ?>
    <li><?php echo "$value "; ?> <li>  
  <?php endforeach; ?>
  <ul>
</html>
```

#関数
関数を作るには
Function 関数名(){処理}
()内には関数の初期値を入れることも可能
呼び出しの際
関数名(空白);
だと、初期値が表示される。

関数名は自由につけることができる。

```php

  // 関数helloを定義してください
    function hello(){
    echo 'Hello, world!';
    }
    // 関数helloを呼び出してください
    hello();
    echo '<br>';
    // 関数printRectangleAreaを定義してください
    function printRectangleArea ($height,$width){
      echo $height*$width;
    }
    // 引数を(5, 10)としてprintRectangleAreaを呼び出してください
    printRectangleArea(5,10);
```

##引数と戻り値

関数が口や食道なら、引数はごはん、戻り値はう〇こというイメージらしい。

###引数
変数に渡す値
;区切りでいくらでも登録できるきる
初期値を与えることもできる。初期値は引数が空白だった時。

###戻り値
`echo`の代わりに`return`を入れる。
>`return`はその時点で関数の処理を終了させつつ呼び出しもとに値を返してくれる。

##ローカル変数



関数内で定義した変数は関数内のみで有効

```php

<?php
$lang=”ruby”;` ←同名の変数が関数外で定義されていても、影響を与えない。
`function sayHi($name){
  $lang = "php";`　←ローカル変数
   `echo "hi!.$name from $lang";
}
// sayHi();
sayHi(Tom);
var_dump($lang);←関数外で呼び出してもNULLになる

```
 
##組み込み関数
組み込み関数
最初から用意されている関数
$x = 5.6;

 `// echo ceil($x);` //小数点以下を切り上げる
 `// echo flo($x);  ` //切り捨てる
 `// echo round($x); `//四捨五入
 `// echo rand(1,10); `//乱数生成

 `// $s1 = "hello";`
 `// $s2 = "ねこ";`
` // echo strlen($s1);`
文字数を数える
 `// echo mb_strlen($s2);`
//日本語の文字数を数える
 `// pruntf("%(strlenの代替が%)s - %s - %.3(小数点３桁まで表示の意味)f ", $s1,$s2,$x);`
//書式を指定して値を表示する

`$colors = ["red","blue","pink" ];`
` echo count($colors);`
//要素の数をカウントする→3
 `echo implode("@",$colors);`
//配列の要素をある文字をもって連結する→red@blue@~

#クラスとインスタンス

- クラス…ユーザーに関するデータ構造の定義を、まとめて入れておくもの
	
        
クラスが持つ変数のことをプロパティ　`Ex.$name`
クラスが持つ関数のことをメソッド    `Ex.$sayHi()`
クラスには特殊なメソッドがある
インスタンス化されるときに必ず`constructor`という命令がある

- インスタンス…クラスをもとに実際にデータを持ったオブジェクトのこと

```php

<?php
//user
class User{`        クラス名は一文字は大文字になるようにする
  `//property
  public $name;`
  `//constructor
` `public function __construct($name){ `引数はインスタンスを作るときに渡されるもの(今回は名前)
   `$this->name = $name;`$thisはプロパティやメソッドにアクセスするのに必要なキーワード
 ` }`
 ` //method
  public function sayHi(){
    echo "hi,i am $this->name!";
  }`
`}`↓インスタンス
`$tom = new User("Tom");`←インスタンスを作る際はnewという命令が必須
`$bob = new User("Bob");
echo $tom->name;  //tom
     $bob->sayHi(); //hi! i am bob.
```

##継承とOverRide
親クラスのプロパティ、メソッドを保持したまま新しいクラスを作る。
`class Newname extends User`が定型

`class AdminUser extends User {`           //AdiminUserはUserクラスから生まれているので、子クラス親クラスという
 
```php
　public function sayHello(){
    echo "hello from Admin!";
}
 //override
  public function sayHi(){
    echo "[admin] hi,i am $this->name!";
}
}
```
```php

 class User {
     public $name;
     public function __construct($name){
        $this->name = $name;
     }
     public function sayHi(){←final public functionという表示にすると、Overrideできなくなる。

       echo "hi, i am $this->name!";
     }
   }

   class AdminUser extends User{
     public function sayHello(){
        echo "Hello from Admin";
     }
     public function sayHi(){
       echo "[admin] hi, i am $this->name!";←Override AdminUserがsayHiメソッドを呼び出したら[admin]が追加されている。元のuserクラスとは違う表示になる
     }
```

また、`final`を親クラスの`sayHi()`メソッドにつけた状態だと、子クラスの追加メソッドも呼び出せなかった。もしかしたら、finalを付けた時点で、子クラスのメソッドの追加もできなくなる？

##アクセス権
- Public…外部からどこでもアクセス化。
- Private…変数を宣言したクラス内のみ。
- Protected…変数を宣言したクラスとそれを継承した子クラスから。

##Staticキーワード
インスタンス化しなくても使えるメソッドやプロパティの作成に必要

```php

<?php

   class User {
     public $name;
     public static $count = 0;

     public function __construct($name){←staticではインスタンス化しないので$nameなどのプロパティは使用できない
        $this->name = $name;
        self::$count++;←インスタンス化された数を数えるstaticプロパティ。クラス内から同じクラスを指定するときは`self`という特殊なキーワードを使える。
     }
     public function sayHi(){
       echo "hi, i am $this->name!";
     }
    public static function getMessage(){
       echo "hello from User class!";
    }
   }

   User::getMessage();←staticではダブルコロンよく使う::

   $tom = new User("Tom");
   $bob = new User("Bob");

   echo User::$count;

```

#抽象クラスとインターフェイス

##抽象クラス

イメージ巨大な親クラス。
子クラスを作ることを前提としたクラス。
インスタンス化することはできない。

`abstract`は必ず実装することを約束するキーワード。
`abstract public function sayHi()`とすれば、必ずこのメソッドは、子クラスで実装されていなければならない。実装されていなければエラーになる。アクセス名、引数全て同じであること。

```php

<?php

abstract class BaseUser{
  public $name;
  abstract public function sayHi();
}

class User extends BaseUser{
  public function sayHi(){
    echo "hello from User!";
  }
}
```
##インターフェイス

このクラスではこのメソッドを必ず実装すること

```php

<?php

interface sayHi{
  public function sayHi();←特性上アクセス権は必ずpublic,実装の中身は後々書くのでこの時点では必要ない。
}

interface sayHello{
  public function sayHello();
}
class User implements sayHi,sayHello {←implementsは複数のメソッドを実装できる。,区切り
  public function sayHi(){←もしここで実装されていなかったらエラーが出るので、実装漏れを確認することができる。
    echo "hi!";
  }
  public function sayHello(){
    echo "hello!";
  }
}

```

###抽象クラスとインターフェイスの違い

抽象クラス内では、抽象メソッド以外のメソッドを追加できるが
インターフェイスはできない

抽象クラスでは１つしか継承できないのに対し、
インターフェイスにはそれができる。

#外部ファイルの読み込み
- require…エラーが出た場合その場で処理が終了
- require one…phpが自動的に読み込まれてるか確認
- include…エラーが出ても続行
- include onece
- aoutoload

index.php

```php


<?php

// require "User.class.php";

spl_autoload_register(function($class){
  require $class . ".class.php";
});


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

```
User.class.php

```php
<?php

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

##名前空間

自分が作ったクラス名がほかの人とかぶらないようにする仕組み。
名前空間は階層的に管理できる。
`ex.dotinstall\Lib;`

index.php

```php


<?php

require "User.class.php";

use  Dotinstall\Lib as Lib;　←この設定をすれば、指定が②の長さで済む。別になくてもいい
use Dotinstall\Lib;←これでもいい



①$bob = new  Dotinstall\Lib\User("Bob");←名前空間の指定
②$bob = new Lib\User("Bob");
$bob->sayHi();

```

User.class.php

```php
 
<?php

namespace Dotinstall\Lib; ←名前空間の設定

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

##例外処理

何らかの処理をしていて予期しない処理が発生した時に適切な対応ができるようにしておく

```php

<?php

function div($a , $b){
  try{    例外を発生させたい箇所をtryで囲む
  if($b === 0){　←$bが0だった時は例外
    throw new Exception("cannot drive by 0 !");
  }
  echo $a / $b;
} catch (Exception $e){
echo $e->getMessage();
 }
}

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

```

##Cookieの利用法

アクセスしてきたユーザーのブラウザにデータをセットできる
`setcookie("username", "taguchi");`
次回以降は下記の指示でCookieからデータを呼び出すことができる。
`echo $_COOKIE['username'];`
また、Cookieはブラウザに保存されるので、別のphpファイルからでもCookieの情報を呼び出すことができる。

Cookieには有効期限を決めることができる。

`setcookie("username", "taguchi", time()+60*60);`

何もしなければ、ブラウザを閉じるまで。

また削除する場合は、有効期限を過去に設定すればいい。
`setcookie("username", "taguchi", time()-60*60);`

##セッションについて

Cookieと似ているが、ブラウザにデータを保存するのではなく、サーバー側にデータを保存する。

```php

session_start();　←必須の言葉

$_SESSION['username'] = "taguchi";

echo $_SESSION['username'];

```

削除の際はunset

```php


unset($_SESSION['username']);

echo $_SESSION['username'];

```

##Cookieとセッションの違い

Cookieはブラウザに気軽に保存できる分、サーバー側からいくらでも改竄可能or丸見え
セッションはサーバーに保存できるので、大きなデータを扱える＋上記の弱点がない