d0r1

[php] 기초 정리하기 본문

이것저것/관심

[php] 기초 정리하기

d0r1 2023. 9. 12. 11:09

php란?

서버측 스크립트

내려받기 전 웹 서버에서 실행된다

내려받아서 확인할 때엔, HTML 코드만 노출되며, php 코드는 노출되지 않는다

키워드, 클래스, 함수, 사용자 함수 이름의 대소문자를 구문하지 않는다

 

장점

코드가 노출되지 않기 때문에, 보안성이 좋다

웹브라우저 버전 및 종류에 영향을 받지 않는다

 

단점

실시간 대응에 미흡하다

 


PHP 기초 구문 작성법

1. PHP 문법

1.1. 코드 영역

1. PHP 권장 스타일      : <?php ... ?>

2. HTML 스크립트 스타일 : <script language = "php"> ... </script>

3. SGML 스타일          : <? ... ?>

4. ASP 스타일           : <% ... %>

php는 다음과 같은 태그를 이용하여, php의 시작과 끝이 어딘지 알려줄 수 있다.

html의 <html> </html> 처럼

 

<?php  ~~~~~~~ ?>

안의 문장은 C언어와 동일하게 ;(세미콜론)으로 끝을 맺는다

그러나, 코드가 종료되면 자동으로 세미콜론을 적용해주기에, <?php echo"123" ?> 또한 정상적으로 작동한다.

또한, ?> 태그를 생략할 수 있다.

 

1.2. 주석

1. 한 줄 : //

2. 쉘 스타일로 한 줄 : #

3. 여러 줄 : /* */

PHP 주석은 줄의 끝이나, 코드 영역을 나타내는 종료 태그 중 먼저 나오는 부분까지만 주석으로 처리한다

그러므로, 종료 태그 후에 나오는 주석은 HTML 코드로 인식되어, 작동하게 된다.

 

1.3. echo()

printf의 개념을 생각하면 된다. 

실제 함수가 아니기에, 인수를 전달할 때 괄호를 사용해도 되며, 생략할 수도 있다.

가변 길이 인수와 같이 함수 문맥으로는 사용할 수 없다. 

또한, 두 개 이상의 인수를 전달할 시에는 괄호를 사용해서는 안된다.

 

2. PHP 기초

2.1. 변수

데이터를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간

C언어와 달리, 변수를 선언할 시, 타입을 명시하지 않는다

$(달러)를 표현하여 변수를 선언할 수 있다

$var = value;
(생성규칙)

1. 변수의 이름은 영문 대소문자, 숫자, 언더바(_)로만 구성된다
2. 변수 이름은 숫자로 싲가할 수 없다
3. 공백이 포함되면 안된다
4. $this는 사용할 수 없다
5. 변수는 대소문자가 구별된다

문자열 내에서 변수를 사용하게 되면, PHP는 변수에 지정된 값으로 자동 변환해준다

이때 변수의 이름 뒤에 다른 문자가 오면, 변수의 이름을 정확히 인식하지 못한다

그러므로, {}(중괄호)로 변수의 이름을 감싸서, 어디까지가 변수의 이름인지 명시해야한다

[+] 그럼 "$"는 문자열로 못쓰나요?

\ "이스케이프"를 사용하여 표현할 수 있습니다

$var = 10;

echo "$var" --> 10
echo "{$var}" --> 10
echo "$varis10"--> error
echo "\$var is $var" --> $var is 10

2.2. 변수의 초기 값

타입 기본값
boolean FALSE
int 0
float 0.0
string NULL
array NULL

2.3. 변수의 종류

변수는 다음과 같이 구분한다

1. 지역 변수

2. 전역 변수

3. 정적 변수

 

2.3.1. 지역 변수

함수 내부에서 선언된 변수는 오직 함수 내부에서만 접근할 수 있다

또한, 함수 호출이 끝나면 메모리에서 제거된다

function calc() {
	$a = 10; // local variable 
    $b = 20; // local variable
    echo "{$a} {$b}" --> 10 20 
}

calc();
echo "{$a} {$b}" --> 0 0

 

2.3.2. 전역 변수

함수 밖에서 선언된 변수는 함수 밖에서만 바로 사용할 수 있다

만약 함수 내에서 사용하고자 하면, global 키워드를 함께 써야한다

$var = 10; // global variable
function calc() {
	echo "{$var}"; --> NULL
    global $var; 
    echo "{$var}"; --> 10
 }
 calc();
 echo "{$var}"; --> 10

 

2.3.3. 슈퍼글로벌 

PHP는 미리 정의된 전역 변수인 슈퍼글로벌을 제공한다

특별한 선언 없이 스크립트 내의 어디에서나 사용할 수 있다

 

제공되는 슈퍼글로벌은 다음과 같다

1. $GLOBALS

2. $_SERVER

3. $_GET

4. $_POST

5. $_FILES

6. $_COOKIE

7. $_SESSION

8. $_REQUEST

9. $_ENV

 

2.3.4. 정적 변수

함수 내부에서 static 키워드로 선언한 변수이다

함수 내부에서 선언된 정적 변수는 호출이 끝나도 메모리상에서 사라지지 않는다

지역 변수처럼 해당 함수 내부에서만 접근할 수 있다

function counter() {
    static $count = 0;
    echo "함수 내부에서 호출한 static 변수 count의 값은 {$count}입니다.<br>";
    $count++;
}
counter(); 0
counter(); 1
counter(); 2

 

2.4. 상수 (constant)

변수와 마찬가지로 데이터를 저장할 수 있는 메모리 공간을 의미한다

그러나, 다른 점이라면, 스크립트가 실행되는 동안 그 데이터를 변경하거나 해제할 수 없다는 점이 다르다

 

2.4.1. define()

define()을 통해 상수를 선언할 수 있다

define( 상수이름, 상숫값, 대소문자 구분여부 )

대소문자 구문여부의 경우, 기 본 값은 false로 대소문자를 구분한다

이렇게 선언된 상수는 스크립트 어디에서도 참조할 수 있다

그러나, 선언되기 전의 영역에서는 해당 상수를 참조 할 수 없다

 

2.4.2. 마법 상수

어떤 스크립트에서도 사용할 수 있는 미리 정의된 다양한 상수이다

상수 이름 설명
__LINE__ 파일의 현재 줄 번호를 반환
__FILE__ 파일의 전체 경로와 이름을 반환
include 내부에서 사용할 경우, include된 파일명을 반환
__DIR__ 파일 디렉터리를 반환
포함한 파일 안에서 사용할 경우 포함된 파일의 디렉터리를 반환
dirname(__FILE__)과 같은 결과를 반환
__FUNCTION__ 함수의 이름을 반환
__CLASS__ 클래스의 이름을 반환, 클래스 이름은 대소문자를 구분
__TRAIT__ 트레이트(trait)의 이름을 반환
트레이트의 이름은 트레이트를 선언한 네임스페이스를 포함
__METHOD__ 클래스의 메소드 이름을 반환
__NAMESPACE__ 현재 네임스페이스의 이름을 반환
function magicCons() {
    echo __LINE__;     // 파일의 현재 줄 번호를 반환함.
    echo __FUNCTION__; // 함수의 이름을 반환함.
    echo __METHOD__;   // 클래스의 메소드 이름을 반환함.
}
magicCons();

 

2.5. 타입

2.5.1. 불리언 

참과 거짓을 표현. 대소문자를 구분하지 않는다

만약 int(0), float(0.0), NULL 은 false로 인식된다.

그러나, 문자열 "false"는 빈 문자열이나 문자열 "0"은 아니기에, true로 인식된다

 

2.5.2. 정수

정수는 부호를 가지는 소수부가 없는 수를 의미한다

PHP에서 정수의 표현 범위를 운영체제에 따라 달라지며, 64비트를 기준으로는 -2^63~(2^63-1) 사이의 값을 가진다

PHP에서는 부호가 없는 정수(unsigned integer)는 지원하지 않는다

또한, 표현 방법에는 10진수(dec), 8진수(Oct--0), 16진수(hex--0x) 로 표현할 수 있다

만약, 정수의 최대 범위를 넘는 값이 대입되면, 그 변수는 자동으로 실수형(float)로 인식된다

echo "integer 타입의 크기는 ".PHP_INT_SIZE."바이트 입니다.<br>";
echo "integer 타입이 표현할 수 있는 가장 큰 수는 ".PHP_INT_MAX." 입니다.<br>";
$int_01 = 100;
var_dump($int_01);
	
echo "<br>";
$int_02 = PHP_INT_MAX;		// integer가 표현할 수 있는 범위를 넘지 않는 값을 대입함.
var_dump($int_02);
	
echo "<br>";
$int_03 = PHP_INT_MAX + 1;	// integer가 표현할 수 있는 범위를 넘는 값을 대입함.
var_dump($int_03);

----------------------------------------------------------------------------------
integer 타입의 크기는 8바이트 입니다.
integer 타입이 표현할 수 있는 가장 큰 수는 9223372036854775807 입니다.
int(100)
int(9223372036854775807)
float(9.223372036854776E+18)

2.5.3. 실수

소수부나 지수부를 가지는 수를 의미하며, 정수보다 더 넓은 표현 범위를 갖는다

실수의 표현 범위는 운영체제에 따라 달라지며, 대략 ~1.8e307까지 표현할 수 있다

그러나 컴퓨터에서는 실수형끼리 직접 값을 비교하는 것을 피하는게 좋다

e와 E는 모두 지수 표현이 가능하다

또한, 실수 범위를 넘는 값이 대입되면, 자동으로 정의된 상수인 INF로 인식된다

$float_01 = 3.14;
var_dump($float_01);

echo "<br>";
$float_02 = 1.23e-4;
var_dump($float_02);

echo "<br>";
$float_03 = 1.8E307;	// float이 표현할 수 있는 범위를 넘지 않는 값을 대입함.
var_dump($float_03);

echo "<br>";
$float_04 = 1.8E308;	// float이 표현할 수 있는 범위를 넘는 값을 대입함.
var_dump($float_04);
-----------------------------------------------------------------------
float(3.14)
float(0.000123)
float(1.8E+307)
float(INF)

2.5.4. 문자열

문자열은 "" 혹은 ''로 감싸서 표현할 수 있다

ASCII 인코딩 환경에서는 영문자는 한 글자당 1바이트, 한글으르 한 글자당 2바이트로 표현된다

UTF-8 인코딩에서는 영문자는 한 글자당 1바이트, 한글은 한 문자당 3바이트로 표현된다

$str_01 = "PHP";
$str_02 = "자바스크립트";

echo strlen($str_01)."<br>";	// 3
echo strlen($str_02);			// 18

2.5.5. 배열

배열은 한 쌍의 키(KEY)와 값(VALUE)로 이루어진 맵(MAP)으로 구성되는 순서가 있는 집합을 의미한다

맵의 키 값으로는 정수와 문자열만이 가능하며, 하나의 배열에 두 가지 키 값을 같이 사용할 수 있다

만약 정수와 문자열 이외의 다른 타입의 값을 키로 사용하면, 내부적으로 다음과 같이 타입 변환이 이루어진다

 

불리언 true - 1, false - 0 으로 자동 타입 변환이 이루어진다

유효한 숫자로만 이루어진 문자열은 정수나 실수로 자동 타입 변환된다

실수는 소수 부분이 제거되며, 정수로 자동 타입 변환이 된다

NULL은 빈 문자열로 자동 타입 변환된다

배열과 객체는 배열의 키 값으로 사용할 수 없다

$arr = array(
    1 => "첫 번째 값",		// php의 배열에서 키값의 1과 "1"은 같은 값을 나타냄.
    "1" => "두 번째 값",	// 같은 키값을 사용하여 두 번 선언했기 때문에 나중에 선언된 "두 번째 값"만 남게됨.
    10 => "세 번째 값", 
    -10 => "네 번째 값"
);
var_dump($arr);

echo "<br>";
echo $arr[1]."<br>";
echo $arr["1"]."<br>";
echo $arr[10]."<br>";
echo $arr[-10];
------------------------------------------------------
array(3) { [1]=> string(14) "두 번째 값" [10]=> string(14) "세 번째 값" [-10]=> string(14) "네 번째 값" }
두 번째 값
두 번째 값
세 번째 값
네 번째 값

2.5.6. 객체

클래스의 인스턴스를 저장하기 위한 타입이다

객체는 속성과 메소드를 포함할 수 있다

class Lecture
{
    function Lecture()
    {
        $this->lec_01 = "PHP";
        $this->lec_02 = "MySQL";
    }
}

$var = new Lecture;	// 객체 생성
echo $var->lec_01;	// 객체의 속성 접근
echo "<br>";
echo $var->lec_02;

2.5.7. 리소스

PHP 외부에 존재하는 외부 자원을 의미한다

리소스는 데이터베이스 함수 등에서 데이터베이스 연결 등을 반환할 때 사용된다

 

2.5.8. NULL

오직 한 가지만을 가질 수 있는 특별한 타입

아직 어떠한 값도 대입되지 않은 변수를 의미

$var_01;
var_dump($var_01);	// 초기화되지 않은 변수를 참조

echo "<br>";
$var_01 = 100;		// $var_01 변수를 초기화함.
var_dump($var_01);

echo "<br>";
unset($var_01);		// $var_01 변수를 삭제함.
var_dump($var_01);	// 삭제된 변수를 참조
----------------------------------------------
NULL
int(100)
NULL

 

2.6. 타입 변환

2.6.1. 자동 타입 변환

앞서 말했듯, 변수를 선언할 때 타입을 명시할 필요가 없다

따라서, php의 타입 강도는 매우 약하며, 타입이 동적으로 결정된다

 

2.6.2. 강제 타입 변환

입력되는 값에 따라 타입이 변한다고 하였는데, 사용자가 직접 데이터의 타입을 변환해야하는 경우가 있다

이 경우에는 타입 캐스트의 연산자인 괄호()를 사용하여 수행할 수 있다

$var_01 = 10;
var_dump($var_01);           // int(10)  

$var_02 = (boolean) $var_01;
var_dump($var_02);           // bool(true)

 

$var_03 = 0;
var_dump($var_03);           // int(0)  

$var_04 = (boolean) $var_03;
var_dump($var_04);           // bool(false)

 

2.6.3. 가변 변수

변수의 타입만 아니라, 변수의 이름까지 동적으로 바꿀 수 있다

$PHP = "HTML";
$HTML = "CSS";
$CSS = "JavaScript";
$JavaScript = "Ajax";
$Ajax = "PHP";  

echo $PHP;       // HTML
echo $$PHP;      // $HTML -> CSS
echo $$$PHP;     // $$HTML -> $CSS -> JavaScript
echo $$$$PHP;    // $$$HTML -> $$CSS -> $JavaScript -> Ajax
echo $$$$$PHP;   // $$$$HTML -> $$$CSS -> $$JavaScript -> $Ajax -> PHP
echo $$$$$$PHP;  // $$$$$HTML -> $$$$CSS -> $$$JavaScript -> $$Ajax -> $PHP -> HTML
echo $$$$$$$PHP; // $$$$$$HTML -> $$$$$CSS -> $$$$JavaScript -> $$$Ajax -> $$PHP -> $HTML -> CSS ...