# PHP에서는 쌍따옴표 안에 있는 PHP 변수를 중괄호{ }로 감싸게 되면 문자열 안에서 변수를 읽을 수 있다.
# 문자 결합연산자(.)를 사용하여 문자열 연결
>> Hello World! PHP!!
Hello World! PHP!!
# 변수는 사용 가능한 유효범위가 있다.
*지역 변수
함수 내에서 선언된 변수는 지역 범위를 가지며 해당 함수 내에서만 액세스 가능
변수의 유효범위는 지역변수로 제한되므로 함수 밖에서 정의된 변수는 함수 안에서 사용 불가
* 전역 변수
함수 외부에서 선언된 변수는 전역 범위를 가지며 함수 외부에서만 액세스 가능
변수의 유효범위는 지역변수로 제한되므로 함수 밖에서 정의된 변수는 함수 안에서 사용 불가
>> 변수 str의 값은 : PHP
변수 str의 값은 : PHP
# PHP는 모든 전역 변수를 $GLOBALS[index]라는 배열에 자동으로 저장
# 배열의 인덱스에서는 변수의 이름을 넣어서 그 값에 액세스 가능
# 전역 변수를 직접 업ㄷ데이트하는데 $GLOBALS[index] 배열을 사용할 수도 있음
# $GLOBALS['변수명']
* 정적 변수
지역 범위의 변수, 범위 경계 밖에서는 소멸되지 않음
함수 내에서 'static' 키워드를 사용하여 정의 가능
>> 변수 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은 빈 문자열(" ")로 자동 타입 변환
배열과 객체는 배열의 키 값으로 사용할 수 없음
>>가
나
다
라
# 연산자
* 비교연산자
$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형만 반환
# 익명함수 anonymous function
함수 이름없이 사용하는 경우
항상선언과 호출이 쌍으로 이루어진 형태가 함수인데
선언하고 호출하는 일회성 함수(다른 함수로 바뀌기전까진 사용가능)
익명함수를 변수에 할당한 후 그 변수로 함수를 호출해야한다.
익명함수를 다른 함수에 인수로 전달하는 방법
익명함수를 통해 생성된 객체는 외부 변수 값에 영향을 주지 않음
global 키워드나 use절을 통해 해당 변수를 지정해줘야 함
>> Hello, world!
화살표 함수의 경우에는 명시적으로 지정하지 않더라도 외부 환경의 변수를 자동으로 스캔하여 사용 가능
단 전역변수는 자동으로 인식하지 못하므로 global 키워드 지정해야
#클래스
class 키워드 뒤에 클래스 이름 기술하여 선언(대문자로 시작)
#프로퍼티 property
속성attribute
프로퍼티를 선언하고 값을 할당하지 않으면 자동으로 null값이 할당
var 키워드만 사용한 경우 속성은 public으로 자동 정의
*접근제어자
public - 속성 또는 메서드는 어디에서나 액세스 가능, 기본값
protected - 속성 또는 메서드는 클래스 내에서 그리고 해당 클래스에서 파생된 클래스에서 액세스 가능
private - 속성 또는 메서드는 클래스 내에서만 액세스 가능
클래스의 프로퍼티에 접근하거나 메서드를 호출할 때 화살표(->) 사용
*public iterable $e; //의사유형
#의사변수 $this
현재 자기 자신을 나타내는 표현
화살표 지시자(->)를 사용함으로써 자신이 속해있는 인스턴스 내의 속성이나 메서드에 액세스 가능
주로 객체지향프로그램에서 클래스의 현재 객체에 대한 속성을 설정하는데 사용
#생성자와 소멸자
*생성자 __construct()
클래스가 메모리상에 객체를 생성시켰을때 가장 먼저 자동으로 호출되는 메서드
클래스의 인스턴스 생성 시 값을 초기화할 때 사용
생략하여도 상관없음
생성자도 결국 메서드와 같기 때문에 생성자의 소괄호안에 매개변수 지정 가능
인스턴스를 생성할 때 클래스에 인수를 지정하여 인스턴스를 생성하면 됨
클래스 내부의 프로퍼티와 생성자 속성은 같은 이름으로 중복 불가
*소멸자 __destruct()
*상속
extends 키워드로 선언
접근제어자의 private로 지정된 메서드 속성은 상속되지 않음
#오버라이드 override
오버라이딩은 상속관계에서 나타남
부모클래스에서 정의되어 있는 메서드를 자식 클래스에서 자신에 맞는 내용으로 재정의하여 사용
재정의된 함수는 부모 클래스의 메서드와 동일한 매개변수와 리턴 값의 자료형 사용
클래스의 프로퍼티를 오버라이드 할 경우, 클래스에 읽기 전용 속성 readonly을 사용하게 되면, 읽기 전용으로 선언된 클래스의 속성은 한 번 초기화할 수 있으며 속성에 대한 추가 변경은 허용되지 않음.
#인터페이스 interface
메서드를 정의, 선언만 가능
클래스는 상속 구조와 관계없이 인터페이스의 모든 멤버를 자유롭게 접근해야하므로 반드시 public 속성
implements 키워드 사용, 다중상속가능
>> 고양이 입니다.
#추상 클래스와 추상 메서드
이중상속과 인터페이스 두 개는 함께 사용할 수 없다.
즉 상속과 인터페이스 규약을 혼합하여 사용할 수 없다.
abstract 키워드 사용
#트레이트 trait
클래스 안에 새로운 또 다른 클래스를 삽입하는 개념
트레이트에는 여러 클래스에서 재사용 될 수 있는 메서드나 프로퍼티를 모아둘 수 있고, 하나의 클래스는 여러 개의 트레이트를 결합할 수 있으며, 트레이트는 상호 간에 기능을 삽입할 수 있다.
선언 방법은 클래스 선언 문법과 비슷 trait 키워드 사용
trait 트레이트명
트레이트를 다른 클래스에서 사용하려면 클래스 내부에 use키워드 사용하여 트레이트 이름 작성
class 클래스명
{ use 트레이트명;}
프로퍼티와 메서드 둘 다 가질 수 있고, 추상 메서드 또한 가질 수 있음
#static과 final
*static 키워드
정적 변수, 정적 메서드, 늦은 정적 바인딩에 사용되는 키워드
클래스의 인스턴스가 없이 정적 메모리 공간에 할당되므로 의사변수 $this로는 static으로 선언된 정적 메서드에 접근 불가
따라서 정적 속성들은 범위 지정 연산자( :: )를 사용하여 접근해야
*범위지정연산자
self:: 자기 자신에 접근할 때
parent:: 부모클래스에 접근할 때
static:: 늦은 적정 바인딩에 사용