본문 바로가기
공부/PHP

기초문법

by wonah 2022. 10. 17.

# PHP에서는 쌍따옴표 안에 있는  PHP  변수를 중괄호{ }로 감싸게 되면 문자열 안에서 변수를 읽을 수 있다.

# 문자 결합연산자(.)를 사용하여 문자열 연결

<?php
$txt = "PHP";
echo "Hello World! {$txt}!!";
echo 'Hello World! '.$txt.'!!';
?>

>> Hello World! PHP!!

    Hello World! PHP!!

 

# 변수는 사용 가능한 유효범위가 있다.

*지역 변수

함수 내에서 선언된 변수는 지역 범위를 가지며 해당 함수 내에서만 액세스 가능

변수의 유효범위는 지역변수로 제한되므로 함수 밖에서 정의된 변수는 함수 안에서 사용 불가

<?php
function myFunc() {
    $str = "PHP"; // 지역 범위
    echo "<p>변수 str의 값은 : {$str}</p>";
}

myFunc();
echo "<p>변수 str의 값은 : {$str}</p>"; // 함수 외부에서 변수 $str을 사용하면 오류가 발생합니다.

* 전역 변수

함수 외부에서 선언된 변수는 전역 범위를 가지며 함수 외부에서만 액세스 가능

변수의 유효범위는 지역변수로 제한되므로 함수 밖에서 정의된 변수는 함수 안에서 사용 불가

<?php
$str = "PHP"; // 전역 범위

function myFunc() {
    echo "<p>변수 str의 값은 : {$str}</p>"; // 이 함수 내에서 변수 $str을 사용하면 오류가 발생합니다.
}

myFunc();
echo "<p>변수 str의 값은 : {$str}</p>";
 
 
# PHP에서는 전역변수를 함수 내부에서 사용할 수 없는데 그 이유는 함수 내부에서 사용되는 범위 영역이 전역 영역과 구분되기 때문이다. 하지만 전역변수를 함수 내부 범위로 가져와 유효 범위로 설정할 수 있는데, 이때 global 키워드를 사용하면 함수 내에서 전역 변수에 액세스 가능
 
<?php
$str = "PHP"; // 전역 범위

function myFunc() {
    global $str; // global 키워드를 사용하여 변수 $str을 전역 변수로 선언
    echo "<p>변수 str의 값은 : {$str}</p>";
}

myFunc();
echo "<p>변수 str의 값은 : {$str}</p>";

>> 변수 str의 값은 : PHP

      변수 str의 값은 : PHP

 

# PHP는 모든 전역 변수를 $GLOBALS[index]라는 배열에 자동으로 저장

# 배열의 인덱스에서는 변수의 이름을 넣어서 그 값에 액세스 가능

# 전역 변수를 직접 업ㄷ데이트하는데 $GLOBALS[index] 배열을 사용할 수도 있음

# $GLOBALS['변수명']

<?php
$str = "PHP"; // 전역 범위

function myFunc() {
    echo "<p>변수 str의 값은 : {$GLOBALS['str']}</p>";
}

myFunc();
echo "<p>변수 str의 값은 : {$GLOBALS['str']}</p>";

* 정적 변수

지역 범위의 변수, 범위 경계 밖에서는 소멸되지 않음

함수 내에서 'static' 키워드를 사용하여 정의 가능

<?php
function myFunc() {
    static $x = 0; // 처음에만 초기화, 딱 1번만 가능
    echo "<p>변수 x의 값은 : {$x}</p>";
    $x++;
}

myFunc();
myFunc();
myFunc();

>> 변수 x의 값은 : 0

     변수 x의 값은 : 1

     변수 x의 값은 : 2

 

# PHP에서는 미리 정의된 슈퍼 글로벌 변수

$GLOBALS  : 전역 스코프의 모든 변수를 참조할 수 있는 배열 변수

$_SERVER : 웹 서버 환경변수

$_POST : POST방식으로 넘어온 변수

$_GET : GET 방식으로 넘어온 변수

$_REQUEST : POST 또는 GET 방식으로 넘어온 변수

$_FILES : 업로드 파일 정보를 담은 변수

$_ENV : 시스템 환경 변수

$_COOKIE : 쿠키 변수

$_SESSION  : 세션 변수

 

# 상수

* 매직상수 Magic Constants

메타적인 정보를 가지고 있음

__LINE__  파일의 현재 줄 번호 반환

__FILE__   파일의 전체 경로와 이름 반환

__DIR__    파일의 디렉터리 반환

__CLASS__   클래스 이름 반환(클래스이름은 대소문자 구분)

__FUNCTION__  함수 이름 반환

__TRAIT__ 트레이트의 이름 반환(트레이트를 선언한 네임스페이스 포함)

__METHOD__ 클래스의 메소드 이름 반환

__NAMESPACE__ 현재 네임스페이스 이름 반환

 

 

#데이터타입

* 논리형 boolean

참true 거짓false

데이터 타입에 따라서 자동으로 변환

false 0 0.0 "" "0" 요소가 없는 배열 NULL SimplyXML 이외엔 전부 true

 

*문자열 string

" ",' '

PHP 문자열을 단순한 바이트로 처리하기 때문에 문자열을 지정하는 제한 없음

 

*배열 array

한 쌍의 키(key)와 값(value)으로 이루어진 맵(map)으로 구성되는 순서가 있는 집합

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

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

불리언은 true는 1로, false는 0으로 자동 타입 변환

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

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

실수는 소수 부분이 제거되고 정수로 자동 타입 변환

NULL은 빈 문자열(" ")로 자동 타입 변환

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

 

<?php
$a = array("가", "나", "다", "라");

echo $a[0]."<br/>";
echo $a[1]."<br/>";
echo $a[2]."<br/>";
echo $a[3]."<br/>";
 
<?php
$a = array(
    "key1" => "가",
    "key2" => "나",
    "key3" => "다",
    "key4" => "라"
);

echo $a['key1']."<br/>";
echo $a['key2']."<br/>";
echo $a['key3']."<br/>";
echo $a['key4']."<br/>";
 

>>가

    나

    다

    라

 

# 연산자

* 비교연산자

$a == $b $a가 $b와 같을 때 true를 반환

$a === $b $a와 $b의 데이터 타입이 같고 값이 같을 때 true를 반환

$a !== $b $a와 $b의 데이터 타입이 다르거나 값이 같지 않을 때 true 반환

 

* NULL 병합 연산자

a ?? b 피연산자 a에 값이 존재하고 NULL이 아니면 a 반환, 그렇지 않으면 b 반환

 

* 문자열 연산자

$a . $b $a와 $b를 연결

$a .= $b $a에 $b를 추가

 

*  배열  연산자

$a +  $b   합집합 반환, 새로운 배열 생성

$a == $b  동일한 키/값 쌍을 가지고 있으면 true 반환

$a === $b 동일한 순서와 유형의 동일한 키/값 쌍을 가지고 있으면 true 반환

 

# 함수

매개변수에 기본 값을 설정하여 함수에서 사용 가능

여러 개 매개변수를 사용할 경우 반드시 기본 값이 없는 필수 매개변수부터 왼쪽에 나열

 

스플랫(...)연산자를 사용하여 함수의 가변 길이의 인수를 배열로 나타낼 수 있게 지원

보통 함수의 인수의 개수가 확정되지 않은 함수에 매개변수로 사용

 

매개변수로 받을 값들의 데이터 유형을 미리 지저앟여 원하는 유형의 형태로 값을 받을 수 있음

함수 반환유형도 선언 가능 하지만 함수에서 반환되는 값은 int나 string형만 반환

function get_fruit() : string

 

 

# 익명함수 anonymous function

함수 이름없이 사용하는 경우

항상선언과 호출이 쌍으로 이루어진 형태가 함수인데

선언하고 호출하는 일회성 함수(다른 함수로 바뀌기전까진 사용가능)

<?php
$lambda = function ($name) {
    return $name;
};

echo $lambda("홍길동");
 

익명함수를 변수에 할당한 후 그 변수로 함수를 호출해야한다.

 

익명함수를 다른 함수에 인수로 전달하는 방법

<?php
function say(callable $lambda){
    echo $lambda();
}

say(function() { return 'Hello world'; });

익명함수를 통해 생성된 객체는  외부 변수 값에 영향을 주지 않음

global 키워드나 use절을 통해 해당 변수를 지정해줘야 함

<?php
$sep = ', ';

function myFunc()
{
    global $sep;
    $wor = 'world';

    return function ($hel) use ($sep, $wor) { //외부변수 사용시 use
        $exc = '!';
        return $hel . $sep . $wor . $exc;
    };
}

$hello = myFunc();
echo $hello('Hello');

>> Hello, world!

 

화살표 함수의 경우에는 명시적으로 지정하지 않더라도 외부 환경의 변수를 자동으로 스캔하여 사용 가능

단 전역변수는 자동으로 인식하지 못하므로 global 키워드 지정해야

<?php
$sep = ', ';

function myFunc()
{
    global $sep;
    $wor = 'world';

    return fn ($hel) => $hel . $sep . $wor . '!';
}

$hello = myFunc();
echo $hello('Hello');

 

#클래스

class 키워드 뒤에 클래스 이름 기술하여 선언(대문자로 시작)

 

#프로퍼티 property

속성attribute

프로퍼티를 선언하고 값을 할당하지 않으면 자동으로 null값이 할당

var 키워드만 사용한 경우 속성은 public으로 자동 정의

 

*접근제어자

public - 속성 또는 메서드는 어디에서나 액세스 가능, 기본값

protected -  속성 또는 메서드는 클래스 내에서 그리고 해당 클래스에서 파생된 클래스에서 액세스 가능

private - 속성 또는 메서드는 클래스 내에서만 액세스 가능

 

클래스의 프로퍼티에 접근하거나 메서드를 호출할 때 화살표(->) 사용

*public iterable $e; //의사유형

 

#의사변수 $this

현재 자기 자신을 나타내는 표현

화살표 지시자(->)를 사용함으로써 자신이 속해있는 인스턴스 내의 속성이나 메서드에 액세스 가능

주로 객체지향프로그램에서 클래스의 현재 객체에 대한 속성을 설정하는데 사용

 

#생성자와 소멸자

*생성자 __construct() 

클래스가 메모리상에 객체를 생성시켰을때 가장 먼저 자동으로  호출되는 메서드

클래스의 인스턴스 생성 시 값을 초기화할 때 사용

생략하여도 상관없음

생성자도 결국 메서드와 같기 때문에 생성자의 소괄호안에 매개변수 지정 가능

인스턴스를 생성할 때 클래스에 인수를 지정하여 인스턴스를 생성하면 됨

클래스 내부의 프로퍼티와 생성자 속성은 같은 이름으로 중복 불가

 

*소멸자 __destruct()

 

*상속

extends 키워드로 선언

접근제어자의 private로 지정된 메서드 속성은 상속되지 않음

<?php
include "parents.php";

class Child extends Parents
{
    public function echoParents() : string
    {
        return $this->parents;
    }
}

$child = new Child();
echo $child->echoParents();

#오버라이드 override

오버라이딩은 상속관계에서 나타남

부모클래스에서 정의되어 있는 메서드를 자식 클래스에서 자신에 맞는 내용으로 재정의하여 사용

재정의된 함수는 부모 클래스의 메서드와 동일한 매개변수와 리턴 값의 자료형 사용

 

클래스의 프로퍼티를 오버라이드 할 경우, 클래스에 읽기 전용 속성 readonly을 사용하게 되면, 읽기 전용으로 선언된 클래스의 속성은 한 번 초기화할 수 있으며 속성에 대한 추가 변경은 허용되지 않음.

<?php
class Example
{
    public readonly string $str;

    public function say(string $str) {
        $this->say = $str;
    }
}

$str = "Hello World";
$example = new Example();
$example->say(str: "Hello World"); // 정상 실행
//$example->say(str: "PHP"); // 오류 발생

#인터페이스 interface

메서드를 정의, 선언만 가능

클래스는 상속 구조와 관계없이 인터페이스의 모든 멤버를 자유롭게 접근해야하므로 반드시 public 속성

implements 키워드 사용, 다중상속가능

<?php
interface Animal #인터페이스 Animal 생성
{
    public function animal_type($type);
}

class Cat implements Animal #클래스 Cat에서 인터페이스 Animal을 상속
{
    public function animal_type($type) #인터페이스에 정의된 메서드 몸체를 구현
    {
        echo "{$type} 입니다.<br/>";
    }
}

$cat = new Cat; # 클래스 Cat의 인스턴스 생성
$cat->animal_type("고양이");

>> 고양이 입니다.

 

#추상 클래스와 추상 메서드

이중상속과 인터페이스 두 개는 함께 사용할 수 없다.

즉 상속과 인터페이스 규약을 혼합하여 사용할 수 없다.

abstract 키워드 사용

 

#트레이트 trait

클래스 안에 새로운 또 다른 클래스를 삽입하는 개념

트레이트에는 여러 클래스에서 재사용 될 수 있는 메서드나 프로퍼티를 모아둘 수 있고, 하나의 클래스는 여러 개의 트레이트를 결합할 수 있으며, 트레이트는 상호 간에 기능을 삽입할 수 있다.

선언 방법은 클래스 선언 문법과 비슷 trait 키워드 사용

trait 트레이트명

트레이트를 다른 클래스에서 사용하려면 클래스 내부에 use키워드 사용하여 트레이트 이름 작성

class 클래스명

{ use 트레이트명;}

프로퍼티와 메서드 둘 다 가질 수 있고, 추상 메서드 또한 가질 수 있음

 

#static과 final

*static 키워드 

정적 변수, 정적 메서드, 늦은 정적 바인딩에 사용되는 키워드

클래스의 인스턴스가 없이 정적 메모리 공간에 할당되므로 의사변수 $this로는 static으로 선언된 정적 메서드에 접근 불가

따라서 정적 속성들은 범위 지정 연산자( :: )를 사용하여 접근해야

 

*범위지정연산자

self:: 자기 자신에 접근할 때

parent:: 부모클래스에 접근할 때

static:: 늦은 적정 바인딩에 사용

 

<?php
class A
{
    public static function myFunc() # 정적 메서드
    {
        static::say();
    }

    public static function say() # 정적 메서드
    {
        echo "부모 클래스 호출 <br/>";
    }
}

class B extends A # 클래스 A를 상속 받은 클래스 B (자식 클래스)
{
    public static function test() # 자식 클래스 B의 정적 메서드
    {
        A::myFunc(); # 클래스 A의 메서드 myFunc() 호출
        parent::myFunc(); # 클래스 B의 메서드 myFunc() 호출
        self::myFunc(); # 클래스 B의 메서드 myFunc() 호출
    }

    public static function say() # 자식 클래스 B의 정적 메서드
    {
        echo "자식 클래스 호출 <br/>";
    }
}

B::test(); # 클래스 B의 메서드 호출
* final
상속을 못하도록 금지해야할 경우
 
#네임스페이스
역슬래시가 있으면 전역공간에서 찾게 되며 역 슬래시가 없으면 사용하는 이름의 공간 내에서 찾게 됨
 
#use
네임스페이스를 포함한 클래스의 전체 명칭 대신 별명을 통해서 사용가능
 
728x90

'공부 > PHP' 카테고리의 다른 글

실습예제  (0) 2022.10.17