PHP 시작 (1/2) - 이것만은 알고 시작하자.

2019. 7. 25. 01:35 PHP/php

PHP 시작  (1/2) - 이것만은 알고 시작하자.




PHP 시작 포스팅으로 PHP 프로그래밍의 기본적인 사항들을 간단하게 훝어보자.


기본적으로 PHP 문서는 .php 확장자로 끝난다. 웹 서버는 요청된 파일에서 이 확장자를 발견하면 자동으로 PHP 프로세서에 전달한다.

PHP 프로그램은 웹 브라우저에서 나타내기에 적합하며 완전한 파일을 돌려주어야 한다.



1. PHP 파서 호출

<?php  ?>  : PHP 문법을 사용하기 위해서는 PHP 파서를 사용해야 한다.


간혹 <?   ?> 이렇게 파서를 사용하는 경우가 있다. 프로그램 해석기인 PHP 파서가 호출되는지 분명하지 않지만 일반적으로 동작하는 대체 가능한 문법이다. 그러나 XML과 호환도 안 될뿐만 아니라 지금은 사라졌으므로 사용을 지양한다.



2. echo 문자열 출력

Hello world를 출력해 보자.


1
2
3
4
5
<?php

   echo "Hello world";

?>


PHP에서 문자열을 출력할때 echo 를 사용한다.



3. 주석

PHP에 주석을 붙이는 방법은 두 가지다. 첫 번째는 다음과 같이 두 개의 슬래시를 앞에 배치해 한 줄 주석으로 처리하는 방법이다.


// 이 표시가 주석이다.


주석이 여러 줄일 때는 아래와 같이 사용한다.


/*  */ 이 다중 줄에 대한 주석이다.


1
2
3
4
5
6
7
8
9
10
11
12
<?php

   // 이 표시가 주석이다.

  /*
     이 표시는 여러 줄에 걸친
    주석을 나타내고
    해석기에 의해서
    처리되지 않는다.
  */


?>



4. 세미 콜론

PHP 명령어는 세미콜론 (;)으로 끝난다.

세미콜론(;)을 붙이지 않을 경우, PHP가 다중 라인을 하나의 구문으로 인식해 해석할 수 없다는 것을 발견하고, 해석 오류 메시지가 발생한다.



5. 변수 선언

$ 심볼은 여러 프로그래밍 언어에서 다양한 용도로 사용돼 왔다.

PHP에서는 모든 변수 앞에 $ 심볼을 붙여야 한다. PHP 파서가 변수를 처리할 때 즉시 알 수 있어 더욱 빠르게 처리하기 때문이다.


1
2
3
4
5
<?php

   $count = 17;  // count 변수에 17 대입

?>



6. 배열

배열은 array(); 를 사용하여 생성한다.


1
2
3
4
5
6
7

<?php

   $team = array('Bill''Joe''Mike''Chris''Jim');

  // team이라는 변수에 배열을 생성하여 대입하였다.

?>


배열에서 특정 속성을 선택하기 위해서는 아래와 같이 사용한다.

속성 순번은 0 부터 시작한다.


1
2
3
4
5
6
7
8
9
<?php

   $team = array('Bill''Joe''Mike''Chris''Jim');

  // team이라는 변수에 배열을 생성하여 대입하였다.

   echo $team[3];  // 4번째 속성인 'Chris'를 출력한다.

?>



7. 2차원 배열

배열을 2차원으로 아래와 같이 활용할 수 있다.


1
2
3
4
5
6
7
8
9
<?php

  $oxo = array(array('x'' ''o'),
                    array('o'' ''x'),
                    array('x''o'' '));
                    
   // 3개의 배열을 array로 감싸 2차원 배열 생성

?>


속성 선택도 마찬가지다.


1
2
3
4
5
6
7
8
9
10
11
<?php

  $oxo = array(array('x'' ''o'),
                    array('o'' ''x'),
                    array('x''o'' '));
                    
   // 3개의 배열을 array로 감싸 2차원 배열 생성

  echo $oxo[1][2];   // 두번째 배열의 세번째 속성 'x' 출력

?>



8. 변수 네이밍 규칙

PHP 변수를 만들 때 다음 네 가지 규칙을 지켜야 한다.


- 변수의 시작은 알파벳이나 밑줄로 해야 한다.

- 변수의 이름에는 a-z 와 A-Z, 0-9, 밑줄만 쓸 수 있다.

- 변수 이름에는 공백을 넣을 수 없다. 하나 이상의 단어로 된 변수라면 밑줄을 이용해야 한다 (예, $user_name)

- 변수 이름은 대소문자를 구분한다. $High_Score는 $high_score와 다르다.



9. 연산자

연산자는 산술 연산자, 대입 연산자, 비교 연산자, 논리 연산자로 구분된다.


산술 연산자는 수학식을 연산한다.



연산자 

설 명

예 제

더하기 

$j + 1 

빼기 

$j - 6 

곱하기 

$j * 11 

나누기 

$j / 4 

모듈러스 

$j % 9 

++ 

1 증가 

++$j

-- 

1 감소 

--$j 












대입 연산자는 값을 변수에 할당한다.


연산자 

예제 

동일한 풀이 

=

$j = 15

$j = 15 

+= 

$j += 5 

$j = $j + 5 

-= 

$j -= 3 

$j = $j - 3 

*= 

$j *= 8 

$j = $j * 8 

/= 

$j /= 16 

$ = $j / 16 

.= 

$j .= $k 

$j = $j . $k 

%= 

$j %= 4 

$j = $j % 4











비교 연산자는 일반적으로 두 아이템을 비교하는 데 필요한 if 문 같은 구조에서 사용한다.


연산자 

설 명

예 제

==

같다 

$j == 4 

!= 

같지 않다 

$j != 21 

크다 

$j > 3 

작다 

$j < 100 

>= 

크거나 같다 

$j >= 15 

<= 

작거나 같다 

$j <= 8 









논리 연산자는 두 개의 참/거짓 입력을 가지고 하나의 참/거짓 결과를 만든다.


연산자 

설 명

예 제

&&

and 

$j == 3 && $k == 2 

and 

낮은 우선순위 and 

$j == 3 and $k == 2 

||

or 

$j <5 || $j > 10 

Or 

낮은 우선순위 or 

$j <5 or $j > 10 

Not 

!($j == $k) 

xor

Exclusive or 

$j xor $k









10. 변수 대입

변수에 값을 대입하는 문법은 항상 '변수 = 값' 이다.


1
2
3
4
5
<?php

   $x = 10;
  
?>



11. 문자열 연결

문자열 연결은 하나의 문자열을 다른 문자열에 연결하는 데 마침표(.)를 사용한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

  $msg = 5;

   echo "You Have " .$msg . "messages.";   // You Have 5 mesages. 출력
  
  $bulletin = "뉴스 단신 ";
  $newsflash = "뉴스 속보 ";

  $bulletin .= $nesflash;

  echo $bulletin;    //  뉴스 단신 뉴스 속보  출력

?>



12. 문자열 타입

PHP에는 인용 부호로 표현되는 문자열이 두 종류다.


정확한 내용을 유지하는 문자 그대로의 문자열을 할당하려면 다음과 같이 작은따옴표(' ')를 사용한다.


1
2
3
4
5
6
7
<?php

    $info = 'Preface variables with a $ like this: $variable';
    
    echo $info;  // Preface variables with a $like this: $variable   출력

?>


여기서 큰따옴표를 사용했다면 PHP는 $variable을 변수로 해석하려고 할 것이다.


문자열 내에 변수의 값을 넣고 싶으면 다음과 같이 큰 따움표를 사용한다.


1
2
3
4
5
6
7
8
<?php

    $count = 5;
    
    echo "There have been $count presidents of the US"
     // There have been 5 presidents of the US   출력

?>



13. 이스케이프 문자

가끔 문자열은 잘 못 해석될 수 있는 특별한 의미의 문자를 포함해야 할 때가 있다.

예를 들면 다음 코드는 PHP 파서로 sister's 에서 문장이 끝났다고 알리는 작은 따옴표를 전달하기 때문에 제대로 동작하지 않는다.


1
2
3
4
5
<?php

    $text = 'My sister's car is a Ford'; // 문법 오류

?>


이것을 정정하려면 다음과 같이 내부의 작은따옴표 앞에 역슬래시(\)를 넣어서 PHP가 문자로 인식해 해석하지 않도록 알려주어야 한다.


1
2
3
4
5
6
7
8
9
10
11
<?php

    $text = 'My sister\'s car is a Ford'
    
    echo $text// My sister's car is a Ford  출력
    
    $test2 = "My mother always said \"Eat your greens\",";
    
    echo $test2// My mother always said "Eat your greens".  출력

?>


또한 이스케이프 문자로 탭(\t), 새 줄(\n), 복귀(\r) 같은 특별한 문자를 문자열에 내에 추가할 수 있다.

하지만 이것들은 큰따옴표 내에서만 동작한다. 작은따옴표 내에서는 \t 자체를 출력한다.


1
2
3
4
5
6
7
8
9
10
11
<?php

    $heading = "Date\tName\tPayment";
    
    echo $heading// Date    Name    Payment   출력
    
    $heading2 = 'Date\tName\tPayment';
    
    echo $heading2;   // Date\tName\tPayment 출력

?>


작은 따옴표 내에서는 오직 작은 따옴표(\')나 역슬래시(\\)만이 이스케이프 문자로 인식된다.



14. 다중 라인 명령어

PHP에서는 꽤 많은 문장을 출력해야 하는 경우가 생긴다. 여러 개의 echo나 print문을 사용하는 것은 시간 낭비며 코드도 지저분해진다. PHP에서 이 문제를 해결하는 방법은 두 가지다.


첫번째는 따옴표 안에 다중 라인을 넣는 것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

    $author = "Alfred E Newman";
    
    echo "This is a Headline
    
    This is te first line.
    This is the second.
    Written by $author."
;
    
    // 다중 라인 출력

?>

두번째는 here-document나 간단히 heredoc으로 표현되는 <<< 연산자를 이용한 다중 라인 문장을 제공한다.
이것은 텍스트 내에 새 줄이나 공백(들여쓰기 포함)을 유지해 문자열 그대로를 명시하는 방법이다.
<<<_END
_END;
큰따옴표를 사용하는 것과 똑같이 _END 태그 내에 있는 모든것을 출력하게 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

    $author = "Alfred E Newman";
    
    echo <<<_END
    This is a Headline
    
    This is te first line.
    This is the second.
    - Written by $author.
    _END;
    
    // <<<_END   _END; 안의 내용을 그대로 출력

?>


_END 태그를 닫는 것은 중요하다. 이 태그는 꼭 새 줄의 처음에 있어야 하며, 이것 외에 다른것이 있으면 안된다. 주석(한 칸의 공백)도 허용되지 않는다. 다중 라인을 닫은 후에는 같은 태그를 다시 사용해도 된다.


* <<<_END ... _END를 사용하면 작은 따옴표나 큰따옴표를 쓰기위해 역슬래시(\)를 사용하는 이스케이프 문자 없이 마음 놓고 사용해도 된다. 브라우저에서 불러올때는 여러줄로 출력하지 않는다 단순히 공백으로 해석한다.



15. 변수 입력

PHP는 굉장히 느슨하게 입력된 언어다. 변수가 사용되기 전에 선언될 필요가 없으며, 사용될 때 PHP가 문장에서 요구되는 형식으로 변환한다.


1
2
3
4
5
6
7
<?php

   $number = 12345 * 67890;       // 838102050 대입
 
   echo substr($number, 3, 1);    // 1 출력

?>


대입할 때 $number는 숫자 변수였다. 그러나 두 번째 줄에서 substr을 호출한다. PHP는 $number인 838102050을 9개의 문자열로 변환하고, 결국 substr은 네번째 문자인 1을 반환한다.

문자열을 숫자로 바꿀때도 같다.


이것은 모두 변수 형식에 대해서 걱정할 필요가 없다는 것이다. 단지 의미가 통하게 변수에 값을 할당하고, 필요하다면 PHP가 변환한다.



16. 상수

상수는 한번 정의하면 그 값은 프로그램이 끝날 때까지 변하지 않는다.

상수에는 $ 를 붙이지 않고 정의할 때 define 함수만 사용할 수 있다.


1
2
3
4
5
6
7
8
9
<?php

   define("ROOT_LOCATION""/usr/local/www/");

   $directory = ROOT_LOCATION;

   echo $directory;  //   /usr/local/www/  출력

?>



상수를 정의할 때 일반적으로 대문자로 정의한다.



17. 미리 정의된 상수

PHP에는 일반적으로 초보자는 잘 사용하지 않을 가능성이 농후한 미리 정의된 상수가 많다. 이 매직 상수는 이름의 시작과 끝에 밑줄이 두 개씩 있으므로, 변수 선언시 이 매직 상수를 우연히 사용하게 되는 일은 없다.

 


매직 상수 

설 명 

__LINE__ 

파일의 현재 라인 위치 

__FILE__ 

파일의 전체 경로와 이름. Include 내부에 사용되면 Include가 포함된 파일의 이름을 반환. PHP 4.0.2부터는 __FILE__은 심볼 링크가 가리키는 절대 경로를 표시하는 반면, 그 전에는 상대 경로를 가질 수도 있음 .

__DIR__ 

파일의 디렉터리 이름. Include로 사용되면 포함된 파일의 디렉터리가 반환. 이것은 dirname(__FILE__)과 같다. 이 디렉터리에는 root를 제외하고는 슬러시가 없음(PHP 5.3.0부터 포함) 

__FUNCTION__ 

함수 이름. (PHP 4.3.0부터 포함) PHP 5는 대소문자가 정의된 대로 함수 이름을 반환. PHP4에서는 항상 소문자로만 반환 

 __CLASS__

클래스 이름 반환.(PHP 4.3.0부터 포함) PHP5는 대소문자가 정의된 대로 클래스 이름을 반환. PHP4에서는 항상 소문자로만 반환 

__METHOD__ 

클래스 메소드 이름(PHP 5.0.0부터 포함). 메소드 이름은 대소문자 구분해 정의된 대로 반환 

__NAMESPACE__ 

대소문자 구분한 현재 네임스페이스. 이 상수는 컴파일할 때 정의(PHP5.3.0부터 포함) 


이 상수의 한 가지 편리한 사용법은 다음과 같은 줄을 삽입해 프로그램 실행 도중에 해당 라인까지 도달하는지 확인하는 디버깅용이다.
1
2
3
4
5
6
<?php

   echo "This is line ".__LINE__." of file ".__FILE__; 
   // 현재 라인과 파일명을 대입하여 출력한다.

?>


출처: https://hyeonstorage.tistory.com/101?category=549768 [개발이 하고 싶어요]

18. echo와 print 명령어의 차이점

echo 명령어 대신에 print 명령을 사용할 수도 있다. 두 명령은 서로 상당히 비슷하지만, print는 매개 변수를 취하는 실제 함수인 반면, echo는 PHP 언어의 구조에 포함된다.

대체로 echo 명령은 일반적인 텍스트 출력에는 print보다 약간 빠르다. 함수가 아니므로 따로 리턴 값을 설정하지 않기 때문이다.

반면에 함수가 아니므로 echo 명령은 복잡한 표현에는 사용할 수 없다. 하지만 print는 사용할 수 있다.


1
2
3
4
5
6
7
8

<?php

  $b = TRUE

  $b ? print "TRUE" : print "FALSE";   
   // TRUE 출력

?>


$b가 TRUE 이므로 왼쪽의 "TRUE" 가 출력된다.

일반적으로 출력은 echo를 사용하며 그렇게 하는 것을 권장한다. print 사용은  PHP 개발 도중에 print가 사용될 필요 조건을 찾을 때까지다.



19. 함수

함수(function)은 특정 태스크를 실행하는 코드를 섹션으로 나누는 데 사용된다. 함수를 사용하면 소스코드의 크기가 작아질 뿐만 아니라 가독성이 높아진다.


1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

  function longdate($timestamp){
   
     return date("l F jS Y"$timestamp);
     
   }

  echo longdate(time());    // 오늘 날짜 출력

  echo longdate(time() - 17 *24 * 60 *60); // 오늘 날짜에서 17일전 날짜 출력

?>



20. 변수 범위 (지역 변수, 전역 변수, 고정 변수, 슈퍼전역 변수)

PHP의 변수 범위는 지역 변수, 전역 변수, 고정 변수, 슈퍼전역 변수로 구분된다.


지역 변수 함수 내에서만 정의돼 사용되는 변수다.


1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

  function longdate($timestamp){
   
     $temp =  date("l F jS Y"$timestamp);
     
     return "The date is $temp";
    
   }

   echo $temp;    // 오류 발생

?>


함수 안에서 정의된 $temp 는 함수 밖에서 사용할 수 없다.



전역 범위의 변수가 필요한 경우가 있다. 모든 코드에서 그 변수에 접근하는 것이 필요하기 때문이다. 또한 어떤 데이터는 크고 복잡해서 계속 함수에 매개 변수로 전달하기를 원하지는 않을 것이다.

전역 범위의 변수를 정의하려면 global 키워드를 사용한다.


전역 변수는 주의해서 사용해야 한다. 전역 변수가 너무 많으면 전역 변수로 정의된 이름 중 하나를 지역 변수로 쓰거나, 적어도 전역 변수로 이미 지정돼 있는 변수를 지역적으로 사용하는 위험이 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

  global $ADMIN = "root";

  function printAdmin(){
     
     return $ADMIN;
    
   }

   echo printAdmin();    // root 출력

?>


전역 변수도 대문자로 사용하는 습관을 들이는게 좋다.



고정 변수는 앞에서 호출한 수의 변수의 마지막 값을 유지하고 있는다.

고정변수는 지역 변수와 같이 함수외 다른 부분에서 접근할 수 없지만, 다음 번에 함수가 호출될 때 그 값을 유지하게 된다. 고정변수는 static을 사용한다. 처음 static으로 변수 선언 후 다시 static 선언 라인을 만나면 그냥 넘어간다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

  function test(){
     
    static $count = 0;
    
    echo $count;
    
    $count ++;
    
   }

   echo $count;    // 0 출력

   echo $count;   // 1 출력

?>
















고정 변수를 사용하려면 변수를 정의할 때 표현식의 결과를 대입하는 것은 불가능하다.

1
2
3
4
5
6
7
8
9
<?php

  static $int = 0;      // 허용
  
  static $int = 1+2;   // 불가 (해석 불가 오류 발생)

  static $int = sqrt(144);   // 불가

?>









슈퍼전역 변수는 PHP 4.1.0 사용할 수 있는 미리 정의된 변수이다. 프로그램 내에서 전역이며 어디서든지 접근이 가능한 슈퍼 전역 변수다.

슈퍼전역 변수 이름 

내 용 

 $GLOBAL

현재 스크립트의 전역 범위 안에 정의된 모든 변수, 변수 이름은 배열의 키 

 $_SERVER

헤더, 패스, 스크립트 위치 등에 관한 정보. 이 배열의 엔트리는 웹 서버가 만들지만 모든 웹 서버가 동일하게 일부나 전체 정보를 제공하리라는 보장은 없음. 

$_GET 

HTTP GET 명령으로 현재 스크립트로 전달되는 변수 

$_POST 

HTTP POST 명령으로 현재 스크립트로 전달되는 변수 

$_FILES 

HTTP POST 명령으로 현재 스크립트로 전달되는 아이템 

$_COOKIE 

HTTP 쿠키를 통해서 현재 스크립트로 전달되는 변수 

$_SESSION 

현재 스크립트에 유효한 세션 변수 

$_REQUEST 

브라우저에서 전달되는 정보 내용. 기본적으로 $_GET, $_POST, $_COOKIE 

$_ENV 

환경 변수를 통해서 스크립트로 전달하는 변수 















페이지 참조 정보 확인


1
2
3
4
5
<?php

  $came_from = $_SERVER['HTTP_REFERRER'];  // 페이지 방문 참조 경로

?>


사용자가 URL을 웹 브라우저에 직접 입력해 웹 페이지에 접속하면 $came_from은 빈 문자열이 된다.


해커는 악의 적인 코드와 함께 슈퍼전역 변수를 부를 수 있다. 슈퍼전역 변수를 사용하기 전에 항상 안전한지 확인해야 한다. 한 가지 방법은 htmlentities 함수를 사용하는 것이다. 이 함수는 모든 문자를 HTML 개체로 바꾼다. 예를 들어, 작거나 큰 문자< 와 > 는 &lt 와 &gt로 변환된다. 모든 인용 부호와 역슬래시, 다른 것도 모두 변환된다. 따라서 $_SERVER(그리고 다른 슈퍼 전역 변수)에 접근하는 더 나은 방법은 다음과 같다.


1
2
3
4
5
<?php

  $came_from = htmlentities($_SERVER['HTTP_REFERRER']);  // 페이지 방문 참조 경로

?>



출처: https://hyeonstorage.tistory.com/101?category=549768 [개발이 하고 싶어요]