매우 대강 훑고 지나가는 PHP - #basic

Heegeon Lee·2020년 1월 13일
1

서문

웹 개발 분야에서, 서버 사이드 스크립트계 메이저 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의 내용을 참고하여 정리한 것입니다.

BASIC

Hello World!

<!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 등을 지정하지 않는다는 뜻입니다.

자료형은 다음과 같습니다. 뭐 설명이 필요할까요.

  • string
  • integer
  • float
  • boolean
  • array
  • object
  • NULL
  • resource: 함수나 PHP 외부 자원에 대한 reference입니다. 그냥 그런 게 있습니다.

변수명 규칙도 타 언어와 거의 동일합니다. 대소문자 구분하고, 첫 글자로 숫자가 올 수 없습니다.

$num = "1";
var_dump($num);				// string(1) "1"

var_dump() 함수를 통해, 변수의 자료형과 값을 확인할 수 있습니다.

Echo

$str1 = "Kim";
echo "Hi ".$str1;		// "Hi Kim" 출력
echo "Hi $str1";		// 요것도 "Hi Kim" 출력

Echo는 JS의 document.write()와 같은 기능을 하는 선언문입니다(같을 거에요. 아마도요). 함수는 아니지만, 함수처럼 echo()의 형태로도 사용은 가능합니다. 문자열 내에 html 태그가 있다면 적용됩니다.

문자열을 이을 때, JS나 Java에서는 '+' 연산자를 이용하지만, PHP에서는 '.'를 이용합니다.

Echo와 동일한 기능을 하는 Print라는 선언문도 있습니다(엄밀히는 살짝 다름). 그냥 있다는 것만 알아두는 걸로.

Numbers

NaN

Not A Number라는 뜻. JS에서도 종종 보이는 그거입니다. is_nan()으로 변수가 숫자 자료형(int or float)인지 확인할 수 있으며, is_numeric()으로 변수 값이 숫자인지 확인할 수 있습니다.

Type casting

타입 캐스팅도 지원합니다. 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()로 선언합니다. 어디에나 있는 그 배열입니다. 세 가지 유형이 있습니다.

Indexed Arrays

우리가 아는 그 배열입니다.

$arr1 = array("하나", "둘", "셋")
echo $arr1[1];			// "둘" 출력

첫번째 요소가 0부터 시작한다는 것까지 똑같습니다.

Associative Arrays

Key-Value 쌍을 가진 배열입니다.

$arr2 = array("yellow" => "banana", "red" => "apple");
echo $arr2['red'];		// "apple" 출력

JS에서는 Object, Java에선 HashMap, C#에선 Dictionary라 부르는 그거. 한 쌍을 "Key" => "Value"와 같이 표기하네요.

Multidimensional Arrays

배열 안에 배열이 있는, 다차원 배열입니다. $arr[3][4] 같은 그거요.

Scope

PHP의 변수 Scope에는 세 가지가 있습니다.

  • global: 함수 외부에 선언된, 딱히 어느 함수에도 속하지 않은 변수
  • local: 함수 내부에 선언된 변수
  • static

전역Global

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

지역local 변수는 함수 내부에서 선언되었기 때문에 선언된 함수에서만 사용 가능하며, 함수 실행이 끝나고 나면 내부에 있던 값은 증발합니다. 하지만 static 키워드를 이용하면, 함수 실행이 종료되더라도 변수 값을 보존할 수 있습니다.

function staticTest() {
    static $x = 0;
    $x++;
    echo $x;
}

staticTest();			// 1
staticTest();			// 2
staticTest();			// 3

Superglobals

음... '초'전역변수? Scope에 영향받지 않고, 어디서든 접근할 수 있는 변수가 있습니다.

  • $GLOBALS: global scope 참고.
  • $_SERVER: server나 user 등의 정보를 담고 있는 배열Associative Array
  • $_REQUEST: HTTP 요청 정보를 담고 있는 변수
  • $_POST: request 중, POST 요청에 대한 정보만을 가집니다.
  • $_GET: request 중, GET 요청에 대한 정보만을 가집니다.
  • $_FILES
  • $_ENV
  • $_COOKIES: 쿠키.
  • $_SESSION: 세션.

연산자

JS, 또는 타 언어의 연산자가 대부분 그대로 쓰인다고 보시면 됩니다. 비교연산자, 대입연산자, 전/후위 증감연산자, 논리연산자, 무슨연산자 등등... 여기선 몇 가지 알아둬야 할, PHP만 다른 부분만 짚을게요.

==, === / !=, !==

JavaScript의 그것과 같습니다. ==(!=)는 변수의 값만 비교하고, ===(!==)는 값과 동시에 자료형의 일치 여부까지 확인합니다.

자료형이 배열Array이라면, ==(!=)는 배열 내 요소의 값만 비교하고, ===(!==)는 요소의 배열 순서와 자료형까지 확인합니다.

'+', '.'

문자열 간 연결에는 '+'가 아닌 '.'을 씁니다. 위에서도 언급했습니다.

$str1 = 'Hello'
$str2 = ' world!'
$str1 .= $str2;
echo $str1;				// 'Hello world!' 출력

연결뿐 아니라, '.='를 이용해 연결 대입이 가능합니다. '+='를 생각해보세요.

배열끼리 조합하는 데 +를 쓸 수 있습니다(union).

<=>

PHP 7부터 도입된 비교 연산자입니다. <=도 >=도 아닌 요상한 모양인데, 우주선같이 생겼다고 Spaceship이라 부릅니다. 다음 값을 return합니다.

  • 좌변이 우변보다 작음: -1
  • 좌변이 우변보다 큼: 1
  • 좌변과 우변이 같음: 0

조건문

if / elseif / else

타 언어와 완전히 같습니다. 사실 완전히는 아니고, else if를 elseif라고 붙입니다. 그거 빼곤 뭐.

switch

타 언어와 완전히 같습니다. case, default, break 등등.

반복문

for / while / do-while

타 언어와 완전히 같습니다. 슬슬 쓰기 귀찮다.

foreach

array를 순회하는 반복문입니다.

  • foreach ($array as $value) { ... }
    array가 단순 value만 가진 경우.

  • foreach ($array as $key => $value) { ... }
    array 내의 값이 key => value로 이루어진 경우.

상수

define(name, value, case-insensitive)로 선언 가능합니다. C의 #DEFINE과 비슷하네요.

  • name: 상수 이름
  • value: 상수 값
  • case-insensitive: 대/소문자 체크 여부(기본값 false: 대/소문자 구분함)
<?php
	define("KIM", "Dorco Kim");
	echo KIM;			// 'Dorco Kim' 출력
?>

Functions

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, 등등등...... 정리를 하게 되면 다음 글에 올리겠습니다. 물론 안 올릴 수도 있습니다.

profile
Java/JS Developer, Bachelor of Financial Engineering

2개의 댓글

comment-user-thumbnail
2020년 1월 28일

대박 정리 감사합니다
js 공부하다가 php로 작업해야 할 일이 생겼는데 이해가 쏙쏙 되네요!

답글 달기
comment-user-thumbnail
2020년 3월 2일

진짜 핵심만 정리 잘 하셨네요
감사합니다^^

답글 달기