Array() 배열이란?

 

배열이란 하나의 변수에 여러 값을 저장할 수 있는 특수한 변수를 말합니다. 예를 들어 다음의 변수가 있다고 가정해 보겠습니다.

 

ex #1)

<?php
$cars1 = "Volvo";
$cars2 =
"BMW"
;
$cars3 =
"Toyota";

?>

 

몇 개의 변수로 이루어진 것이라면 문제가 되지 않겠지만, 비슷한 이름을 가진 변수가 수 백 개가 존재한다면 비슷한 이름을 가진 변수 때문에 관리가 어려워 질 수 있을 것입니다. 그래서 다음과 같이 하나의 변수에 여러 값을 저장해서 관리하면 수월해 지겠지요.

 

ex #2)

<?php
$cars = array(
"Volvo", "BMW", "Toyota"
);
echo
"I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . "."
;
?>

 

배열에는 인덱스 배열, 연관 배열, 다차원 배열이 존재하며 인덱스 배열은 항상 0 부터 시작해서 자동으로 증가 값을 가지게 됩니다.

 

ex #3)

<?php

$cars = array("Volvo", "BMW", "Toyota");

 

// 수동으로 설정 한다면

$cars[0] = "Volvo";
$cars[1] =
"BMW"
;
$cars[2] =
"Toyota";

?>

 

for문을 이용하여 인덱스를 생성할 수 있습니다.

 

ex #4)

<?php
$cars = array(
"Volvo", "BMW", "Toyota"
);
$length = count($cars);

for($i=0;$i<$length;$i++){
  echo $cars[$i] . “, ”
;
}

// 출력: Volvo, BMW, Toyota
?>

 

연관 배열이란 변수의 이름을 가지는 키를 사용한 배열을 말합니다.

 

ex #5)

<?php

$age = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"43");

 

// 수동으로 설정 한다면

$age['Peter'] = "35";
$age[
'Ben'] = "37"
;
$age[
'Joe'] = "43";

 

echo "Peter is " . $age['Peter'] . " years old.";

 

?>

 

Foreach 문을 이용한 연관배열을 생성할 수도 있습니다.

 

ex #6)

<?php
$age = array(
"Peter"=>"35", "Ben"=>"37", "Joe"=>"43"
);

foreach($age as $key=>$value){
 
echo "Key=" . $key . ", Value="
. $value;
 
echo "<br>"
;
}

/*

출력:

Key=Peter, Value=35
Key=Ben, Value=37
Key=Joe, Value=43

*/
?>

 

다차원 배열은 1차원 배열을 가지는 기존 방식보다는 하나 이상의 배열을 포함하는 배열로서 인덱스 배열이나 연관 배열을 복합적으로 가질 수 있습니다.

 

ex #7)

<?php
// 2차원 배열

$cars = array (
 array(
"Volvo", 100, 96),
 array(
"BMW"
, 60, 59),
 array(
"Toyota"
, 110, 100)
);
?>

 

ex #8)

<?php

$families = array (
"Griffin"
=>array (
  "Peter"
,
  "Lois"
,
  "Megan"

),

"Quagmire"=>array (
 
"Glenn"

),

"Brown"=>array (
 
"Cleveland"
,
 "Loretta"
,
 
"Junior"

)

);

/*

출력:

Array (

[Griffin] => Array (

[0] => Peter

[1] => Lois

[2] => Megan

)
[Quagmire] => Array (
 [0] => Glenn
)
[Brown] => Array (
 [0] => Cleveland
 [1] => Loretta
 [2] => Junior
 )
)

*/

 

 

echo $families['Griffin'][2];

// 출력: Megan

?>

 

ex #9)

<?php

echo "Is " . $families['Griffin'][2] . " a part of the Griffin family?";

// 출력: Is Megan a part of the Griffin family?

?>

 

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

자동전역변수는 환경 변수가 포함되어, 모든 환경 변수 목록을 phpinfo()로 확인할 수 있습니다.

예제 (ex #1
 <?php
      phpinfo
(INFO_VARIABLES
);
 
?>

이렇게 선언된 변수는 다음과 같은 방법으로 가져올 수 있습니다.

 $HTTP_SERVER_VARS['환경변수'];
 $_SERVER['환경변수'];
 $GLOBALS['_SERVER']['환경변수'];
 getenv(['환경변수']);

PHP는 실행되는 스크립트에 적용이 되는 상당량의 미리 선언된 변수를 제공합니다. 하지만, 이 변수의 대부분은 운영되는 서버, 서버의 버전, 서버의 설정, 다른 팩터와 관련되어 있어서 보안에 문제시 될 수 있습니다.

그런 이유로 PHP 4.2.0 이후 버전부터, php.ini인 register_globals 의 기본값이 off 로 셋팅됩니다. register_globals 를 off 로 놓으면, 전역 유효영역 안의 미리 선언된 변수 집합들에 영향을 미치는데, 예를 들면, DOCUMENT_ROOT값을 얻기 위해서는 $DOCUMENT_ROOT 대신에 $_SERVER['DOCUMENT_ROOT']를, /test.php?id=3 에서 $id 대신에 $_GET['id']를, $HOME 대신에 $_ENV['HOME']을 사용해야 합니다.
 
서버를 아파치로 모듈로 사용한다면, 다음 아파치 함수로 환경 변수를 가져올 수 있습니다.

예제 (ex #2

 <?php
 
// 아파치 모듈로 모든 HTTP 요청 헤더를 가져옵니다.
 
if (!function_exists('apache_request_headers'
)) { 
        function 
apache_request_headers
() { 
            foreach(
$_SERVER as $key=>$value
) { 
                if (
substr($key,0,5)=="HTTP_"
) {
                    
$key=str_replace(" ","-",ucwords(strtolower(str_replace("_"," ",substr($key,5
))))); 
                    
$out[$key]=$value

                }else{ 
                    
$out[$key]=$value

                } 
            } 
            return 
$out

        }
 } 
 
print_r(apache_request_headers
());
 
/*
 결과:
 Array
 (
    [Accept] => */
*
    [
Accept-Language] => 
ko
    
[Accept-Encoding] => gzip
deflate
    
[User-Agent] => Mozilla/4.0 (compatibleMSIE 6.0Windows NT 5.1SV1
)
    [
Host] => 
127.0.0.1
    
[Connection] => Keep-
Alive
 
)
 */





 

 
 
// 개별 환경변수를 가져옵니다.
 
$ret apache_getenv("SERVER_ADDR"
);
 echo 
$ret
// 결과: 127.0.0.1
 
?>


다음은 전송된 헤더 목록을 가져오는 함수입니다.

예제 (ex #3
 <?php
 
// 아파치 모듈로 모든 HTTP 요청 헤더를 가져옵니다.
 // 넷스케이프/iPlanet/SunONE NSAPI 서버 모듈에서도 사용할 수 있습니다.
 // getallheaders()도 같은 역할을 합니다.
 
if (!function_exists('apache_response_headers'
)) {
    function 
apache_response_headers 
() {
        
$arh 
= array();
        
$headers headers_list
();
        foreach (
$headers as $header
) {
            
$header explode(":"$header
);
            
$arh[array_shift($header)] = trim(implode(":"$header
));
        }
        return 
$arh
;
    }
 }
 foreach (
apache_response_headers() as $name => $value
) {
    echo 
"$name: $value<br />\n"
;
 }
 
/*
 결과:
 Accept-Ranges: bytes
 X-Powered-By: PHP/4.3.8
 */
 
?> 

아파치 함수로 강제적으로 ip를 바꾸어 테스트해 보았는데, $_SERVER 에 영향을 주지 않음을 알 수 있습니다.

예제 (ex #4

 <?php 
 
echo apache_getenv('SERVER_ADDR'); 
// 결과: 127.0.0.1


 // ip 환경변수를 강제적으로 바꿉니다.
 
apache_setenv("SERVER_ADDR""192.168.0.2"
);


 echo 
apache_getenv('SERVER_ADDR'); 
// 결과: 192.168.0.2


 // 아파치 함수로 환경변수를 정의하여도
 // 미리 정의된 변수에는 영향을 받지 않습니다.
 
echo $_SERVER['SERVER_ADDR']; 
// 결과: 127.0.0.1
 
?>  


관련글: 2011/04/16 - [phP 들어가기/phP입문/변수 기초] - 전역 변수 $GLOBALS
           2011/05/31 - [phP 들어가기/phP입문/변수 기초] - 외부변수의 이해
           2011/04/09 - [phP 들어가기/phP입문/변수 기초] - CGI 환경 변수

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

php에서는 POST방식이나 GET방식을 통해 전달된 값을 각각 $HTTP_POST_VARS와 $HTTP_GET_VARS변수에 자동적으로 저장됩니다. 지금은 Php가 버전업되어 $_GET과 $_POST라는 짧은 변수에 동시 저장됩니다. 단, 이 기능을 사용하려면 php.ini에 다음 표의 설정에 On상태일 때만 저장됩니다.

 Track_vars    = On ; enable the $HTTP_*_VARS[] arrays, where * is one of
                            ; ENV, POST, GET, COOKIE or SERVER. 

이 설정은 처음 설치시 기본값 On입니다.

이 변수는 사용자가 입력한 폼의 속성 이름이나 전달하고자 하는 변수의 이름을 키로 갖고, 그 변수의 값을 갖는 value인 연관배열로 전달받습니다.

POST의 값은 다음 예제를 보면 이해되리라 봅니다.

예제 (ex #1

 <form method="POST" action="">
 이   름: <input type="text" name="myname" value="내  이름"> 
 닉네임: <input type="text" name="nickname" value="하보니">
 <inpt type="submit" value="값 전송">
 </form>

 
<?php
 
if(is_array($_POST
)){
      while (list(
$key$value) = each($_POST
)){
           echo 
"변수 키 : ${key}, 변수 값: ${value}<br />\n\t"
;
      }
      echo 
$_POST['myname'] . "<br />\r\n"
;
      echo 
$_POST['nickname'] . "<br />\r\n"
;
 }
 
/*
 결과:
 변수 키 : myname, 변수 값: 내 이름
 변수 키 : nickname, 변수 값: 하보니
 내 이름
 하보니
 */
 
?>


예제 (ex #2
 <form method="POST" action="?myname=내 이름&nickname=하보니">
 <inpt type="submit" value="값 전송">
 </form> 

 
<?php
 
if(is_array($_POST
)){
      echo 
$_POST['myname'] . "<br />\r\n"
;
      echo 
$_POST['nickname'] . "<br />\r\n"
;
 }
 
/*
 결과:
 내 이름
 하보니
 */
 
?>

변수 $_POST는 method 속성을 POST로 정의하여 전달된 값이 저장되는 것으로 "myname"이 변수이름인 key를 갖고, 그 변수의 값을 "내 이름"이 배열원소가 됩니다. 여기서 method 속성을 GET으로 정의하면 당연히 GET변수가 되겠지요.

예제 (ex #3
 <form method="GET" action="">
 이   름: <input type="text" name="myname" value="내  이름"> 
 닉네임: <input type="text" name="nickname" value="하보니">
 <inpt type="submit" value="값 전송">
 </form>

 
<?php
 
if(is_array($_GET
)){
      while (list(
$key$value) = each($_GET
)){
           echo 
"변수 키 : ${key}, 변수 값: ${value}<br />\n\t"
;
      }
      echo 
$_GET['myname'] . "<br />\r\n"
;
      echo 
$_GET['nickname'] . "<br />\r\n"
;
 }
 
/*
 결과:
 변수 키 : myname, 변수 값: 내 이름
 변수 키 : nickname, 변수 값: 하보니
 내 이름
 하보니
 */
 
?>

이 두 변수의 차이는 GET은 URL뒤에 붙어 전달되는 방식으로 데이터의 노출위험과 전송크기에 제한받지만, 반대로 POST는 데이터의 노출최소, 데이터전송에 제한이 없는 강점이 있습니다.

관련글: 2011/06/10 - [phP 들어가기/phP입문/변수 기초] - 자동전역변수 #2
           2011/04/16 - [phP 들어가기/phP입문/변수 기초] - 전역 변수 $GLOBALS
           2011/04/09 - [phP 들어가기/phP입문/변수 기초] - CGI 환경 변수

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

가변 변수란 유동적 변수라고 할 수 있어, 어느 정도 편리함이 있습니다. 일반 변수는 다음과 같을 것입니다.

예제 (ex #1
 <?php
 $a 
"hello"
;
 
?>

다음은 가변 변수로서 두개의 $가 붙습니다. 이는 변수값을 취해서 변수명으로 취급한다는 점입니다.

예제 (ex #2
 <?php
 $a 
"hello"
;
 $
$a "habony"
;
 
?>

$a변수에 hello값을 정의하고, 다시 $hello 변수에 habony값을 정의하여, 다음과 같은 결과를 얻습니다.

예제 (ex #3
 <?php
 $a 
"hello"
;
 $
$a "habony"
;
 echo 
$a
// 결과: hello
 
echo $hello
// 결과: habony
 
?>

다음도 좋은 결과물입니다.

예제 (ex #4

 <?php
 $Bar 
"a"
;
 
$Foo "Bar"
;
 
$World "Foo"
;
 
$Hello "World"
;
 
$a "Hello"
;

 echo 
$a."<br />\n"
// 결과: Hello
 
echo $$a."<br />\n"
// 결과: World
 
echo $$$a."<br />\n"
// 결과: Foo
 
echo $$$$a."<br />\n"
// 결과: Bar
 
echo $$$$$a."<br />\n"
// 결과: a

 
echo $$$$$$a."<br />\n"
// 결과: Hello
 
echo $$$$$$$a."<br />\n"
// 결과: World
 
?>


배열을 가변 변수로 사용할 수도 있습니다.

예제 (ex #5
 <?php
 $number 
= array("one""two""three"
) ;
 
$a "number" 
;
 ${
$a}[] =  "four" 
// 배열 추가
 
print_r($number
) ;

 
/*
 결과:
 Array
 (
    [0] => one
    [1] => two
    [2] => three
    [3] => four
 )
 */
 ?> 

다음은 클레스명 가변 변수의 예입니다.

예제 (ex #6
 <?php
 
class habony 
{
      public function 
phptest
() {
          echo 
'Hello world!'
;
      }
 }

 
$my_habony 'habony'
;
 
$x = new $my_habony
();
 
$x->phptest();  
// 결과: Hello world!
 
?> 

가변 변수(동적 변수) 사용시 함수나 클레스 메쏘드 안에서 $this->로 사용되는 특수한 변수는 동적인 변수로 사용될 수 없음에 주의해야 하고, 이로서 메쏘드 안에서 만큼은 변수가 쉽게 변질되는 것을 막을 수 있습니다.
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

Nowdoc 스타일은 Heredoc스타일과 비슷합니다. 먼저 Heredoc스타일은 앞서 소개한 바와 같이 "<<<영문대문자" 로 시작해서 종료어인 세미콜론만을 가지는 "영문대문자;"로 합니다. 종료어 앞에 공백이 와서도 안됩니다. 이 스타일은 변수나 특수문자, 큰따옴표, 작은 따옴표를 혼용으로 작성 가능한 장점이 있습니다.

예제 (ex #1
 <?php
 $name 
"My Name"
;

 echo <<<TESTVAR
 My name is "$name". I am printing some $foo->
foo.\n
 Now, I am printing some 
{$foo->bar[1]}
.\n
 This should not print a capital 'A': \x41
TESTVAR;

 
/*
 결과:
 My name is "My Name". I am printing some .
 Now, I am printing some .
 This should not print a capital 'A': A 
 */
 
?>

(PHP 5.3)부터 사용이 가능한 Nowdoc스타일은 특수문자 치환이 않되는 작은 따옴표의 역할을 합니다. 표현은 Heredoc스타일과 같지만 <<<'영문대문자'로 작은 따옴표를 넣어주면 nowdoc스타일이 됩니다.

예제 (ex#2
 <?php
 $name 
"My Name"
;

 echo <<<'TESTVAR'
 My name is "$name". I am printing some $foo->
foo.\n
 Now, I am printing some 
{$foo->bar[1]}
.\n
 This should not print a capital 'A': \x41
TESTVAR;

 
/*
 결과:
 My name is "$name". I am printing some .$foo->foo.\n Now, I am printing some {$foo->bar[1]}.\nThis should not print a capital 'A': \x41
 */
 
?>
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

상수는 변수와 마찬가지로 자료형태의 데이터를 저장할 수 있습니다. 상수에 데이터를 한번 정의하면 변경할 수 없는 장점에 많이 사용되기도 하는데, 이는 변수의 변질을 막을 수 있기 때문입니다.

상수에는 "미리 정의된 상수"가 있고, define함수로 사용자 상수를 정의하고, defined함수로 정의되었는지 확인해 볼 수 있습니다. 상수 이름에 정의되는 규칙은 변수명의 규칙에 벗어나지 않는 다면 자유롭습니다.

미리 정의된 상수

미리 정의된 상수는 다음 표를 사용할 수 있습니다.

  상수명       의  미
 __FILE__
파일의 전체경로와 파일명, 절대경로
 __LINE__ 파일의 현재 줄 라인 
 __DIR__
dirname함수와 __FILE__상수는 동일한 기능을 하나 마지막에 슬레쉬가 없음 (PHP 5.3 추가)
 __FUNCTION__ 함수명을 표시 (PHP 5에 추가)
 __CLASS__ 클레스명을 표시 (PHP 5에 추가)
 __METHOD__ 클레스 메소드명을 표시 (PHP 5에 추가)
 __NAMESPACE__ 이 상수는 컴파일 시에 정의됩니다. (PHP 5.3에 추가)
 PHP_VERSION 서버에 설치된 PHP버전
 PHP_OS PHP가 실행중인 OS의 이름
 TRUE TRUE (참), 1을 표시
 FALSE FALSE (거짓), 빈 값을 표시
 E_ERROR 문법 오류가 아닌 복구가 불가능한 에러를 표시
 E_WARNING PHP가 스크립트 실행에는 문제없으나 오류가 있음을 표시
 E_PARSE 스크립트에서 문법적으로 잘못된 명령을 만난 경우 표시
 E_NOTICE 에러는 아니지만 알릴 사항이 있음을 표시

예제 (ex #1

  <?php

 
echo __FILE__ "<br/>\n"
// 결과: c:\Server\public_html\test.php
 // 상수를 정의한 위치가 5 라인입니다.
 
echo __LINE__ "<br/>\n"
// 결과: 5
 // php 버전
 
echo PHP_VERSION "<br/>\n"
// 결과: 5.2.13

 
echo PHP_OS "<br/>\n"
// 결과: WINNT

 
echo TRUE "<br/>\n"
// 결과: 1

 
echo FALSE "<br/>\n"
// 결과: 

 // 함수명 상수 정의
 
function functionname
(){
    echo 
__FUNCTION__
;
 }
 
functionname(); 
// 결과: functionname

 // 클레스명 상수 정의
 
class classtest
{
      var 
$test __CLASS__
;
      function 
test
(){
           echo 
$this->test
;
      }
 }
 
$test = new classtest
;
 echo 
$test->test
// 결과: classtest

 // 메쏘드명 상수 정의
 
class classtest
{
      var 
$test __METHOD__
;
      function 
test
(){
           echo 
$this->test
;
      }
 }
 
$test = new classtest
;
 echo 
$test->test
// 결과: classtest

 
?>


사용자 상수 define 함수

bool define ( string $name , mixed $value [, bool $case_insensitive= false ] ) (PHP 4, PHP 5)

첫 번째 인자는 상수 이름을 지정하고, 두 번째 인자는 상수 값을 지정합니다. 상수는 대소문자를 구분하기 때문에 이를 무시하려면 세 번째 인자에 true로 설정하면 됩니다. 성공하면 true를, 실패하면 false를 반환합니다.

 상수 이름 앞에 달러표시($)가 없습니다.
 상수는 전역변수처럼 함수나 클레스에서 global없이 사용할 수 있습니다.
 상수는 한 번 설정되면 재정의(변형)하거나 삭제할 수 없습니다.
 상수 이름은 가능하다면 대문자로 작성하되 __로 시작하길 권하지 않습니다.

예제 (ex #2

 <?php

 
// 상수는 대소문자를 구분합니다.
 
define("VARTABLE""안녕하세요. 하보니입니다."
);
 echo 
VARTABLE
// 결과: 안녕하세요. 하보니입니다.
 
echo VARTABLe
// 결과: VARTABLe

 // 대소문자를 무시하려면 true를 입력합니다.
 
define("GREETING""상수 테스트입니다."true
);
 echo 
GREETING
// 결과: 상수 테스트입니다.
 
echo Greeting
// 결과: 상수 테스트입니다.

 // constant함수로 상수 값을 출력하는 예입니다.
 // 성공하면 상수값을, 실패하면 NULL를 반환합니다.
 
define("CONST""constan함수로 상수 출력하기t"true
);
 echo 
constant("CONST"); 
// 결과: constan함수로 상수 출력하기

 ?> 


상수가 정의되었는지 확인하려면 defined함수를 사용하면 됩니다.

예제 (ex #3
 <?php
 define
("CONST","상수가 올바로 정의되었습니다."
);

 if(
defined("CONST"
)){
      echo CONST;
 }
 
// 결과: 상수가 올바로 정의되었습니다.
 
?>

모든 상수와 그 값의 연관 배열을 반환하는 get_defined_constants 함수

array get_defined_constants ([ bool $categorize ] ) (PHP 4 >= 4.1.0, PHP 5)

현재 정의된 모든 상수의 이름과 값을 반환합니다. 여기에 사용자가 정의한 상수도 포함되며, categorize(PHP 5부터 사용가능)에 true를 지정하여 키와 값을 배열로 반환받을 수 있습니다.

예제 (ex #4

 <?php
 define
("MY_CONSTANT""상수를 정의합니다."
);
 
print_r(get_defined_constants(true
));
 
 
/*
 결과: 
 Array
 (
    [internal] => Array
        (
            [E_ERROR] => 1
            [E_WARNING] => 2
            [E_PARSE] => 4
            [E_NOTICE] => 8
            [E_CORE_ERROR] => 16
            [E_CORE_WARNING] => 32
            [E_COMPILE_ERROR] => 64
            [E_COMPILE_WARNING] => 128
            [E_USER_ERROR] => 256
            [E_USER_WARNING] => 512
            [E_USER_NOTICE] => 1024
            [E_ALL] => 2047
            [TRUE] => 1
        )
    [pcre] => Array
        (
            [PREG_PATTERN_ORDER] => 1
            [PREG_SET_ORDER] => 2
            [PREG_OFFSET_CAPTURE] => 256
            [PREG_SPLIT_NO_EMPTY] => 1
            [PREG_SPLIT_DELIM_CAPTURE] => 2
            [PREG_SPLIT_OFFSET_CAPTURE] => 4
            [PREG_GREP_INVERT] => 1
        )
    [user] => Array
        (
            [MY_CONSTANT] => 상수를 정의합니다.
        )
 )
 */
 
?>


다음은 categorize 에 지정하지 않았을 때의 예입니다.

예제 (ex #5

 <?php
 define
("MY_CONSTANT""상수를 정의합니다."
);
 
print_r(get_defined_constants
());
 
 
/*
 결과: 
 Array
 (
    [E_ERROR] => 1
    [E_WARNING] => 2
    [E_PARSE] => 4
    [E_NOTICE] => 8
    [E_CORE_ERROR] => 16
    [E_CORE_WARNING] => 32
    [E_COMPILE_ERROR] => 64
    [E_COMPILE_WARNING] => 128
    [E_USER_ERROR] => 256
    [E_USER_WARNING] => 512
    [E_USER_NOTICE] => 1024
    [E_ALL] => 2047
    [TRUE] => 1
    .
    .
    생략
    .
    .
    [MY_CONSTANT] => 상수를 정의합니다.
 )
 */
 
?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

동적 변수와 정적변수와의 차이는 함수나 클레스안에서 반복문이나 재귀호출에 의해 수행되는 변수가 함수의 종료시까지 메모리에 할당해두는 것을 정적변수라 합니다. 변수명 앞에 static구문을 추가해주면 정적변수가 됩니다.

예제 (ex #1

 <?php

 
function test1
(){
     
$a
++;
     echo 
$a
;
 }

 function 
test2
(){
     static 
$a
;
     
$a
++;
     echo 
$a
;
 }

 for(
$i=0$i<=10$i
++){
     
test1(); 
// 동적변수입니다.
 
}

 echo 
"<br />"
;

 for(
$i=0$i<=10$i
++){
     
test2(); 
// 정적변수입니다.
 
}

 
/*
 결과:
 11111111111
 1234567891011
 */

 
?>


예제 (ex #2

 <?php
 
function foo
() {
    static 
$bar
;
    
$bar
++;
    echo 
"Before unset: $bar, "
;
    unset(
$bar
);
    
$bar 23
;
    echo 
"after unset: $bar\n"
;
 }
 
foo(); 
// 결과: Befor unset: 1, after unset: 23
 
foo(); 
// 결과: Befor unset: 2, after unset: 23
 
foo(); 
// 결과: Befor unset: 3, after unset: 23
 
?> 


정적변수를 이용한 소스 [디렉토리 전체 용량]을 참고해 보면 알 수 있을리라 봅니다.
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

지역변수란 그 변수가 선언된 곳에서만 사용가능함을 말합니다. 함수나 클레스 안에 선언된 변수가 있다면, 그 함수 안에서만 사용가능하지 함수 밖에서는 사용할 수 없습니다. 반대로 함수 밖에서 선언된 변수를 함수나 클레스 안에서 사용할 수 없습니다.

예제 (ex #1

 <?php
 
function test
() {
    
$foo "local variable"
;

    echo 
'$foo in global scope: ' $var "\n"
;
    echo 
'$foo in current scope: ' $foo "\n"
;
 }
 
$var "Example content"
;
 
test
();
 
 
/* 
 결과
 $foo in global scope: 
 $foo in current scope: local variable
 */
 
?>


지역변수는 한정된 곳에서만 사용할 수 있지만 함수 밖에 선언된 변수를 함수 안에서 사용하고자 한다면 자동 전역변수 $GLOBALSglobal를 정의해 주면 사용할 수 있습니다.

예제 (ex #2

 <?php
 
function test
() {
    global 
$arg
;

    echo 
'$foo in global scope: ' $GLOBALS['var'] . "\n"
;
    echo 
'$foo in current scope: ' $arg "\n"
;
 }
 
$var "Example content"
;
 
$arg "local variable"
;
 
test
();
 
 
/* 
 결과
 $foo in global scope: Example content
 $foo in current scope: local variable
 */
 
?>


$GLOBALS에는 사용자 변수 뿐 아니라 슈퍼전역변수(미리선언된 변수)도 정의되어 있음을 알아야 합니다.

 슈퍼전역 변수
 $HTTP_*_VARS
 $_SERVER 
 $_GET 
 $_POST 
 $_FILES 
 $_COOKIE 
 $_SESSION 
 $_REQUEST 
 $_ENV 

예제 (ex #3

 <?php
 
echo $GLOBALS['_SERVER']['HTTP_ACCEPT_LANGUAGE']; 
// 결과: ko
 
echo $GLOBALS['_SERVER']['HTTP_HOST']; 
// 결과: 127.0.0.1
 
echo $GLOBALS['_SERVER']['PHP_SELF']; 
// 결과: test.php
 
?>


관련글: 2011/06/10 - [phP 들어가기/phP입문/변수 기초] - 자동전역변수 #2
           2011/05/31 - [phP 들어가기/phP입문/변수 기초] - 외부변수의 이해
           2011/04/09 - [phP 들어가기/phP입문/변수 기초] - CGI 환경 변수
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

퍼미션이란 파일이나 폴더의 사용권한을 말하는데, 사용권한이 제대로 설정되어 있다면 공격자로부터 파일이나 폴더를 보호해줄 수 있습니다. 단, 윈도우는 퍼미션설정이 필요없습니다.

디렉토리를 생성하게 되면 기본적으로 0755로 설정되며, 파일은 0644로 설정됩니다.

예제 (ex #1
 drwxr-xr-x  1  root root 4096 Nov 8 23:21 mydirs
 -rw-r--r--  1  root root 4326 Nov 8 23:21 test.php

"d rwx r-x r-x"에서 첫 단어가 [파일의 유형]으로 정의합니다. d이면 폴더이고, -이면 일반파일이라는 뜻입니다. 그러므로 "- rw- r-- r--"은 첫 단어가 -이므로 일반 파일이 됩니다.

파일의 유형
   유 형             설 명
 -  일반파일
 d  디렉토리
 l  심벌릭링크 (링크 파일)
 s  소켓파일
 p  파이프파일
 c  입출력에 사용되는 특수파일
 b  블럭구조의 특수파일

"- rw- r-- r--"에서 두 번째 단어부터 권한부분인데, 권한에도 소유자 권한, 그룹 권한, 유저 권한이 있습니다.

권한 소유자
 -  rw-  r--  r--
┗ 파일유형 ┗ 소유자 권한 ┗ 그룹(소속자) 권한 ┗ 유저 권한

"- rw- r-- r--"은 권한이 0644입니다. -이면 0을 대입하고, 알파벳은 다음 표의 값으로 대입하면 0644가 됩니다.

 8진수  퍼미션             의 미
  0  ---  아무런 권한이 없음
  1  --x  실행 권한만 가짐
  2  -w-  쓰기 권한만 가짐
  3  -wx  쓰기, 실행 권한만 가짐
  4  r--  읽기 권한만 가짐
  5  r-x  읽기, 실행 권한만 가짐
  6  rw-  읽기, 쓰기 권한만 가짐
  7  rwx  읽기, 쓰기, 실행 권한가짐


   Owner(소유자)  Group(그룹)  Public(유저)
 Read(읽기)  400 (R)  40 (R)  4 (R)
 Write(쓰기)  200 (W)  20 (W)  2 (W)
 Execute(실행)  100 (X)  10 (X)  1 (X)
블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag 퍼미션

댓글을 달아 주세요

CGI 환경 변수는 내장변수라 하며, 다음의 목록을 확인할 수 있습니다.

 변 수 명  설 명
HTTP_ACCEPT 접속자 브라우저가 처리할 수 있는 MIME 타입목록
HTTP_ACCEPT_LANGUAGE 접속자 브라우저 언어
HTTP_USER_AGENT 접속자 브라우저 종류
HTTP_HOST 웹서버 호스트이름, 도메인이 없으면 ip주소를 사용
SERVER_SOFTWARE 웹서버 종류
SERVER_NAME 웹서버 호스트이름, 도메인이 없으면 ip주소를 사용
SERVER_ADDR 웹서버 ip주소
SERVER_PORT 웹서버가 제공하는 포트번호, http일 경우 일반적으로 80
REMOTE_ADDR 접속자 ip 주소
DOCUMENT_ROOT 로컬파일 파일시스템 경로
SCRIPT_FILENAME php 실행파일 경로
SERVER_PROTOCOL 웹서버가 사용중인 이름과 HTTP버전
REQUEST_METHOD HTTP 페이지전송 방식 (GET 또는 POST)
QUERY_STRING 요청 URL의 ? 오른쪽 부분
REQUEST_URI 요청 URL에서 호스트이름이나 포트를 제외한 URL
SCRIPT_NAME 접속자가 보고 있는 페이지의 경로와 파일이름
PHP_SELF 접속자가 보고 있는 페이지의 경로와 파일이름
REQUEST_TIME 로컬시간(timestamp)을 출력, time()함수와 같은 역할을 하며, php5.1부터 지원합니다.
HTTP_REFERER
현제 페이지로 오기 전의 이전 페이지주소

HTTP_HOST와 SERVER_NAME의 차이를 말하자면, SERVER_NAME은 Apache의 ServerName을 말하며, HTTP_HOST는 Apache인 VirtualHost 에서 설정한 ServerName를 말하는데, 한 서버에 수 개의 호스트이름이 있다면 2개의 값이 달라진다는 점에 있습니다.

다음에서 http://127.0.0.1/mydir/test.php?arg=1&var=2로 접속했을 때의 결과를 확인할 수 있습니다.

 변 수 명  설 명
HTTP_ACCEPT image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
HTTP_ACCEPT_LANGUAGE ko
HTTP_USER_AGENT Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2)
HTTP_HOST 127.0.0.1
SERVER_SOFTWARE Apache
SERVER_NAME 127.0.0.1
SERVER_ADDR 127.0.0.1
SERVER_PORT 80
REMOTE_ADDR 127.0.0.1
DOCUMENT_ROOT C:/Server/public_html
SCRIPT_FILENAME C:/Server/public_html/mydir/test.php
SERVER_PROTOCOL HTTP/1.1
REQUEST_METHOD GET
QUERY_STRING arg=1&var=2
REQUEST_URI /mydir/test.php?arg=1&var=2
SCRIPT_NAME /mydir/test.php
PHP_SELF /mydir/test.php
REQUEST_TIME 1302443725
HTTP_REFERER  

HTTP_로 시작하는 변수는 헤더변수로서 브라우저의 요청에 의해 만들어지며, 접속자의 컴퓨터 환경적 정보가 담겨집니다. 이를 통해 접속자 브라우저 종류나 언어, ip주소, 접속경로로 다양한 방문자접속 통계프로그램을 만들 수 있는 것입니다.

 <?php
 
if("ko" == strtolower(getenv('HTTP_ACCEPT_LANGUAGE'
))) {
       echo 
"접속하신 브라우저가 한글입니다."
;
 }
 
?>

변수이름이나 변수이름 앞에 붙는 $_SERVER$HTTP_SERVER_VARS는 대문자로 표시해야 하며, php.ini 설정부분인 register_globalsoff라면 변수이름만으로는 사용할 수 없습니다.

 <?php
 
echo getenv('HTTP_HOST'
);

 echo 
$_SERVER['HTTP_HOST'
];

 echo 
$HTTP_SERVER_VARS['HTTP_HOST'
];

 echo 
$HTTP_HOST
//  register_globals가 off이면 사용 불가

 // 결과: 127.0.0.1
 
?>

보안에 어느 정도 유효성을 갖고 있다면 register_globalsOff로 해두는 게 좋으며, $_SERVERgetenv함수를 이용해 변수지정하도록 합니다.

기타 환경변수로는 HTTP_COOKIE, PATH, WINDIR, PATHEXT, COMSPEC, SystemRoot, argv, argc, SERVER_ADMIN, SERVER_SIGNATURE, HTTP_CONNECTION, HTTP_ACCEPT_ENCODING 등이 있지만 큰 비중이 없어서 생략합니다.

관련글: 2011/06/10 - [phP 들어가기/phP입문/변수 기초] - 자동전역변수 #2
           2011/05/31 - [phP 들어가기/phP입문/변수 기초] - 외부변수의 이해
           2011/04/16 - [phP 들어가기/phP입문/변수 기초] - 전역 변수 $GLOBALS
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

변수(Variables)의 정의

php는 다른 웹언어에 비해 변수의 구분이 명확하게 되는데, php에서 사용하는 변수(Variables)는 문자 앞에 달러($)기호를 붙이면 변수가 됩니다. 변수중에서도 유동변수, 정적변수, 동적변수가 있고, 외부변수라 할 수 있는 POST변수, GET변수, 그리고 세션변수, 쿠키변수, CGI변수, HTTP헤더변수 등 다양한 변수가 있습니다.

변수 작성시 주의점은 변수를 정할 문자 앞에 달러($)기호를 붙이면 변수가 되며, 시작시 숫자로 사용할 수 없지만, 영어 대소문자, 한글, 언더라인(_)을 혼용하거나 시작할 수 있습니다. 숫자를 넣고자하면 시작시 영문자나 언더라인 뒤에 숫자가 오면 가능하며, 특수문자는 사용할 수 없습니다.

이 규칙을 따라주지 않는다면 php 오류 코드를 표시하게 됩니다.
 <?php
 
// 사용할 수 있는 변수
 
$_variables '변수'
;
 
$variables '변수'
;
 
$변수 '변수'
;
 
$variables9 ='변수'
;

 
// 사용할 수 없는 변수
 
$9variables '변수'
;
 $%
variables '변수'
;
 
?>

변수와 값은 정해져 있는 게 아니므로 위 규칙에 벗어나지 않는 범위 내에 무한정 작성할 수 있으며, 원하는 값으로 대치할 수 있습니다.

문자열 변수

문자열 변수는 큰따옴표나 작은 따옴표로 감싸주면 됩니다.

 <?php
 $var 
'문자열'
;
 
$var "문자열"
;
 
?>

보통 이를 혼용해서 변수의 표현식에 지정하게 되는데, 분명 구분해서 사용해야만 합니다.

<?php

 
// 작은 따옴표 표현
 
echo '문자열\n개행문자'
// 특수문자는 치환되지 않습니다.

 // 큰 따옴표 표현
 
echo "문자열\n개행문자"
// 특수문자는 치환합니다.

 /*
 결과:

 문자열\n개행문자

 문자열
  개행문자

 */
 
?>

작은 따옴표로 감싸주었을 때 특수문자는 해석하지 못하고 그대로 출력해 버릴 것이니 주의가 필요합니다.

특수문자  의미
 \n 개행문자
 \r 캐리지리턴
 \t
 \f 폼피드
 \b 백스페이스
 \a 경고음
 \e esc문자
 \\ 역슬레쉬

큰 따옴표(")로 감싸 준 변수에 큰따옴표를 사용하고자 한다면 \"로 작성이 가능하고, 반대로 작은 따옴표(')로 감싸준 변수에 작은 따옴표를 사용하고자 한다면 \'로 작성이 가능합니다.
 

 <?php
 $a 
"문자열\""
;

 
// 큰 따옴표 표현
 
echo "$a<br/>"
;

 
// 작은 따옴표 표현
 
echo '$a<br/>'
;

 
/*
 결과:

 문자열"

 $a

 */
 
?> 


달러($)기호도 특수문자의 하나로 역슬레쉬에 의해 결과가 달라진다는 점을 알 수 있습니다.

 <?php
 $a 
"문자열"
;

 
// 큰 따옴표 표현
 
echo "\$a<br/>"
;

 
// 작은 따옴표 표현
 
echo '$a<br/>'
;

 
/*
 결과:

 $a

 $a

 */
 
?> 

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

echoprint는 큰차이는 없습니다. printtrue를 반환하지만 echo는 반환값이 없다는 점에 있습니다. 그리고 함수가 아닌 언어구조이기 때문에 괄호로 묶어 표시할 필요도 없지만 괄호로 표시할때는 "짧은 구문"으로만 표시하도록 해야 합니다. 짧은 구문은 "짧은 스타일"이라고도 하는데, 이 스타일은 php.ini의 short_open_tag 설정을 On했을 때만 작동합니다.



짧은 스타일
 I have <?=$str?> there.

예제 (ex #1

<?php
 $str 
"여러 줄로\n사용할 수 있습니다. 줄바꿈 문자도\n제대로 출력합니다."
;
 print 
$str


 print 
"<br/>"
;
 if(print 
''
) {
  echo 
"print"
;
 }
 echo 
"<br/>"






 echo 
"Hello World"
;
 echo 
"<br/>"





 echo 
"이것은 여러
 줄을 표현합니다. 물론 줄바꿈도 
 출력합니다."
;
 echo 
"<br/>"





 echo 
"이것은 여러\n줄을 표현합니다. 물론 줄바꿈도\n출력합니다."
;
 echo 
"<br/>"





 echo 
"문자 이스케이프는 \"이렇게\" 합니다."
;
 echo 
"<br/>"





 
// echo 구문 안에 변수를 사용할 수 있습니다.
 
$foo "foobar"
;
 
$bar "barbaz"





 echo 
"foo는 $foo"
// foo는 foobar
 
echo "<br/>"





 
// 배열을 사용할 수도 있습니다.
 
$baz = array("value" => "foo"
);

 echo 
"이것은 {$baz['value']} !"
// 이것은 foo !
 
echo "<br/>"





 
// 작은 따옴표는 변수값이 아닌, 변수명을 출력합니다.
 
echo 'foo는 $foo'
// foo는 $foo
 
echo "<br/>"





 
// 다른 문자를 사용하지 않는다면, 바로 변수를 echo할 수 있습니다.
 
echo $foo;          
// foobar
 
echo "<br/>"
;
 echo 
$foo,$bar;     
// foobarbarbaz
 
echo "<br/>"





 
// 몇몇 사람들은 결합 echo보다 복수 인수 사용을 선호합니다.
 
echo 'This ','string ','was ','made ','with multiple parameters.',chr(10
);
 echo 
"<br/>"





 echo 
'This '.'string '.'was '.'made '.'with concatenation.'."\n"
;
 echo 
"<br/>"





 echo <<<END
 이는 $variable 삽입을 가지는 여러 줄을
 출력하는 "here document" 구문을 사용합니다. here
 document 종료어는 줄에 세미콜론만을 가지고 있어야
 하며, 어떠한 공백도 없어야하는 점에 주의하십시오!
END;
 echo 
"<br/>"





 
// echo는 함수처럼 작동하지 않기에, 다음 코드는 유효하지 않습니다.
 // ($some_var) ? echo 'true' : echo 'false';

 // 그러나, 다음 예제는 작동합니다.
 
($some_var) ? print 'true' : print 'false'
;
 echo 
"<br/>"





 
// print도 구조이지만, 함수처럼
 // 작동합니다. 그러므로
 // 이 문맥에서 사용할 수 있습니다.

 
echo $some_var 'true''false'
// 구문을 변경하여 처리 

 
?> 



구문(Statements)의 표시

php코드내의 구문(Statements)의 수에 제한은 없습니다. 구문은 행의 끝에 세미콜론(;)이 오거나 php코드의 블록이 끝나야 합니다.

 php 구문은 <?php echo('세미콜론');?>이 온 경우 입니다.
 php 구문은 <?php echo ('php 코드의 블록')?>이 온 경우입니다.

구문의 표시는 php코드의 블록보다는 끝이 명확하게 세미콜론으로 처리하는게 오류를 줄이는 일임을 알 수 있습니다.
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

php코드를 표현하기 위해서는 적절한 코드의 시작을 알려야 합니다.
이것은 아래와 같은 표현으로 이루어집니다.

SGML 스타일, HTML 스타일, XML 스타일, 축약형 스타일, "Here Document" 스타일이 있습니다.

SGML 스타일
 <?
  echo "내용 입니다.";
 ?>

HTML 스타일
 <Script language="php">
    echo "내용 입니다.";
 </Script>

XML 스타일
 <?php
    echo "내용 입니다.";
 ?>

축약형 스타일
 <?= "내용 입니다." ?>
 <br/>
 <?= 2+2 ?>

축약형 스타일은 php로 표현할 수 있지만 태그 전체가 그 결과 값으로 대치되므로 그다지 추천할 만한 코딩습관은 아닙니다. 가능하다면 XML스타일을 사용하길 권합니다. php코드를 XML이나 XHTML에 넣을 경우 <?php ?> 태그를 사용해야 표준과 호환을 유지할 수 있기 때문입니다.

Here Document 스타일
 <?
 // 예제 (ex #1
 echo <<<END
 이는 $variable 삽입을 가지는 여러 줄을
 출력하는 "here document" 구문을 사용합니다. here
 document 종료어는 줄에 세미콜론만을 가지고 있어야
 하며, 어떠한 공백도 없어야하는 점에 주의해야 합니다.
END;

 // 예제 (ex #2
 $str = <<<END
 이는 $variable 삽입을 가지는 여러 줄을
 출력하는 "here document" 구문을 사용합니다. here
 document 종료어는 줄에 세미콜론만을 가지고 있어야
 하며, 어떠한 공백도 없어야하는 점에 주의해야 합니다.
END;

 echo $str;
 ?> 

Allow ASP-style인 asp태그(<% %>) 스타일이 있는데, 그리 유효성을 갖지 않는 방법이라서 그다지 인기는 없어 보입니다. 이 태그를 사용하기 위해서는 php.ini의 asp_tags설정이 On으로 활성화되어 있어야 가능하며 php설치시 기본값은 Off입니다.


 <% echo ("aSp스타일입니다.");%>

참고로 코드내에 문자열을 출력하고자 할때는 echoprint로 표현하도록 하며 함수가 아니기 때문에 괄호로 표현할 필요는 없습니다. echoprint로 출력 가능한 정도는 문자열인 텍스트, 숫자, HTML 등 웹페이지에 포함되는 결과값으로 가져오며 가장 흔히 쓰이는 명령어입니다.
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요