엄범


문자열

PHP는 기본적으로 문자열을 이루는 각 문자를 `` 1 byte``로 간주한다.

멀티바이트 문자를 다룰 때도 이를 `` 1 byte`` 단위로 다루기 때문에 오류를 방지하기 위해 ``php mb`` prefix가 붙은 함수를 사용해야 한다.

`` mb`` 함수는 기본으로 설치되지 않기 때문에 undefined function Error가 발생할 수 있다.

``bash apt-get install php-mbstring``해주고 아파치 재시작해주면 된다.


좋은 문법

``php echo``가 ``php print``보다 아주 약간 빠르다.

`` .``으로 잇는 것 보다 그냥 `` ,``으로 출력하는게 더 빠르다.

```php

echo 'Hello', ' ', 'World';``

// is better than    

echo 'Hello' . ' ' . 'World';

```

단순히 출력해서 확인하려는 목적이면 ``var_dump``보다 ``print_r``이 더 낫다. 전자는 저장할 때.


문자열 연결

``php .``과 ``php .=``를 사용한다.
```php
<?PHP
$con_str = "str1" . "str2";
$result .= con_str . "str3";
print $result;
?>
```

문자열 내부에 변수 포함시키기

문자열 내부에 `` $variable``이 들어있으면 변수 값이 자동으로 대입된다. `` ""``로 묶어야지만 동작한다.
이를 이용하면 문자열을 결합하거나, 포맷 스트링을 사용하지 않아도 되서 편하다.
```php
$inner_hello = "[I'M IN!!!]";
$hello = "Hello world from $inner_hello <br>";
```
Note ) 배열을 포함할 때는`` {}``로 묶어준다. ``php {$_GET['user']}``
Note ) 문자열 결합보다 속도가 꽤 느리기 때문에, 그냥 문자열 결합을 사용하는게 좋을 때가 있다.

``php $var``가 값으로 바인딩되는 것은 직접 `` ""``를 사용했을 경우에만, 변수 선언 시점에 일어나는 것 같다.

그래서 client 측에서 `` $var``를 포함한 문자열을 전송하거나, DB에서 꺼낸 문자열 데이터가 `` $var``를 포함하고 있어도 이를 값으로 바인딩하지 않고 `` $var``라는 문자로 인식한다.

``php <?= $var?>``도 마찬가지다.


""와 ''의 차이

`` ""``는 문자열 내부의 개행 문자나 변수를 파싱해 의미론적으로 해석하지만

`` ''``는 파싱하지 않고 그대로 출력한다.

```php

"a\r\nb"    // a b

'a\r\nb'    // a\r\nb


$inner = "IN";

"test $inner"     // test IN

'test $inner'     // test $inner

```


배열

```php
$foo = ['a', 'b', 'c'];
$foo[] = 'd';
```

배열의 원소를 변수에 한꺼번에 할당하기

```php
list($var1, $var2, $var3) = $arr;
```

join ( == implode ) 배열 → 문자열 결합

배열의 원소들을 모두 합쳐 하나의 문자열로 만들 때 반복 돌릴 필요 없이 사용할 수 있다.
```php
$arr = ['a', 'b', 'c'];
$joined = join("와 ", $arr);
print $joined;    //a와 b와 c
```

explode 문자열 → 배열 분할

``implode``와 반대로 문자열을 구분자를 이용해 배열로 분할하는데 사용한다.
```php
$exploded = explode("와 ", $joined);    // [a, b, c]
$str_splited = str_split($joined);    // [a, �, �, �, , b, ... ]
$preg_splited = preg_split('//u', $joined);    // [a, 와, , b, ... ]
```
``explode``는 구분 문자에 ``""``와 같이 빈 문자열을 할당할 수 없다.
``str_split``은 bytes 단위로 쪼개기 때문에 multi-byte encoded string은 이런식으로 깨져 나오게 된다. UTF-8이기 때문에 3 bytes라서 3개로 쪼개졌다.
``preg_split``이 bytes 단위가 아니라 multi-byte encoded string을 인식하도록 하려면 반드시 ``u`` flag를 주어야 한다. 그리고 정규표현식이라 당연히 위 두 함수보다 속도가 느리다.


연관 배열

``:``대신 ``php =>``를 사용한다.
```php
$associative["key1"] = v1;
$associative2 = ["key1" => v1, "key2" => v2];
```


extract()

``php extract()``함수는 배열 내부의 '키=값' 쌍을 그대로 변수화 시켜주는 함수다.

``php extract($_GET);`` 하면 위 예제에서는 `` user=default_value``를 선언한 것과 동일한 효과가 있어 `` $_GET[user]``가 아니라 `` $user``로 접근 가능하다


foreach

배열 순회 시 내부 포인터가 이동한다. ``php foreach``는 자동으로 포인터 위치를 초기화하지만,
다른 경우 수동으로 초기화해야 할 수도 있다. ``php reset($arr);``
```php
foreach($array as $value){
    print $value;
}
```
enumerate 같이 key와 value가 모두 필요한 경우는
```php
foreach($arr as $key => $value){
    print $key." : ".$value."</br>";
}
```