PHP学習備忘録1

#はじめに
こんにちは高専生プログラマーのIKKOです。
今回は、PHPの公式サイトから言語の仕様とか使える関数とかを学んだのでそのまとめです。
主にPythonとの違いという見方から話します。
PHPを学んだ理由ですが、TradingViewという株とかのチャートを見るアプリからデータを取得したかったのでついでに学んでみようと言う感じです。
詳しくは下の動画を見てみてください。
https://www.youtube.com/watch?v=YzMp9YdfqhY&t=16s

#PHP
###PHPの書き方
<?php　という文で始めて、?>という文で終わらせる。
```<php
?>
```
webページに表示するときは```echo``` を使う。
また、1つの処理の最後にはセミコロン```;```をつける。
```<?php
echo 'Hello World!';
?>
```
これはHTMLの中に埋め込んで使うこともできる。
```<p><?php echo 'Hello World!';?></p>```
コメントは//と#が使える。
複数行のコメントは/* */を使うことができる。

##基本構文
###型
PHPには主に
- boolean　論理型
- string　文字列
- integer 整数
- floating　浮動小数点数
- array　配列
- iterable　イテラブル
- object　オブジェクト
の型があります。
Pythonとの違いは、型の文字列と数字の型の制限がゆるいことですね。
どういうことかと言うと、
```1 == '1'```
ということが許容されます。
比較演算子については後で詳しくやります。
イテラブルというのもあまり聞き慣れないかもしれませんが、ジェネレータのところで説明します。

###変数
ここもPythonを扱うものからすると違和感がありますが、変数を宣言、使用するときには変数の名前の前に```$```をつけます。macのキーボードで言うと、数字の4の場所にあります。
例）```$ikko = 'ikko';```
変数命名のルールはPythonと同じと考えてもらって大丈夫です。
また、PHPには参照と言う機能がありこれを使うことで２つの変数が同じ値を持つことができます。
意味がわからないと思うので、コードの例を示します。

```php:sansho.php
<?php
$a = 'hello';
$b = &$a;
echo $a; #'hello'
$a = 'world';
echo $b; #world
```

代入する変数の前に```&```をつけることで参照関係にできます。
上の例を見てみると、4行目で変更したのは変数$aなのに、$bをechoしてみると、$の値が変わっていることがわかります。
つまり、２つの変数は必ず同じ値になるのです。
参照関係になければ、２つとも```hello```になります。
また、PHPには型推論があるため、変数の宣言時には型を指定する必要はありません。

###変数の型変換
まず、先程言ったようにPHPには型推論の機能があります。
この機能は変数の中身を変更したときにも作用します。
例えば、下のようなことが成り立ちます。

```php:types.php
<?php
$foo = '1'; #string
$foo = $foo * 2 #integer
$foo = $foo * 1.3 #float
```
さらに、integerと文字列で掛け算したときに、文字列の先頭がintegerの場合先頭の数字をintegerとして掛け算します。

```php:int_str.php
<?php
$foo = 5 * '10 Little Piggies'; #integer(50)
$foo = 5 * '10 Small Pigs'; #integer(50)
```
この動きは使うかわかりませんが、一応覚えときましょう。

また、型を明示的に変換したい場合は下のようになります。

```php:cast.php
<?php
$foo = 10; #integer(10)
$foo = (string) $foo; #string(10)
```
これを型のキャストといいます。
キャストに使える型は以下の通りです。
- (int), (integer) 整数
- (bool), (boolean) 論理型
- (float), (double), (real) 浮動小数点数
- (string) 文字列
- (array) 配列
- (object) オブジェクト
- (binary) バイナリー形式

また、(bool)で変数をキャストした場合、0, '0', array(), '', NULLなどはfalse。
それ以外はtrueが返されます。

###定数
定数とは一度定義すると変更できない値です。
Pythonにはありません。
PHPでの定数の宣言方法は2つあります。

まず一つ目、```define```を使う方法について。
```define("CONSTANT", "Hello world.");```
このように、define関数を使うことで定義できます。
第一引数に定数の名前（ここではCONSTANT）、第二引数に定数の値（ここではHello world.）を与えます。

２つ目は、```const```を使う方法です。
```const CONSTANT = 'Hello World';```
このように定義できます。

これら２つの使い分けはスコープに関係してきます。
```define```の場合はトップレベル（一番最初のスコープ）の中でしか定義できません。つまり、関数、ループ、if文、try/catchの中では宣言できないと言うことです。
逆に、constの場合は、トップレベルでも使えます。
この辺の話がわからない人は、後で出てくるスコープの話を読んでからここに戻ってきてください。

ちなみに、PHP8.0.0以前のバージョンでは、defineで定義された定数名は大文字小文字区別されません。

###配列
PHPの配列はPythonでの配列と辞書の両方の性質を持っています。
以下に例を示します。

```php:array.php
$array1 = array(
    "foo" => "bar",
    "bar" => "foo",
);
#辞書的使用法
$array2 = array(1, 2);
# 配列的使用法

$array3 = [1, 2];
#こうやって省略することもできる。

$array4 = [
    "a" => 1,
     3  => 2,
     "true,
]
#いろんな型を一緒に入れてもいい
```

このように、配列内の型は結構自由です。
また、array2では実際には辞書で言うところのキーが与えられており、正確に書くと
```$array = array(1=>1, 2=>);```
という形になっている。

また、array4を見ると、最後の要素にだけキーが指定されていない。
その場合、最後の整数キーの値に1を足した数がキーに自動的になる。
この場合3+1で4がキーとなり
```4=>"true"```
という形になっている。

###式
PHPでの変数定義時の式の形式について説明します。

```php:test.php
<?php
$b = $a = 5; #5を$aと$bの両方に代入します。$aと$bは参照関係にはありません
$c = $a++; 
/*後置加算といって、$cに$a(5)を代入したあと、$に1を足します。
よって、$aは6、$cは5である。*/
$e = $d = ++$b;
/*前置加算なので、$bに1を足したあと、$bを$dと$eに代入します。
よって、$b、$d、$eはすべて6*/
$f = 10;
$g = $f += 10;
/*$fに10を足したあと、$gに$fを代入します。よって$fと$gは20*/
```

また、三項演算子というのも説明していきたいと思います。
```<? php $first ? $second : $third; ?>```
これは、$firstがtrueの場合は$secondを、flaseの場合は$thirdを代入すると言う式です。

###比較演算子
比較演算子には以下の種類があります。
- == 両辺が等しいかどうかを判定
- === 両辺の値も型も完全に等しいか判定
- !=　両辺が等しくないかどうか判定
- <> 上と同じ
- !==　両辺の値も型も等しくないかどうか判定
- < 左辺が右辺より小さいか判定
- > 左辺が右辺より大きいか判定
- <= 左辺が右辺以下か判定
- >= 左辺が右辺以上か判定
- <=> 左辺-右辺のint

```php:enzan.php
<?php
echo 1 <=> 1; //0
echo 1 <=> 2; //-1
echo 2 <=> 1; //1

echo 1 == '1'; //true
echo 1 === '1'; //false

echo 1 != '1'; //false
echo 1 <> '1'; //false
echo 1 !== '1'; //true

echo 1 < 1; //false
echo 1 > '0'; //true

echo 1 <= 1; //true
echo 1 >= '2'; //false
```

##制御構造
###if文
if文はだいたいPythonと同じように扱えます。
構文としては以下のとおりです。

```php:if.php
<?php
$a = 5;
$b = 4;
if ($a > $b) {
    echo "aはbより大きい ";
    $b = $a;
}
echo $b
#aはbより大きい 5
```
###else
else文もPythonとほぼ変わりありません。

```php:else.php
<?php
$a = 3;
$b = 4;
if ($a > $b) {
    echo "aはbより大きい";
} else {
    echo "aはbより小さい";
}
#aはbより小さい
```

###elseif

```php:elseif.php
<?php
$a = 5;
$b = 5;
if ($a > $b) {
    echo "aはbより大きい";
} elseif ($a == $b) {
    echo "aはbと等しい";
} else {
    echo "aはbより小さい";
}
# aとbは等しい
```

###while, do_while
whileは式の値がtrueである限り実行します。
do-whileは1回は必ず実行するwhileです。

```php:while.php
<?php
$i = 1;
while ($i <= 10) {
    echo $i++;
#12345678910
$i = 0;
do {
    echo $i;
} while ($i > 0);
#0
```

###for

```php:for.php
<?php
for ($i = 1; $i <= 10; $i++) {
    echo $i;
}
#12345678910

for ($i = 1; ; $i++) {
    if ($i >  10) {
        break;
    }
    echo $i;
}
#12345678910

$i = 1;
for (; ; ) {
    if ($ > 10) {
         break;
    }
    echo $i;
    $i++;
}

for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
#12345678910
```
これらはすべて同じ結果を出力します。
Pythonでは見かけない形なので、for横のカッコの中について解説します。

まず、カッコの中の1つめの```;```までは、for内で使う変数の初期値を設定できます。これは、最後のfor文であるように何個でも設定できます。
次に、２つ目の```;```まではfor文を出る条件を設定します。この例では$iが10より大きくなるまでループしてますね。
最後はループ中の処理について書きます。この例ではループごとに$iに1を足しています。そのため、ループごとに$iの値が1増えていき、11でbreakしてます。


また、PHPのfor文はPythonのように配列を横断的に処理することはできません。
それをしたかったら、つぎのforeachを使います。

###foreach
foreachはPythonのfor分のような働きをします。

```php:foreach.php
<?php
$a = array(1,2,3,17);

foreach ($a as $v) {
    echo "$v ";
}
#1 2 3 17
```

また、キーと値の２つの値を扱うこともできる。

```php:foreach2.php
<?php
$a = array(
     "one" => 1,
     "two" => 2,
     "three" => 3,
     "seventeen" => 17
);

foreach ($a as $k => $v) {
    echo "\$a[$k] => $v .\n";
}
/*
a["one"] => 1
a["two"] => 2
a["three"] => 3
a["seventeen"] => 17
*/
```

###break
breakはpythonでもあったようにループから抜け出します。
しかし、Pythonと違うのはループをいくつ抜けるのかを指定できます。
デフォルトは1です。

```php:break.php
$i = 0;
while (++$i) {
    switch ($i) {
        case 5:
            echo "At 5<br /> \n";
            break 1;
        case 10:
            echo "At 10; quitting<br />\n";
            break 2;
        default:
            break;
    }
}
/*At 5
At10; quitting
*/
```

###continue
continueは残りの処理をスキップしてループを継続します。
これもどこまでスキップするのか指定できます。
デフォルトは1です。

```php:continue.php
$i = 0;

while ($i++ < 5) {
    echo "Outer<br />\n";
    while (1) {
        echo "Middle<br />\n";
        while (1) {
            echo "Inner<br />\n";
            continue 3;
        }
        echo "This never gets output.<br />\n";
    }
    echo "Neither does this.<br />\n";
}
/*Outer
Middle
Inner
Outer
Middle
Inner
Outer
Middle
Inner
Outer
Middle
Inner
Outer
Middle
Inner
*/
```

###switch
switch文はいろんな条件で条件分岐したいときに使う構文です。
また、breakがなければその下の条件の

```php:switch.php
<?php

$i = 'apple'

switch ($i) {
    case "apple":
        echo "i is apple";
        break;
    case "bar":
        echo "i is bar";
        break;
    case "cake":
        echo "i is cake";
        break;
}
//i is apple
?>
```
長くなるので次からの投稿で関数,クラス,名前空間,ジェネレータ,例外について解説します。