PHP
중요한부분 ⭐️을 붙임
※ 글로벌 상수
※글로벌 변수
사용예제 (정적변수보다 보관이 짧다)
$g=1;
function plus(){
global $g;
echo $g+=1;
}
plus(); // 2
plus(); // 3
function printGlobal(){
echo $GLOBALS['g'];
}
printGlobal(); // 3
※슈퍼글로벌변수 ⭐️
어디서든 접근 가능한 변수
사용 방법은 위의 글로벌 변수와 같다
자주 사용하는듯
※var_dump ⭐️
-1.변수의 타입을 표기하며 ( int, boolean )
-2.배열일경우 상세내용 표기( array의 상세내용..)
-해당 변수의 상세 내용 표기 (쉽게 말하면 변수의 타입 표기)
-해당 변수에 담긴 배열등을 자세하게 표기
var_dump("123abc" == 123); // true
“123abc”는 문자열이 입력되어있으므로 true 이고 123도 빈값이 아니기때문에 true이다 이 둘을 합친 내용의 변수형의 true이다
※정적변수 static
함수가 종료되더라도 메모리상에서 남아있다
function count(){
static $c=0;
echo $c; $c++;
}
// count(); 0
// count(); 1
※배열 ⭐️
종류1 일반배열 (키가 지정되어있지 않거나 숫자인 경우)
$배열이름 = array(); // 배열 생성
$배열이름[0] = "apple"; // 배열 요소 추가
echo $배열이름[인덱스]; // apple
$배열이름 = array(배열요소1,배열요소2); // 배열 생성하면서 초기화를 동시에
$신규배열이름[] = "apple"; // 1.신규배열이름라는 배열을 생성한다. 2.배열 인덱스를 생략하여, 순서대로 배열에 추가됨.
foreach ($배열 as $값을저장할변수) {} // 일반배열
종류2 연관배열 (키가 문자열이거나 여러 타입인 경우)
-배열이라기 보다 자바스크립트의 Object와 가까운듯
$배열이름 = array(); // 배열 생성
$배열이름["apple"] = 1000; // 연관 배열 요소 추가
$배열이름 = array("키1" => 값1, "키2" => 값2, …); // 배열 초기화와 추가를 동시에
foreach ($배열 as $key => $value) {} // 연관배열
$arr = array(
1 => "첫 번째 값", // PHP의 배열에서 키값의 1과 "1"은 같은 값을 나타냄.
"1" => "두 번째 값", // 같은 키값을 사용하여 두 번 선언했기 때문에 나중에 선언된 "두 번째 값"만 남게됨.
10 => "세 번째 값",
-10 => "네 번째 값"
);
echo $arr[1]; //두 번째 값
echo $arr["1"]; //두 번째 값
echo $arr[10]; //세 번째 값
echo $arr[-10]; //네 번째 값
※배열함수
count() , sizeof() // 길이
sort() // 정렬
//일반배열
sort($arr);
// 연관배열
asort($arr); // 요소의 값을 기준으로 배열 정렬 -> apple, orange, banana
ksort($arr); // 키값을 기준으로 배열 정렬 -> apple, banana, orange
※객체
객체(object)는 클래스의 인스턴스(instance)를 저장하기 위한 타입입니다.
이러한 객체는 프로퍼티(properties)과 메소드(methods)를 포함할 수 있습니다.
class TestClass {
public $property2="hello2"; // 프로퍼티
// 생성자 함수 (클래스의 인스턴스)
// function TestClass() {} 도 가능
function __construct() {
// 클래스에 프로퍼티 초기화
$this->property1="hello1";
}
}
$var=new TestClass; // 인스턴스(객체) 생성
echo $var->property1; // 객체의 속성(프로퍼티) 접근 //hello1
echo $var->property2; // 객체의 속성(프로퍼티) 접근 //hello2
※배열->JSON스트링
json_encode($arr)을 이용해서 배열을 json형태의 스트링으로 변경가능
※JSON스트링->배열,std클래스
json_decode($json_string,true)을 이용하면 json문자열을 연관배열로 반환한다
json_decode($json_string)을 이용하면 json문자열을 클래스로 반환한다
※StdClass⭐️
// 1. 빈오브젝트로 프로퍼티만 사용할 시 사용되기도함
// 2. 그래서 key,value의 배열을 클래스로 바꿀시 stdclass에 프로퍼티를 할당후 stdclass로 사용가능 (동적인 프로퍼티가 사용가능하다)
// 3. new stdClass() ; 등으로 생성이 가능하다
// 4 .프로퍼티에 할당후 ( new stdClass() -> foo = 42; 등으로 할당 )
// json_encode() -> json_decode()의 변환과정을 거쳐 연관배열로 사용이 가능하다
// json_decode(arr1,args2)에서 args에 아무것도 입력하지않거나 false를 입력할 경우 json문자열의 반환값을 stdClass로 받는다
// 배열의 경우 값 접근시
$dog= [];
$dog['name'] = 'pochi';
echo $dog['name'];
// stdClass의 경우 값 접근시
$dog= new stdClass();
$dog->name= 'pochi';
echo $dog->name;
// stdClass 란 빈 오브젝트임
// 케이스1 ==> 애초에 빈 Object를 생성
$obj = new stdClass();
$obj->foo = 42;
$obj->{1} = 42;
echo var_dump($obj);
—>
object(stdClass)#1 (2) {
["foo"]=>
int(42)
["1"]=>
int(42)
}
//케이스2 ==> 배열을 Object형으로 형변환
$obj = (object) array('foo' => 'bar');
echo var_dump($obj);
object(stdClass)#1 (2) {
["foo"]=>
int(42)
["1"]=>
int(42)
}
※타입변환
PHP는 기본적으로 문자열이 공백일 경우 false 존재할 경우 true를 반환한다
var_dump를 이용해서 변수에 할당된 상세 정보를 보면 true가 출력됨을 알수있다
$var_01 = "안녕";
$var_01_cast = (boolean)$var_01;
echo var_dump($var_01_cast); // bool(true)
※instanceof 연산자
instanceof 연산자는 다음과 같은 사항을 확인하고자 할 때 사용할 수 있습니다.
1. 해당 변수가 어떤 클래스(class)에서 생성된 객체(object)인지를 확인할 때
2. 해당 변수가 부모 클래스(parent class)에서 상속받은 클래스인지를 확인할 때
3. 해당 변수가 클래스의 인스턴스(instance)인지 아닌지를 확인할 때
4. 해당 변수가 인터페이스(interface)로 구현한 클래스의 객체 인스턴스(object instance)인지 아닌지를 확인할 때
※isset() / empty() / unset() ⭐️
isset() // 선언된적이있는지 확인
empty() // 선언된 값이 비어있는지 확인
여기서 비어있다함은 0,빈문자열,빈배열,null,false등이다
unset() // 메모리에 올라간 변수를 제거함
echo var_dump(isset($a)); // 선언된적이 없으므로 false
$a=array();
echo var_dump(empty($a)); // 배열이 비어있으므로 true
echo var_dump(unset($a)); // $a변수를 메모리부터 삭제
※매직매소드
매소드 내부에서 보이지 않지만 정의 되어있음,사용자가 구현해서 사용가능
__메소드명 형식으로 호출함
예를들어 get() 메소드와 set()메소드
클래스의 private된 프라펕티의 값을 설정하거나 읽을수있음
※클래스 접근제어
public // 외부에서 조건없이 사용가능
private로 // 해당 클래스 내부에서만 사용가능
protected로 // 해당 클래스 내부와 상속받은 클래스에서만 사용가능, 외부에서 사용불가
※클래스의 정적멤버 (연산자 ::를 사용) ⭐️
1.static키워드로 선언된 정적 프로퍼티는 인스턴스 객체에서 접근 불가능 // new instanceA()->static_value (x)
2.static키워드로 선언된 정적 메서드는 인스턴스 객체에서 접근 가능 // new instanceA()->static_method() (o)
3.인스턴스없이 직접 호출 가능 // instanceA::static_value (o)
4.인스턴스없이 직접 호출 가능 // instanceA::static_method() (o)
5.정적 메서드 내부에서 this사용 불가능 // 그대신 self를 사용한다
—> 즉 인스턴스의 프라퍼티에 직접 접근하는것 이외에는 다 가능하다
6.self::static_val; 현재 클래스의 스태틱 멤버변수접근
7.parent::static_val , parent::static_method() 부모 클래스의 멤버변수나 메소드 접근
※추상클래스
// 구현해야할 메서드+상속메서드를 같이 넘겨줌
abstract class TestA{
abstract protected function stop(); // 1.상속한 클래스에서 반드시 구현(오버라이딩)해야함
public function start() // 2. 상속한 클래스에서 상속하게 되는 공통 메소드
{
…// 소스 구현..
}
}
class TestB extends TestA{
//3. stop()을 구현해야함
function stop(){
…소스 구현
}
//4. start()는 상속되어있는 상태
}
※인터페이스
// 구현해야할 메서드만 넘겨줌, 상속메서드 입력불가
interface TestA{
public function stop(); // 1.상속한 클래스에서 반드시 구현(오버라이딩)해야함
}
class TestB implements TestA{
function stop(){
// 2. 구현(오버라이딩)함..
}
}
※추상클래스와 인터페이스의 차이 ⭐️
1.추상클래스는 구현된 메서드와 구현해야할 메서드 2종류를 가질수있음
2.인터페이스는 구현해야할 메서드만 가짐
3.추상클래스는 메서드상속+구현해야할 메서드 / 인터페이스는 구현해야할 메서드만 가짐