본문 바로가기

Web Development/PHP

[PHP] [변수의 종류와 외부로부터의 변수],[변수의 범위와 상수] [연산자]


미리 정의된 변수

변수에는 우리가 만들어 사용할 수 있는 변수와 미리 정의되어진 변수가 있습니다.
우선 미리 정의된 변수는 서버 종류, 버전 등이나 기타 환경에 따라 변하는 변수들입니다.
따라서 미리 정의되어진 변수는 우리가 수정할수 없으면 출력(읽기만 가능)만 가능합니다.

미리 정의되어진 변수는 phpinfo()라는 변수로 확인가능합니다.

php의 환경 설정 내용 보는 함수 phpinfo()

<?

 echo phpinfo();

?>

페이지간 넘어오는 변수

이제부터 좀 어려워요^^

웹은 무수히 많은 페이지로 나누어져 있습니다.
이런 페이지간에는 이동시에 값을 넘겨 줌으로써 다음페이지에서 연산및 실행을 하여 사용자에게 다른 페이지를 보여줍니다. 즉 동적페이지를 보여 줍니다.
이때 PHP에서는 넘겨준 값을 받기위해서 아래의 2가지 문법을 사용합니다.

 

$_GET[]    -  HTTP GET 방식으로 넘어온 변수
form태그의 method가 get인 경우에 포함된 값들은 모두 위의 변수로 받습니다.

 

$_POST[]  -  HTTP POST 방식으로 넘어온 변수

form태그의 method가 post인 경우에 포함된 값들은 모두 위의 변수로 받습니다.

 

※ $_POST[]와 $_GET[] 는 대소문자 가립니다.

 

변수 받기 예제 0

index.php파일소스

당신의 나이는 몇살입니까?
<form action="index3.php" method="get">
나이 : <input type="text" name="value1">
<input type="submit" value="전송">
</form>

index3.php파일 소스

<?
 echo "당신의 나이는  : " . $_GET["value1"] . "입니다.";

 echo "당신의 나이는  : " . $_POST["value1"] . "입니다."
?>

변수 받기 예제 1

index.php파일 소스

값을 전달합니다.
<form action="index3.php" method="post">
x : <input type="text" name="value1">
y : <input type="text" name="value2">
<input type="submit" value="전송">
</form>

index3.php파일 소스

<?
 echo "x의 값은 : " . $_POST["value1"];
 echo "<br>";
 echo "y의 값은 : " . $_POST["value2"];
 echo "<br>";
 echo "x의 값은 : " . $value1;
 echo "<br>";
 echo "y의 값은 : " . $value2;
 echo "<br>";
 echo "X와 y의 합은 : " . ($value1 + $value2);
?>

index.php에서 post방식으로 값을 index3.php에 보냅니다.

반드시 index.php에서는 form태그안에 보낼 값의 필드를 정의해두며
index3.php에서는 해당 필드의 name값에 $을 붙여서 값을 전달 받을수 있습니다.

정식 문법으로 받으려면 $_POST["$변수명"]을 사용하지만 $변수명 만써도 사용 가능합니다. 

 

여기서잠깐

위의 소스에서 $_POST["$변수명"] 대신 $변수명으로 받을수 있는건
PHP 설정파일중 다음의 사항이 register_globals 이 On인 상태에서만 작동합니다.
지금한번 현재 사용하고 있는 PHP의 환경설정 내용을 확인해봅시다.

 

변수 받기 예제 2

 

<form action="<? echo $PHP_SELF ?>" method=post>
<input name=info>
<input type=submit value=보내기>
</form>
<? echo "폼을 이용해 전송된 값 : $info "; ?>

 

소스는 폼에 임의의 값을 입력받아 자신의 파일($PHP_SELF)로 그 정보를 넘기는 프로그램입니다.

자 그럼 abc라는 값을 보내 보겠습니다.

위에서 폼의 action(정보를 보낼 문서 경로 지정)에 $PHP_SELF를
썼기 때문에 자기 자신 파일로 정보(abc)를 보내게 됩니다.
$PHP_SELF 는 미리 정의된 변수로 자신의 파일명을 나타냅니다.

첫 번째 그림에서 없던 abc라는 값이 출력되었습니다.
abc라는 값은 위의 소스에서 info라는 이름의 input 박스를 통해 넘어온 값입니다.
이 값은 $info 라는 변수에 자동 저장되므로 $info 변수를 통해서 이 값을 출력했습니다.

 

변수 받기 예제 3

 

<form action=<?=$PHP_SELF?> method=post>
<input name="a" type="text">
<input name="b" type="text">
<input type=submit value=send>
</form>
<?
$sum = $a + $b ;
echo "폼을 이용해 전송된 값 : $a + $b = $sum ";
?>

 

form action에 자신의 파일명인 $PHP_SELF을 넣어서 자신을 다시 호출합니다.

이때 text필드인 a,b를 보내게 되며 자신을 호출한 파일에서 a,b를 $a,$b로 받아 연산을 하여 출력합니다.

 

일반적인 변수 ( 프로그래머가 임의적으로 만들어 쓰는 변수 )

 

변수는 앞서 말씀드렸듯이 $ 표시를 시작으로 일정의 문자열을 덧붙여 만듭니다.
그런데 달러 표시 다음에 붙는 문자열에는 아무 문자나 올수 있는게 아니라 일정의 규칙을 위반하지 않아야만 변수로 이용할 수 있습니다.

 

변수 생성 규칙

1. 영문 소, 대문자 , 숫자 그리고 _ (밑줄)로 이루어 집니다.

(이 이외의 문자(특수문자)를 포함하면 에러가 나게 됩니다.)
2. 변수는 반드시 $로 시작합니다..
3. 식별자의 첫 문자는 숫자가 올 수 없으며 대소문자와 특수문자 '_'만 올수 있습니다.

 

여기서 잠깐

PHP는 Unicode 변수를 허용하므로 한글 변수명도 사용가능합니다.
$변수 처럼말이죠. 그래도 영문변수명을 쓰는 버릇을 들이세요 ^^

 

허용가능한 변수명과 불가능한 변수명의 예를 비교해 보겠습니다.

허용 : babo , php4 , linux_apache_php_MySQL
불허 : babo? , 4php , linux-apache-php-MySQL

 

변수 출력 예제

<?
$a = 1
;
$b = 2
;
$sum = $a + $b 
;

echo "$a + $b = $sum"
;
?>

 

변수 $a 값과 $b 값을 더해서(+) $sum 변수값에 대입하고 출력하는 소스입니다.

 

여기서 잠깐
미리 정의된 변수와 똑같은 이름의 변수를 만들어 쓰지 않도록 유의하시기 바랍니다.

 

수퍼 전역변수

 

$_COOKIE    HTTP 쿠키 변수
$_FILES      업로드시 파일 정보 변수
$_SESSION  세션 변수
$_SERVER   웹서버와 PHP 환경에서의 환경 설정 변수

 

위의 전역변수는 그냥 봐두세요 나중에 공부할겁니다.

변수의 사용 범위

 

변수에는 지역변수라느니 전역변수라느니 하는 것들이 있습니다.
말 그대로 지역변수는 어떠한 일부분 영역(보통 함수)에서만 적용되는 변수이고
전역변수는 모든 함수와 어느 영역이는 사용가능한 변수입니다.

지역구와 전국구에 비교할 수 있죠. 목포의 회칼(준식)이 지역구라면 종로의 쌍칼(윤정)은 전국구입니다.
회칼(준식)이 서울로 상경해서 "나 회칼(준식)이야~" 라고 한들 누가 알아줄까요?
하지만 전국구인 쌍칼(윤정)은 목포가서 "나 쌍칼(윤정)이다" 라고 하면 다들 벌벌 떨것입니다.

 

global 키워드

 

그런데 전국구 쌍칼(윤정)이 부산에 가서 "나 쌍칼(윤정)이다" 라고 했는데
거짓말 하지 말라며 되려 화를 냅니다. 왜 그런가 했더니 부산에도 쌍칼(윤정2)이 있었던 거죠.
부산의 쌍칼 얼굴을 아는데 자기가 쌍칼이라 그러니까 거짓말을 한다고 생각한 것입니다.
또 어느날은 대구로 가서 "나 쌍칼이다"라고 했는데, "쌍칼이 누군데?" 하며 자신을 몰라줍니다.
황당한 경험을 한 쌍칼(윤정)은 전국구 연합에 전국구만의 표식을 만들자고 건의합니다.
지방 순례를 할 때엔 그 표식을 가지고 가서 자신이 전국구임을 확인 시키기 위해서 입니다.

이때의 표식이 바로 global입니다.

 

예제1

<?
$a = 1; //전국구 쌍칼(전역변수)

function Test()
{
   echo $a; //지역구 쌍칼(새로운 지역변수)
}

Test();
?>

 

결과는 아무것도 출력되지 않습니다.

우리는 아직 함수라는 것을 배우지 않았기 때문에 소스가 다소 생소할 수 있을 것입니다.
함수를 간단히 살펴보면 다음과 같은 형식으로 작성합니다.

 

function 함수이름( 파라미터 ) {

//함수내용

}

 

와 같은 형식으로 함수를 정의하며 정의된 함수는 ' 함수이름(파라미터);' 식으로 실행합니다.
그런데 함수는 자신만의 세계를 만들어 영역을 형성합니다.

그래서 부산같은 지역구가 되는 것이죠. 함수 내부의 변수들은 모두 지역구 변수들입니다.

전국구 $a 가 Test 함수 영역으로 들어오면 지역구에서는 누군지 모르니까 무시합니다.

그래서 뭘 만들었죠? 전국구만의 표식!!!

 

예제2

<?
$a = 1; //전국구 쌍칼(전역변수)

function Test()
{
   global $a; //나 전국구 쌍칼이야~(전역변수 사용 알림)
   echo $a;//전역변수 출력
}

Test();
?>

 

결과는 1이 출력됩니다.전국구 표식인 global을 보여주니 다들 윤정 형님~ 윤정 형님~ 그러는군요!

 

정리예제3

<?

$a="leejunsik";//전역변수 선언

function test()
{

 $b="하하";//지역변수 선언
 
 echo $a;//전역변수 출력 안됨
 
 echo "<br>";
 
 echo $b;//지역변수 출력

}
function test2()
{

 global $a;//전역변수 사용 등록

 echo $a;//전역변수 출력
 
 echo "<br>";

 echo $b;//지역변수 출력

}

echo $a;//전역변수 출력

test();//test함수 호출

test2();//test2함수 호출

?>

 

정리 설명:

함수내부가 아닌 영역(보통 소스부분)에서 선언되는 변수는 모두 전역변수이다.

하지만 전역변수라고 함수에서 사용이 가능한것이 아니다.
반드시 global이라는 예약어로 전역변수를 사용한다고 해준다음에 함수내부에서 사용해야 제대로 값을 가져올수있다.

global 예약어 없이 전역변수를 사용하면 함수 내부에서는 새로운 변수를 생성한다고
알려줌으로써 새로운 변수를 사용하는것입니다.

 

꼭 알아두세요 전역변수를 함수내부에서 사용시에는 global $변수명; 으로 선언해줘야 합니다.

 

static 정적변수

 

함수는 영역을 만드는 것 뿐만아니라 다른 특성도 있습니다.
함수를 호출할 때 영역을 만들고 함수의 처리가 완료되면 영역을 없애고 사라집니다.
마치 해결사처럼 필요할 때 등장했다가 일처리 다하고 나면 흔적도 없이 사라지는 것입니다.
그래서 함수 내부에 새로이 선언한 지역 변수는 모두 흔적도 없이 사라집니다.
다시 함수를 호출하면 새로이 지역 변수가 생겨서 기존에 가지고 있던 값은 모두 사라지고 맙니다.

그런데 어떤 경우에는 함수가 다시 호출될 때 지역변수의 값이 그대로 유지되어야 할 때가 있습니다. 이럴 때 사용하는 것이 static 키워드입니다.

 

예제1

<?
function Test()
{
   echo $a;
   $a = "제발 출력해줘~";
}

Test();

Test();

Test();
?>

 

이 함수는 몇 번을 호출하더라도 아무것도 출력되지 않습니다.
분명히 $a에다가 문자열을 저장했는데도 다음번, 그다음번에도 값은 출력하지 않습니다.
그 이유는 위에서 말씀드렸듯이 함수가 소멸함과 동시에 내부의 지역변수는 모두 사라져 버리기 때문에 $a는 이전값을 모두 잃어 버리고 맙니다.

 

예제2

<?
function Test()
{
   static $a = 0;
   echo $a;
   $a = $a + 1;
}

test();
test();
test();
?>

 

static을 써서 사용하면 처음 호출하면 0 두 번째는 1 세 번째는 2 ...
이렇게 $a 변수는 소멸하지 않고 계속 그 값을 유지하게 됩니다.
그러나 이 변수가 전역으로 사용될 수는 없습니다.
이 정적변수는 단지 그 지역에서만 유효한 값입니다.

 

상수

 

상수는 아주 간단합니다. 말 그대로 항상 똑같은 값을 가지는 변하지 않는 수입니다.

그래서 딱 한번만 설정하면 전역변수처럼 사용할 수 있습니다.

한번 설정된 값은 변경할 수 없습니다.

상수는 대문자로 표기하는게 일반적입니다.
상수 선언은 변수처럼 $ 표시는 하지 않습니다. define 예약어를 사용합니다.

 

예제

<?
define ("HELLO","안녕하세요"
);//상수 선언
echo HELLO
;//읽기만 가능하며 수정이 불가능
?>

 

define 으로 상수를 설정할 수 있습니다.-> define("상수명","상수에 저장될 값");
위의 예제에서 보듯이 define 이후의 HELLO는 "안녕하세요"를 나타냅니다.
그렇다고 echo "HELLO" 까지 "안녕하세요"라고 출력되는 것은 아닙니다.

PHP에서는 미리 일정의 상수를 정의해 두었습니다.
예를 들면 PHP_VERSION (현재 PHP 버전),
PHP_OS (현 시스템의 운영체제), M_PI (원주율), __FILE__(현재 실행파일의 경로와 파일명) 등이 있습니다.

 

__FILE__ 출력 예 : /home/hosting_users/ysaraha/www/test3.php

 

 echo __LINE__;

※ 상수는 맨앞에 $을 붙히지 않는다.

 

앗따 이파트도 패스!

연산자 우선순위

 

이번 강좌에서 배울 것이 바로 연산자입니다.
많은 연산자가 있는데 어느것이 더 먼저 계산되는가를 정해놓은

연산자 우선순위라는 것이 있습니다.

 

연산자 (아래일수록 우선순위가 높음)

,

or

xor

and

print

= += -= *= /= .= %= &= |= ^= <<= >>=

? :

||

&&

|

^

&

== != === !==

< <= > >=

<< >>

+ - .

* / %

! ~ ++ -- (int) (float) (string) (array) (object) @

[

new

 

간단히 곱하기가 더하기보다 우선순위가 높기 때문에 2 * 3 + 2 는 (2 * 3) + 2 = 8 이 됩니다.
만약 더하기가 우선순위가 높았다면 2 * ( 3 + 2 ) = 10 이 되겠습니다.

 

여기서 잠깐

PHP에서 숫자일경우 0은 거짓(FALSE)을 0외의 모든 숫자는 참(TRUE)을 나타냅니다.

PHP에서는 문자일경우 값이 없으면 거짓이고 값이 있으면 참입니다.

 

산술 연산자

 

산술 연산은 흔히 우리가 접하는 더하기 빼기 곱하기 나누기를 말합니다.

 

+  더하기 

-  빼기 
*  곱하기 

/  나누기

%  나머지

 

예제

<?

 $value1=10;
 $value2=20;

 echo $value1+$value2;
 
 echo "<br>";

 echo $value1-$value2;
 
 echo "<br>";

 echo $value1*$value2;
 
 echo "<br>";

 echo $value1/$value2;
 
 echo "<br>";

 echo (int)($value1/$value2);
 
 echo "<br>";

 echo $value1%$value2;

 ?>

 

대입 연산자

 

기본 대입 연산자는 = 입니다.  일반적으로 = 기호는 같다라고 생각합니다.
그러나 a = b 는 a 와 b 는 같다가 아니라.. (PHP에서 실제 같다는 ==입니다.)
b 의 값을 a 에다가 대입한다 라는 뜻입니다.그래서 대입 연산자입니다.

 

예) $a = ($b = 4) + 5; // $a는 9, $b는 4의 값을 가진다.

괄호 안이 가장 우선으로 처리됩니다. 따라서 $b 는 4 가 되고 4 가 된 $b에 5를 더한 그 값이
$a 에 입력됩니다. 결과는 $a 는 9 , $b 는 4입니다.

 

비교 연산자

 

비교 연산은 말 그대로 두 개의 값을 비교하는 것입니다

 

<   작다
>   크다
<=  작거나 같다
>=  크거나 같다
==  같다
!=   같지 않다

 

예제

<?

 $value1=5;
 $value2=6;

 echo ($value1>$value2);

 echo ($value1<$value2);

 echo ($value1==$value2);

 echo ($value1>=$value2);

 echo ($value1 != $value2);

?>

 

증감 연산자

 

++$a    $a를 1 증가후 $a를 반환
$a++    $a를 반환후 $a 에 1 증가
--$a    $a를 1감소후 $a를 반환
$a--    $a를 반환후 $a 에 1 감소

 

예제

<?
echo "<h4>후 증가</h4>";
$a = 5;
echo " $a++: " . $a++ . "<br>";
echo " $a : " . $a . "<br>";

echo "<h4>선 증가</h4>";
$a = 5;
echo " ++$a: " . ++$a . "<br>";
echo " $a : " . $a . "<br>";

echo "<h4>후 감소</h4>";
$a = 5;
echo " $a--: " . $a-- . "<br>";
echo " $a : " . $a . "<br>";

echo "<h4>선 감소</h4>";
$a = 5;
echo " --$a: " . --$a . "<br>";
echo " $a : " . $a . "<br>";
?>    

 

논리 연산자


$a and $b   And 두 변수 모두 참일 때 TRUE.
$a or $b     Or 두 변수중 적어도 하나가 참이면 TRUE
$a xor $b    Xor 둘의 값이 다르면 TRUE, 둘이 같으면 FALSE
! $a            Not 변수가 거짓일 때 TRUE, 참이면 FALSE
$a && $b    And 두 변수 모두 참일 때 TRUE.
$a || $b     Or 두 변수중 적어도 하나가 참이면 TRUE

 

&& 이나 and, || 나 or 는 같습니다.
그러나 따로 해놓은 이유는 우선순위가 서로 다르기 때문입니다.

 

예제

<?

 $value1=5;
 $value2=6;

 echo ($value1 and $value2);

 echo "<br>";

 echo ($value1 or $value2);

 echo "<br>";

 echo ($value1 xor $value2);

 echo "<br>";
 
 echo (!$value1);

 echo "<br>";

?>

 

문자열 연산자

문자열을 더할 때는 . (쩜) 연산자를 씁니다.

$a = " 안녕 ";
$b = " 하세요";
일 때 두 문자열을 더하고 싶으면

$c = $a . $b; 하시면 됩니다.

$c 에 한마디를 더 추가하고 싶을 때는..
$c .= " 반가워요~"; 하시면 됩니다.
$c .= ""; 는 $c = $c . ""; 와 같습니다.

결과적으로 $c = " 안녕 하세요 반가워요~"; 가 되겠습니다.

 

배열 연산자

배열을 서로 더하기 위해서는 "+" 플러스 기호를 이용하여 가능합니다.
왼쪽의 배열에 오른쪽 배열을 더하여 집니다.

<?
$a = array("a" => "사과", "b" => "바나나");
$b = array("a" =>"배", "b" => "딸기", "c" => "포도");

$c = $a + $b;
?>
결과는 $c = array("a" =>"사과", "b" => "바나나", "c" => "포도");

같은 a,b 키를 가지는 값은 덮어쓰여지지 않고 중복되지 않는 것만 추가가 되었습니다.

실행 연산자

실행 연산자(` `)를 이용하여 서버에 쉘명령을 실행할 수 있습니다.
실행 연산자는 백틱으로 작은 따옴표가 아닙니다. 키보드의 Esc 아래키입니다.

<?
$output = `ls -al`;
echo "<pre>$output</pre>";
?>

이 연산자는 shell_exec() 함수를 사용하는 것과 동일합니다.
보안문제로 인해 PHP가 안전모드로 동작하거나 shell_exec() 함수의 사용이 제한되었다면
이 연산자 또한 실행되지 않습니다.

에러제어 연산자

PHP 표현식에서 에러가 발생할 수 있는 곳에 "@" 기호를 붙이므로해서
에러를 출력하지 않게 하는 연산자입니다.

<? @include "a.php"; ?>

만약 a.php 파일이 없을 경우 include 가 실패하여 에러를 표시하게 되지만
에러제어 연산자가 있기 때문에 에러를 표시하지 않고 넘어가게 됩니다.
에러가 발생해도 프로그램의 실행에는 상관없는 그러한 경우에 이 연산자를 사용하시면 됩니다.

 

비트 연산자

비트 연산은 숫자를 2진수로 생각하여 각각의 비트별로 계산하는 연산입니다.

이름 결과
$a & $b And

양쪽의 비트가 모두 1인 자리를 1로 나머지는 0으로 세팅

$a | $b Or

둘중 적어도 하나의 비트가 1이면 그 자리를 1로 모두 0이면 0으로 세팅

$a ^ $b Xor

비트가 같으면 그 자리를 0으로 다르면 1로 세팅

~ $a Not

모든 비트를 0은 1로 1은 0으로 세팅

$a << $b Shift left

모든 비트를 왼쪽으로 $b자리씩 이동 (한번 이동은 2를 곱한 것과 같음)

$a >> $b Shift right

모든 비트를 오른쪽으로 $b자리씩 이동 (한번 이동은 2를 나눈 것과 같음)

 

실제 적용 예) 12는 2진수로 1100 이고 5는 2진수로 0101 입니다.

설명

결과

12 & 5

1100 과 0101에서 모두 1인자리만 1 따라서 0100

4 (0100)

12 | 5

1100 과 0101에서 하나만 1이어도 1 따라서 1101

13 (1101)

12 ^ 5

1100 과 0101에서 같으면 0 다르면 1 따라서 1010

10 (1010)

~ 12

1100을 반대로 따라서 0011

3 (0011)

12 << 2

1100을 왼쪽으로 두자리 이동 따라서 110000

48 (110000)

12 >> 2

1100을 오른쪽으로 두자리 이동 따라서 0011

3 (0011)

 

여기서 잠깐
비트 연산자이나 실행 연산자는 특별한 경우에만 사용하므로 자세히 모르셔도 괜찮습니다.