웹 개발 분야에서, 서버 사이드 스크립트계 메이저 4대장을 꼽아보자면, 보통은 PHP, ASP, JSP, Node.js, 요렇게 넷이 자주 나올 것입니다. 다 각자의 특색이 있는 놈들일 터인데, 안타깝게도 현재 스크립트들 간 위상은 꽤나 차별이 있는 게 현실이지요. 저 넷 중, 우리나라에서 가장 많이 쓰이고 있는 것은 JSP(를 끼얹은 Spring)이요, 가장 핫한 것은 Node.js라. ASP는 Microsoft가 주구장창 밀어줬는데도 뭔가 언급할 때마다 슬퍼지는 느낌.
그리고 PHP. 많은 사람들에게 이미 한 청동기 시대쯤의 유물 정도로 인식되어버린 언어입니다(왜냐면 제가 그렇게 생각했거든요). 웹 상에 남아있는 과거 유물을 출토하다 보면, 딱 봐도 옛날스러운 디자인과 함께 널부러진 PHP 페이지들이 남아있는 것을 간간히 볼 수 있습니다.
저 뿐만 아니라, 커뮤니티를 둘러보면 같은 생각을 하신 분을 찾기는 그다지 어렵지 않다고 느낍니다. 그러나 이렇게까지 모두의 기대치를 낮췄기 때문인지, 사실 조금만 관심을 갖고 둘러보면, PHP가 생각보다 꽤 눈부신 언어라고 느끼긴 그다지 어렵지 않을 듯합니다. PHP는 성능이나 설계 측면에서 계속해서 발전해 왔습니다. 버전 업을 거듭하면서 객체 지향 프로그래밍을 제대로 지원하게 되었을 뿐만 아니라, PHP로 만들어진 웹 서비스가 전 세계에서 몰려드는 트래픽을 받아내고도 쌩쌩 돌아가는 사례도 찾아볼 수 있죠(대표적으로 폰허...하여튼 그런 사례가 있답니다). Laravel과 CodeIgniter 같은 잘 짜여진 Framework 덕택에, PHP로 모던하고 세련된 웹 서비스를 만들 수도 있게 되었고요. 그저 지나치며 무시하기에는, 꽤나 정교하게 갈고닦아진 언어가 되었달까.
이 글을 쓴 목적은, 이미 타 언어에 어느 정도 익숙해진 상황에서, 한 눈에 딱 순식간에 휘리릭챡챡 PHP라는 언어를 습득할 수 있도록 기본 문법을 정리하기 위해서입니다. 그래서 PHP의 모든 걸 세세하게 늘어놓는 게 아니라, 타 언어와 비교해서 동일한 부분은 과감히 제끼고, PHP만의 문법적 특성만 정리해놓고자 이 글을 작성하였습니다. 특히 JavaScript와의 비교가 주가 되겠네요. 굳이 JavaScript인 이유는... 제가 익숙하니까. 일단은 제가 보려고 쓰는 글이라서. 근데 여러분(누가 보는 사람이 있긴 하다면)도 익숙할 것 같아서. 아무튼. 프로그래밍을 처음 접하는 사람이 언어를 배우는 데는 꽤 시간이 걸리지만, 일단 하나를 충분히 능숙하게 배워놓으면 두 번째, 세 번째 언어를 배우는 데는 그리 오랜 시간이 걸리지 않습니다. 언어를 배우면서 프로그래밍이라는 틀이 잡히는 것도 있겠지만, 대다수의 메이저 언어들이 C-like syntax를 가졌기 때문이 아닐까요.
길게 뭐 주절주절 썼지만 사실 저도 뭣도 모르는 X뉴비입니다. 이제 막 PHP를 배우기 시작하면서, 배운 내용 정리 겸 블로그에 뭐 좀 채워넣는 목적 겸 해서 기록하는 바입니다. 그래도 서문이 길어야 뭔가 있어보이잖아요?
이 글은 W3Schools의 내용을 참고하여 정리한 것입니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hello World</title>
</head>
<body>
<?php
echo "Hello World!";
?>
</body>
</html>
PHP는 서버 사이드 스크립팅 언어입니다. HTML 코드 내에 <?php
...code... ?>
형식으로 코드를 삽입하면 됩니다.
파일은 .php 확장자를 가집니다. php가 설치된 서버(or 웹 호스팅)라면, 단지 php 파일을 딱 갖다놓는 것만으로도 컴파일이나 별다른 과정 없이 실행이 가능합니다(서버가 알아서 다 해줍니다).
<?php
$str = "안녕 세계";
$num1 = 5;
$num2 = 10.5;
?>
변수 선언은 변수명 앞에 $를 붙입니다. $var_name
처럼요.
PHP는 느슨한 자료형을 사용합니다. JS에서의 let(또는 var)과 같이, 따로 string이나 int 등을 지정하지 않는다는 뜻입니다.
자료형은 다음과 같습니다. 뭐 설명이 필요할까요.
변수명 규칙도 타 언어와 거의 동일합니다. 대소문자 구분하고, 첫 글자로 숫자가 올 수 없습니다.
$num = "1";
var_dump($num); // string(1) "1"
var_dump()
함수를 통해, 변수의 자료형과 값을 확인할 수 있습니다.
$str1 = "Kim";
echo "Hi ".$str1; // "Hi Kim" 출력
echo "Hi $str1"; // 요것도 "Hi Kim" 출력
Echo는 JS의 document.write()
와 같은 기능을 하는 선언문입니다(같을 거에요. 아마도요). 함수는 아니지만, 함수처럼 echo()의 형태로도 사용은 가능합니다. 문자열 내에 html 태그가 있다면 적용됩니다.
문자열을 이을 때, JS나 Java에서는 '+' 연산자를 이용하지만, PHP에서는 '.'를 이용합니다.
Echo와 동일한 기능을 하는 Print라는 선언문도 있습니다(엄밀히는 살짝 다름). 그냥 있다는 것만 알아두는 걸로.
Not A Number라는 뜻. JS에서도 종종 보이는 그거입니다. is_nan()으로 변수가 숫자 자료형(int or float)인지 확인할 수 있으며, is_numeric()으로 변수 값이 숫자인지 확인할 수 있습니다.
타입 캐스팅도 지원합니다. float 또는 string(숫자로 된 문자열이라면)을 int로 casting할 수 있습니다.
<?php
// Cast float to int
$x = 23465.768;
$int_cast = (int)$x;
echo $int_cast; // 23456
// Cast string to int
$x = "23465.768";
$int_cast = (int)$x;
echo $int_cast; // 23456
?>
array()
로 선언합니다. 어디에나 있는 그 배열입니다. 세 가지 유형이 있습니다.
우리가 아는 그 배열입니다.
$arr1 = array("하나", "둘", "셋")
echo $arr1[1]; // "둘" 출력
첫번째 요소가 0부터 시작한다는 것까지 똑같습니다.
Key-Value 쌍을 가진 배열입니다.
$arr2 = array("yellow" => "banana", "red" => "apple");
echo $arr2['red']; // "apple" 출력
JS에서는 Object, Java에선 HashMap, C#에선 Dictionary라 부르는 그거. 한 쌍을 "Key" => "Value"
와 같이 표기하네요.
배열 안에 배열이 있는, 다차원 배열입니다. $arr[3][4]
같은 그거요.
PHP의 변수 Scope에는 세 가지가 있습니다.
PHP의 Global scope는 타 언어와는 조금 다르게 적용되는데, 전역 변수는 전역으로만 사용이 가능합니다. 그러니까, 함수 내에서는 사용할 수 없습니다.
// global var
$x = 2;
function scopeTest() {
echo "변수 x의 값: $x"
}
scopeTest() // "변수 x의 값: " 출력
$x라는 변수를 전역global으로 선언하고, 이 전역 변수를 갖다쓰는 함수를 만들었습니다. 그런데 echo
로 x의 값이 출력되지 않습니다.
전역 변수를 굳이 함수 내부로 끌고 들어와야만 하겠다면, global
키워드를 이용합니다.
// global var
$x = 2;
function scopeTest() {
global $x;
echo "변수 x의 값: $x"
}
scopeTest() // "변수 x의 값: 2" 출력
함수 내부에서 따로 전역 변수를 끌고 오겠다는 표시를 해 주면, 문제없이 사용이 가능합니다. 또는 따로 global 키워드를 안 쓰더라도, 아래와 같은 방법이 있습니다.
// global var
$x = 2;
function scopeTest() {
echo "변수 x의 값: $GLOBALS['x']"
}
scopeTest() // "변수 x의 값: 2" 출력
지역local 변수는 함수 내부에서 선언되었기 때문에 선언된 함수에서만 사용 가능하며, 함수 실행이 끝나고 나면 내부에 있던 값은 증발합니다. 하지만 static
키워드를 이용하면, 함수 실행이 종료되더라도 변수 값을 보존할 수 있습니다.
function staticTest() {
static $x = 0;
$x++;
echo $x;
}
staticTest(); // 1
staticTest(); // 2
staticTest(); // 3
음... '초'전역변수? Scope에 영향받지 않고, 어디서든 접근할 수 있는 변수가 있습니다.
Associative Array
JS, 또는 타 언어의 연산자가 대부분 그대로 쓰인다고 보시면 됩니다. 비교연산자, 대입연산자, 전/후위 증감연산자, 논리연산자, 무슨연산자 등등... 여기선 몇 가지 알아둬야 할, PHP만 다른 부분만 짚을게요.
JavaScript의 그것과 같습니다. ==(!=)는 변수의 값만 비교하고, ===(!==)는 값과 동시에 자료형의 일치 여부까지 확인합니다.
자료형이 배열Array이라면, ==(!=)는 배열 내 요소의 값만 비교하고, ===(!==)는 요소의 배열 순서와 자료형까지 확인합니다.
문자열 간 연결에는 '+'가 아닌 '.'을 씁니다. 위에서도 언급했습니다.
$str1 = 'Hello'
$str2 = ' world!'
$str1 .= $str2;
echo $str1; // 'Hello world!' 출력
연결뿐 아니라, '.='를 이용해 연결 대입이 가능합니다. '+='를 생각해보세요.
배열끼리 조합하는 데 +를 쓸 수 있습니다(union).
PHP 7부터 도입된 비교 연산자입니다. <=도 >=도 아닌 요상한 모양인데, 우주선같이 생겼다고 Spaceship이라 부릅니다. 다음 값을 return합니다.
타 언어와 완전히 같습니다. 사실 완전히는 아니고, else if를 elseif
라고 붙입니다. 그거 빼곤 뭐.
타 언어와 완전히 같습니다. case
, default
, break
등등.
타 언어와 완전히 같습니다. 슬슬 쓰기 귀찮다.
array를 순회하는 반복문입니다.
foreach ($array as $value) { ... }
array가 단순 value만 가진 경우.
foreach ($array as $key => $value) { ... }
array 내의 값이 key => value로 이루어진 경우.
define(name, value, case-insensitive)
로 선언 가능합니다. C의 #DEFINE과 비슷하네요.
<?php
define("KIM", "Dorco Kim");
echo KIM; // 'Dorco Kim' 출력
?>
JavaScript의 그 function입니다. 사용법 똑같습니다.
TypeScript를 써 보신 분이라면 더 익숙할 부분으로, 자료형을 직접 설정할 수 있습니다. php 블록을 설정할 때 declare(strict_types=1);
를 설정해주시면 됩니다.
<?php declare(strict_types=1); // strict requirement
// float형 param을 둘 받아, float로 return
function addFloats(float $a, float $b) : float {
return $a + $b;
}
echo addFloats(1.2, 5.2); // 6.4
?>
기본 문법은 여기까지. 대강 정리는 했는데, 많이 너저분하기도 하고 그렇네요.
아직 꽤 많이 남긴 했습니다. OOP, 파일 입출력, AJAX, 등등등...... 정리를 하게 되면 다음 글에 올리겠습니다. 물론 안 올릴 수도 있습니다.
대박 정리 감사합니다
js 공부하다가 php로 작업해야 할 일이 생겼는데 이해가 쏙쏙 되네요!