변수의 사용 범위
변수에는 지역변수라느니 전역변수라느니 하는 것들이 있습니다.
말 그대로 지역변수는 어떠한 일부분 영역(보통 함수)에서만 적용되는 변수이고
전역변수는 모든 함수와 어느 영역이는 사용가능한 변수입니다.
지역구와 전국구에 비교할 수 있죠. 목포의 회칼(준식)이 지역구라면 종로의 쌍칼(윤정)은 전국구입니다.
회칼(준식)이 서울로 상경해서 "나 회칼(준식)이야~" 라고 한들 누가 알아줄까요?
하지만 전국구인 쌍칼(윤정)은 목포가서 "나 쌍칼(윤정)이다" 라고 하면 다들 벌벌 떨것입니다.
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) |
여기서 잠깐
비트 연산자이나 실행 연산자는 특별한 경우에만 사용하므로 자세히 모르셔도 괜찮습니다.