나무모에 미러 (일반/어두운 화면)
최근 수정 시각 : 2024-10-02 17:15:41

PHP/문법

파일:상위 문서 아이콘.svg   상위 문서: PHP
프로그래밍 언어 문법
{{{#!wiki style="margin: -16px -11px; word-break: keep-all"<colbgcolor=#0095c7><colcolor=#fff,#000> 언어 문법 C(포인터 · 구조체 · size_t) · C++(자료형 · 클래스 · 이름공간 · 상수 표현식 · 특성) · C# · Java · Python(함수 · 모듈) · Kotlin · MATLAB · SQL · PHP · JavaScript · Haskell(모나드)
마크업 문법 HTML · CSS
개념과 용어 함수(인라인 함수 · 고차 함수 · 람다식) · 리터럴 · 상속 · 예외 · 조건문 · 반복문 · 참조에 의한 호출 · eval · 네임스페이스
기타 #! · == · === · deprecated · NaN · null · undefined · 배커스-나우르 표기법
프로그래밍 언어 예제 · 목록 · 분류 }}}

1. 개요2. 편집 지침3. 기본 문법
3.1. 명령 구분3.2. 주석
4. 자료형5. 변수
5.1. 미리 선언된 변수5.2. 변수의 범위
6. 상수7. 표현식과 연산자
7.1. 연산자의 이용
7.1.1. 산술 연산자7.1.2. 논리 연산자
8. 기본 입출력9. 함수
9.1. 함수의 선언9.2. 변수에 함수 할당9.3. 익명 함수9.4. 화살표 함수9.5. 즉시실행 함수
10. 객체 지향
10.1. 클래스10.2. 인터페이스10.3. 트레이트

1. 개요

2. 편집 지침

3. 기본 문법

기본적인 PHP코드는 다음과 같다.

각 php파일은 <?php로 시작되며 끝태그(?>)는 php코드만 있을 경우 붙이지 않는 것을 권장한다.[1] short_open_tag를 활성화시키면 <?로 시작할 수 있지만 이는 XML 문법과 혼동의 여지가 있어 권장되지 않는다.

3.1. 명령 구분

PHP에서는 명령이 끝나면 반드시 세미콜론을 붙여야 한다. 붙이지 않아도 되는 경우는 단 하나, 명령 바로 뒤에 ?>가 후행할 경우 뿐이다.

3.2. 주석

PHP에서 주석을 처리하는 방법에는 세 가지가 있다. 다른 종류의 주석이 섞여 있으면 중첩할 수 없다.

3가지 방법이 있지만 // 와 /* 여러줄주석 */ 이 주로 쓰인다.
#!syntax php
<?php
// C++ 형태의 한 줄 주석
# 쉘 형태의 한 줄 주석
/*
여러 줄 주석
*/

4. 자료형

자료형(타입)의 종류는 아래와 같다.
double이라는 자료형을 추가로 소개하는 경우가 있는데, PHP공식 문서를 보면 float과 동일하게 취급하며, 단지 역사적 사유로 두 이름이 생겼다고 한다. float 사용이 권장이다.

변수형을 지정해 줄 필요가 없으며, 사용처에 따라 PHP엔진에서 자동으로 결정한다.
이용할 수 없는 변수를 참조하거나 쓰려고 하면 undefined가 표시된다.

그 밖에 union 등이 있다.

이들의 자료형을 확인하는 함수도 있다. 자세한 내용은 후술한다.

5. 변수

<?php
$a = 1;
}}}<?php
$a = 'b';
$b = 1;
echo $$a; // 1
}}}

5.1. 미리 선언된 변수

PHP 4까지는 $this가 임의의 변수로 사용하는 게 가능했지만, PHP 5에서 클래스 내의 자기 참조자 기능이 부여되면서 클래스 밖에서 $this를 쓸 시 예외를 발생시키게 되었다.

미리 선언된 변수(Predeclared variables) PHP 엔진에서 예약한 변수라서 사용자가 해당 이름을 쓸수없다.

5.2. 변수의 범위

<?php
$a = 1; // 기본적으로 선언한 변수는 전역변수이다.
$b = 2;

function foo()
{
global $b; // 전역변수 $b를 사용할 수 있게 해 준다. 쉼표를 통해 여러 개를 정의할 수 있다.
echo $a; // 전역변수 a가 아닌 지역변수 a를 불러온다. 따라서 지정되지 않은 변수다.
echo $b; // 전역변수 b를 불러와 2가 정상적으로 출력된다.
echo $GLOBALS['a']; //비권장 사항이며 PHP 8.1 부터는 Deprecate 되는 사용법이다.
}
}}}

6. 상수

<?php
const CON = "상수";
const CON = "상수"; // 같은 이름이므로 뒤에 것은 무시 당하고 앞에 쓴 거를 사용한다.
define("상수명1", "상수");
define("상수명1", "상수1아님ㅋ"); // 같은 이름이므로 뒤에 것은 무시 당하고 앞에 쓴 거를 사용한다.
}}}

7. 표현식과 연산자

7.1. 연산자의 이용

변수와 변수 사이, 변수의 앞과 뒤에 연산자가 붙는다.
연산자는 어떠한기능을 문법적기호로 만들어 둔것을 말한다.

여러 연산자가 있을때 우선순위가 있다.[5]
이 표에서 위쪽에 있는것이 우선순위가 높다.
우선 순위가 같은부류는 표사이의 간격으로 표시했다.
위치 연산자 결합방향 기능

왼쪽 new 새로운 객체를 생성한다.
왼쪽 clone 기존 객체를 면제한다.
[] 왼쪽에서 오른쪽 배열을 생성한다.

왼쪽 ->(화살표) 왼쪽에서 오른쪽 객체의 프로퍼티를 참조한다.

왼쪽 + , - 숫자의 양수 음수표기 예) -3
무관 ++, -- 1증가, 1감소
무관 ~ 비트연산 중 not 연산을 한다.
왼쪽 (int), (float), (string), (bool) (array), (object) 괄호안에 적은 타입으로 형변환을 한다.
왼쪽 @ (에러 컨트롤연산자) 코드가 적힌 해당줄에서 일어나는 오류를 무시한다.

왼쪽 instanceof 어떤 클래스에서 생성한 인스턴스인지 확인 true, false 를 반환한다.

7.1.1. 산술 연산자

연산자 +,-,*,/를 통해 사칙연산을 할 수 있다. 그 외는 다음과 같다.
연산자 기능
** 왼쪽 수를 오른쪽 수만큼 제곱한다.
++ 1을 더한다.
-- 1을 뺀다.
- 부호를 바꾼다.

7.1.2. 논리 연산자

논리 연산자는 다음과 같다. 우선순위 순으로 나열한다.

8. 기본 입출력

<?php
$a = 'world';
// 온점으로 문자열을 붙여서 출력한다.
echo 'Hello '.$a;
// 반점으로 붙일 수도 있다.
echo 'Hello', $a;
// 아예 함수처럼 쓸 수도 있다. 물론 이렇게 쓴다고 해서 echo가 함수는 아니다.
echo('Hello', $a);
}}}
{{{#!syntax php
<?php
// 둘 다 된다.
print("Hello world");
printf("Hello world");
}}}<?php
// 기존 방법대로 print나 echo를 활용한다.
echo '<hr>';
// 코드블럭을 일시적으로 닫고 HTML을 직접 작성한다.
?><hr>
}}}<?=$view?>
}}}

9. 함수

9.1. 함수의 선언

함수선언은 function 키워드로 한다.
#!syntax php
<?php
    function add($a, $b) // 정수 두개를 더하는 함수
    { 
            return $a + $b;
    }
    add(1, 2); // 함수 사용. 3을 반환한다.

매개변수 타입과 리턴 타입을 지정할 수도 있다. 리턴 타입은 함수이름 끝에 : 타입
#!syntax php
<?php
    function add(int $a, int $b ): int // int 형으로 반환한다.
    { 
        return $a + $b;
    }  
    add(1, 2); // 함수 사용.

매개변수에 기본값을 지정하는 것도 가능하다.
#!syntax php 
<?php
    function add($a = 'bar' )
    { 
        return $a;
    }  
    add('foo'); // foo 반환
    add(); // bar 반환

매개변수 앞에 &을 붙이면 참조를 통해 값을 전달할 수 있다. ...을 사용해 여러 인자를 받을 수 있다.
#!syntax php
<?php
    function add(...$a)
    { 
        return $a[0] + $a[1];
    }  
    add(1, 2); // 함수 사용. 3을 반환한다.

9.2. 변수에 함수 할당

#!syntax php
// PHP에서는 변수에 객체, 배열, 함수, int, string, float 타입의 값과 같이 다양한 것을 대입할 수 있다.
$test = function myName()
{
    return '홍길동';
}

$test(); // myName() 함수 사용

9.3. 익명 함수

#!syntax php 
<?php
    $add = function (int $a, int $b ): int // $add 라는 변수에 대입
    { 
        return $a + $b;
    };

    $add(1, 2);

9.4. 화살표 함수

#!syntax php
$add = fn($x, $y) => $x + $y; // 익명함수를 $add 라는 변수에 할당하고 있다.
$add(1,2); // 리턴 값 3,     변수에 할당 했으므로 실행할때도 변수를 통해 호출한다.

(fn($x, $y)=>$x +$y)(1,2) // 즉시 실행함수로 선언 한 예시

//-----------  아래는 클로저를 이용한 예시이다.

$y = 1; 
$add = fn($x) => $x + $y;    // 선언
$add(2);  //리턴 값 3
// 실행   클로저는 클로저가 선언된 바깥의 변수를 참조 할 수 있어서 
//변수 y의 1과 매개변수 x의 2로  1+2 가 되었다.

//위 코드와 같은 코드를 기존문법으로 적으면

$y = 1;
$add = function($x) use ($y)  //PHP 에서 클로저는 use 키워드를 사용했다.
{   
    return $x + $y;
}
$add(2);  //리턴 값 3


9.5. 즉시실행 함수

#!syntax php 
<?php
   (function (int $a, int $b ): int
    { 
        return $a + $b;
    })(1,2); // 바로  실행됨 
    

10. 객체 지향

10.1. 클래스

#!syntax php
//Animal.php
<?php
    class Animal {  // 동물에 관한 클래스
        private string $eatType; //먹이 종류
        private int $legs; // 다리개수
        
       function  __construct($eatType, $legs)
        {
            $this->eatType = $eatType;  //객체에 접근할때에는 -> 를 이용한다.
            $this->legs = $legs;
        }

        function getEatType(){
            return $this->eatType;
        }
        
        function setEatType($eatType){
            $this->eatType = $eatType;
        }
        
        function getLegs() {
            return $this->legs;
        }
        
        function setLegs($legs) {
            $this->legs = $legs;
        }
    
    }

    //초식을 하는 네발 짐승
    $animal1 = new Animal("초식", 4); // 객체 생성할때 new 를 쓴다.

    $animal1->eatType = "잡식";  // $eatType 이 private 이라 접근불가

    $animal1->getEatType(); // getter와 setter 를 만들어 접근해야한다.
    
    

PHP의 객체지향은 PHP 5.2부터 도입되어 기능이 늘어나고 있다. 클래스는 크게 두 가지로 구성되어있다. 데이터와 함수이다. 여기서 클래스의 데이터가 들어갈 변수는 프로퍼티라고 부른다. 함수는 클래스의 프로퍼티를 입출력하거나 조작하는데 메서드라고 부르기도 한다.

PHP에서 클래스는 기본적으로 public이다. PHP 클래스에서 프로퍼티 private, public, protect로 접근제한자를 지정할 수 있다.

생성자는 fucntion __constructor()를 쓴다. 생성자란 '클래스에서 객체를 생성할때 안에 들어갈 데이터를 어떤값으로 설정하는가?'에 대한 방법을 정의한 메서드이다. PHP 5부터 바뀐 문법이다. PHP 4까지는 클래스명과 동일한 이름의 메소드를 생성자로 삼았다.

클래스 안에서 클래스의 프로퍼티에 접근할때는 "$this->프로퍼티"를 쓰며 -> 뒤에 $ 기호를 붙이지 않는다.[6]
<?php
class bird extends Animal {
private $wings; //날개
function __construct($eatType, $legs, $wings);
{
parent::__construct($eatType, $legs); // 부모클래스의 기능을 호출할때 parent::함수이름으로 호출한다.
$this->wings = 2;
}
function getWings() {
return $this->wings;
}function setWings($wings) {
$this->wings = $wings;
}

}
$비둘기 = new bird("잡식", 2, 2);
$삼족오 = new bird("잡식", 3, 2);
//Animal을 extends 했기 때문에 부모클래스인 Animal 클래스의 메서드를 쓸 수 있다.
echo $비둘기->getLegs(); // 2
echo $삼족오->getLegs(); // 3
}}}

10.2. 인터페이스

추상 메서드

10.3. 트레이트


[1] PHPStorm 같은 IDE에서부터 클래스 파일이 아닌 이상 끝태그 뒤에 아무것도 없으면 노란 밑줄이 쳐지고 '끝태그를 없앨 것'을 도움말로 띄울 정도이다.[2] PHP 5.3에서 추가되었다.[3] PHP 7.1에서 도입[4] PHP 8부터는 빈값을 리턴하고 경고를 띄운다.[5] 사칙연산을 예로 들면 *,/ 가 +,- 보다 먼저계산해야된다는 것과 같은의미[6] -> 뒤에 $를 붙이는 경우는 상황에 따라 프로퍼티를 달리 취해야 하는 경우이다. 위의 달러 여러 개 쓰는 변수와 비슷한 맥락이다.