PHP강의정리2_내장함수
-
주로 사용하는 내장함수는 core extension
https://www.php.net/manual/en/extensions.membership.php
https://www.php.net/manual/en/funcref.php
-
Bundled Extensions / External Extensions 는 php.ini에서 주석해체후 사용가능(맥은 부가적으로 해당익스텐션 설치 필요)
-
get_loaded_extensions() // 현재 php에서 사용중인 extension 리스트를 보여준다
-
PSR 은 코딩규약규칙들을 모아놓은 사이트이며 JS의 ECMA와 비슷하다
CORE EXTENSTION
PHP Options / Info (https://www.php.net/manual/en/book.info.php)
- set_include_pah(__DIR__.'/newPath') // 현재 스크립트의 include 기본 경로 변경
- get_included_files() // 현재 스크립트에 include된 php파일 보기
- ini_set() // php.ini의 내용 변경
- putenv('APP_ENV='.'production'); // 환경변수를 설정
- putenv('key')랑 $_ENV['key']는 별개로 동작한다
- assert(true) // 체크함수 assert_options()로 설정변경가능
Error Handling (https://www.php.net/manual/en/book.errorfunc.php)
- error_reporting(E_ALL & E_NOTICE) // 로그 표시 레벨 설정
- error_log('에러내용',에러레벨) // 에러로그 표시
- @함수명() // 에러를 무시함
- set_error_handler(callbackFunc) // 에러 발생시 콜백함수로 처리함 , 콜백함수의 첫번째 매개변수는 에러타입이다
- trigger_error('에러명',E_USER_ERROR) // 에러를 강제 발생시킴 , E_USER_ERROR는 에러타입
String (https://www.php.net/manual/en/book.strings.php)
- addslashes() // 슬래시 추가
- stripslashes() // 슬래시 제거
- random_bytes(len) // 랜덤 2진수 생성
- bin2hex() // 2진수를 16진수로
- hex2bin() // 16진수를 2진수로
- crypt('암호화할문장','salt'); // 해시생성
- explode('기준문자열','해석문자열') // 기준 문자열을 기준으로 해석문자열을 나눠서 배열로 반환함
- implode('기준문자열','해석문자열') // explode된 문자열을 합침
- htmlentities() // HTML을 인코딩한다 <html>
- htmlspecialchars_decode() // 디코딩된 HTML을 디코딩한다
- htmlspecialchars() // HTML을 인코딩한다 (변환할수있는 HTML의 범위가 적다)
- htmlspecialchars_decode() // HTML을 디코딩한다 (변환할수있는 HTML의 범위가 적다)
- strip_tags() // 모든 태그들을 제외한 결과를 표시 태그같은거 전부 삭제후 텍스트만 표시
- nl2br() // \n를 로 변경함
- ord('A') // 해당 문자열을 아스키 코드로 바꾼다
- chr(65) // 해당 아스키코드를 문자열로 바꾼다
- parse_str('1=a&2=쿼리스트링',$배열) // 쿼리스트링을 변환해서 배열에 담는다
- number_format() // 숫자의 3자리수마다 , 을 찍는다
- strtoupper() // 문자열을 대문자로 바꿈
- strtolower() // 문자열을 소문자로 바꿈
- trim() // 문자열의 빈공간을 삭제함
- strtr("변경할문자",['변경할문자'=>'changechar']) // 변경할 문자를 변경함 // changechar가 출력
- printf('%s bb %s','aa','cc') // 포맷된 문자열 출력 //aa bb cc , $s 문자열 $i 정수 $f 실수
- sprintf ('%s bb %s','aa','cc') // 포맷된 문자열만 반환하고 출력은 안함
- str_replace() // 문자열 변경
- str_repeat() // 문자열 반복
- str_split("abcde",2) // 문자열을 2글자씩 끊어서 배열로 반환
- str_word_count('문자열..',1) // 문자열을 단어별로 끊어서 배열로 반환
- strcmp() // 문자열 비교 // 0 일치 // -1 불일치
- strpos() // 특정 문자열의 위치
- strlen() // 문자열의 길이
- strrev() // 문자열을 반대로 뒤집음
- strstr('aabbcc','bb') // bbcc
- substr() // 문자열 자르기
- substr_compare() // 문자열비교 // 0 일치 // -1 불일치
- substr_replace() // 문자열변경
- wordwrap() // 문자열 줄바꿈
HASH (https://www.php.net/manual/en/book.hash.php)
- hash_algos() // 해시알고리즘 종류
- hash('sha256','문자열') // sha256 알고리즘으로 해싱 , crypt()함수와 알고리즘이 다르다
- hash_equals('비교해시값1','비교해시값2') // 같은 해시인가 체크
- hash_hmac('sha256','문자열','secret') // salt를 추가해서 hash를 만든다
- hash_hmac_file('sha256', 'example.txt', 'secret') // 파일에 대한 해시값을 만든다
Password Hashing (https://www.php.net/manual/en/book.password.php)
- password_hash("aa", PASSWORD_DEFAULT) // 비밀번호용으로 해시로 생성함 crypt()와 비슷하다
- password_verify(" aa",hash) // 비밀번호의 해시가 일치하는지 확인, crypt()의 결과 hash로도 확인가능
- password_get_info() // 해당 해시의 정보를 반환한다. 어떤 알고리즘을 사용했는지도 확인가능
- password_hash("aa", PASSWORD_DEFAULT,['cost'=>10])
PCRE (https://www.php.net/manual/en/book.pcre.php) // 정규표현식
- preg_match('/^정규표현식$/', '문자열', $결과반환배열) // 정규식으로 매칭되는 문자열 하나만 찾기
- preg_match_all('/^정규표현식$/', '문자열', $결과반환배열) // 정규식으로 매칭되는 문자열 모두 찾기
- preg_replace('/^정규표현식$/', '문자열1', '문자열2') // 문자열2에 문자열1과 매칭되는 부분이 있으면 문자열2의 일치부분을 문자열1로 변경함
- preg_filter() // preg_replace()와 동일
- preg_grep('/^정규표현식$/','배열') // 배열중에서 부분일치하는 값만 결과로 반환
- ..그이외 있지만 생략 (구글링으로 사용)
MATH (https://www.php.net/manual/en/book.math.php)
- max([1,2,3,4]) //최대값 4
- max([1,2,3,4]) //최소값 1
- rand(1,10) // 1~10중에서 랜덤 숫자
CSPRNG / RANDOM (https://www.php.net/manual/en/book.random.php)
- random_int(1,10) // 1~10중에서 랜덤 숫자 rand()보다 보안적으로 좋다
- random_bytes(5) // 5글자의 랜덤한 이진수(바이너리)를 만든다
Array (https://www.php.net/manual/en/book.array.php)
-
array_push(대상배열,넣을배열) // 배열넣기
-
array_pop[(제거할배열) // 배열꺼내기
-
array_filter(대상배열,function($val){return $val=='일치'}) // 일치하는 값을 반환 // $val배열내의 값
-
array_key_exists(키명,대상배열) // 해당 키가 배열에 존재하는지 확인
-
array_map(function($val){return $val},대상배열) // 배열을 조작해서 반환
-
array_search(찾을문자열,대상배열) // 해당 문자열을 포함한 값이 있을 경우, 해당값의 키를 반환한다
-
range(1,5) // 숫자 배열을 생성가능함 // [1,2,3,4,5]
-
array_reduce(대상배열,콜백함수) // reduce함수, 중첩된 결과를 반환한다
-
array_keys(대상배열) // 키만 모아서 배열로 반환한다
-
array_values(대상배열) // 값만 모아서 배열로 반환한다
-
array_merge(대상배열1,대상배열2) // 배열을 합친다, 중북된건 마지막에 추가된 녀석을 덮어쓴다. laravel에서 merge라는 함수가 있는데 이건 collection을 다룰때 사용한다
//배열 array_merge 사용시 $validatedData = $request->validated(); // ['name'=>'kim','password'=>'123'] $validatedData = array_merge($validatedData, ['password' => Hash::make($request->input('password'))]); // ['name'=>'kim','password'=>'hasingpassword....'] // 콜렉션 merge() 사용시 $collection = collect(['product_id' => 1, 'price' => 100]); $merged = $collection->merge(['price' => 200, 'discount' => false]); $merged->all(); // ['product_id' => 1, 'price' => 200, 'discount' => false] -
compact('변수명1','변수명2') // 해당 변수명을 key로하고 할당된 내용을 value로 배열을 만든다 (매개변수로 변수의 문자열을 넘긴다)
$test1="aa"; $test2="bb"; var_dump(compact('test1','test2')); array(2) { 'test1' => string(2) "aa" 'test2' => string(2) "bb" } -
compact 함수는 변수 이름과 값을 기반으로 연관 배열을 생성합니다. 변수 이름은 배열의 키가 되고, 변수 값은 배열의 값이 됩니다.
// 기본적으로 매개변수로 ' 변수의 문자열 ' 을 넘겨준다
사용법
compact(변수1, 변수2, 변수3, ...);예제
<?php $name = "John"; $age = 25; $country = "USA"; $result = compact("name", "age", "country"); print_r($result); //Array ( [name] => John [age] => 25 [country] => USA ) -
sort(배열) //오름차순 일반배열 정렬
-
rsort(배열) //내림차순 일반배열 정렬
-
asort(연관배열) //오름차순 연관배열 정렬(값기준)
-
arsort(연관배열) //내림차순 연관배열 정렬(값기준)
-
ksort(연관배열) //오름차순 연관배열 정렬(키기준)
-
krsort(연관배열) //내림차순 연관배열 정렬(키기준)
-
usort(배열,function($a,$b){return $a>$b;}) // 콜백함수로 일반배열 정렬
-
uasort(연관배열,function($a,$b){return $a>$b;}) // 콜백함수로 연관배열 정렬 (값기준)
-
uksort(연관배열,function($a,$b){return $a>$b;}) // 콜백함수로 연관배열 정렬 (키기준)
Variable handling (https://www.php.net/manual/en/book.var.php) //변수 제어
-
gettype(변수명) // 변수의 타입을 가져옴
-
is_int(변수명) // 해당 변수가 int타입인가 체크
-
is_string(변수명) // 해당 변수가 string타입인가 체크
-
is_iterable(변수명) // 해당 변수가 반복가능 한 변수인지 체크
is_iterable([]) // 1(true) -
is_object(변수명) // 해당 변수가 객체타입인가 체크
-
isset(변수명) // 변수에 할당되어있는지 체크
-
empty(변수명) // 변수에 값이 있는지 체크 (if의 true/false체크방식과 동일하기때문에 자주 사용할듯 )
// 1.값이 선언되지 않아도 실행됨 // 2.isset() 할당되었는지 확인 // 3.empty() 값이 비었는지 확인 echo isset($notExist); // false echo empty($notExist); // true $isExist = "테스트1"; // 선언후 값할당 echo isset($isExist); // true echo empty($isExist); // false
-
boolval(1) // int를 boolean으로 변경
-
strval(10) // int를 string으로 변경
-
print_r(변수명) // 사람이 읽기 좋은 형태로 보여준다
-
var_dump(변수명) // 디버깅하기 좋은 형태로 보여준다
-
serialize(변수명) // 만약 매개변수가 배열이면 해당 변수를 한줄로 표시한다(직렬표시)
-
get_defined_vars() // 선언된 모든 변수들을 보여준다
Filter (https://www.php.net/manual/en/book.filter.php) // 자주 사용됨
-
filter_var(체크대상,FILTER_VALIDATE_..) // 해당 형식이 맞는지 체크함 (타입,도메인,이메일,URL,맥어드레스,HTML등등..)
-
filter_var('[email protected]', FILTER_VALIDATE_EMAIL); //[email protected] : true
-
filter_var('bob###example.com', FILTER_VALIDATE_EMAIL); // false
-
filter_var(체크대상,FILTER_SANITIZE_..) // 해당 형식에 맞지 않는 부분을 삭제함
-
filter_var('john(.doe)@exa//mple.com',FILTER_SANITIZE_EMAIL) // 해당 형식에 불필요한 부분 제거 //[email protected]
-
filter_input(INPUT_..) // Request로 들어오는 Input값을 필터가능 // $_GET,$_POST,$_SERVER,$_ENV
// $_SERVER filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP); // 원격 서버의 IP형식 확인
Function Handling (https://www.php.net/manual/en/book.funchand.php)
- func_num_args() // 함수안에서 파라미터의 갯수를 알수있음 func_num_args(0)등으로 해당 파라미터를 받을수도 있음
- call_user_func('함수명',파라미터 ) // 해당함수를 호출한다 (오버로딩효과를 위해 사용하기도함)
- function_exists('함수명') // 해당함수의 존재여부 체크
- get_defined_functions() // 선언된 함수리스트를 반환한다
- register_shutdown_function(콜백함수) // 해당 스크립트가 종료될때 마지막으로 콜백함수내용 실행
Date (https://www.php.net/manual/en/book.datetime.php)
- date_default_timezone_set('Asia/Seoul') // 타임존 세팅
- time() // 현재시간의 타임스탬프 반환
- localtime(타임스탬프,연관배열사용유무) // 시간을 배열/연관배열로 반환한다
- getdate(타임스탬프) // 시간을 연관배열로 반환한다
- strftime('%Y-%m-%d %H:%M:%S',타임스탬프); // 시간을 해당 포맷으로 표시(PHP8.1버전에폐지)
- date('Y-m-d H:i:s',타임스탬프); // 시간을 해당 포맷으로 표시 (strftime의 대안으로 사용)
- mktime() // 특정시간의 타임스탬프를 생성가능
- strtotime('+1 day') // 문자열로 타임스탬프를 구한다
Network (https://www.php.net/manual/en/book.network.php)
- header('TEST_HEADER: test_value1'); // 응답 헤더 설정
- header_remove('TEST_HEADER') // 응답 헤더에서 해당 헤더 제거
- headers_list(); // 응답 헤더 리스트 반환
- http_response_code(404); 페이지의 상태코드를 설정 // header('HTTP/1.1 404 Not Found')과 같음
- setcookie('쿠키명','쿠키내용'); // 쿠키설정
- $_COOKIE['쿠키명']; // 쿠키 불러오기
- setcookie('쿠키명','',time()-3600); //쿠키삭제
Session (https://www.php.net/manual/en/book.session.php)
-
session_save_path('./폴더명') // 서버에 저장할 세션의 경로지정
-
session_start() // 세션시작 // session path가 있어야한다
-
$_SESSION['해당세션의내부키값']='해당세션의내부값' // 유저가 가진 각 세션에 내부값을 설정함
-
unset($_SESSION['해당세션의내부키값']) // 유저가 가진 각 세션에 해당 내부값을 삭제함
// 쿠키는 클라이언트에 데이터를 저장하고 세션은 서버에 데이터를 저장한다 // 저장형식은 아래와 같음 Client:key1/value1(외부값) - Server:value1(외부값) [key2:value2](내부값) -
session_name() // 해당세션 외부 키값 (key1)
-
session_id() // 해당세션의 외부 값 (value1) // 노출되면 안됨
-
session_gc() // 오래된 세션 삭제, 삭제기간은 php.ini에 있음
-
session_unset() // 유저가 가진 각 세션의 모든 내부값을 삭제함
-
session_destroy() // 세션파일을 강제적으로 사용함, 권장사항은 아님,session_gc()사용을 권장
-
session_commit() // 세션종료 session_start()를 종료
-
session_regenerate_id() // 현재 세션ID를 새롭게 갱신함
URLs (https://www.php.net/manual/en/book.url.php)
- base64_encode(문자열) // 문자열을 base64형식으로 인코딩한다
- get_headers('http://example.com'); // 해당 사이트의 헤더정보 가져오기(클라이언트에서 동작)
- get_meta_tags('http://example.com'); // 해당 사이트의 메타태그정보 가져오기(클라이언트에서 동작)
- http_build_query(배열) // url의 쿼리스트링 생성 (자주 사용됨)
- parse_url(url문자열) // url을 해석한다 .도메인,쿼리스트링등으로 분류해서 배열로 반환
- urlencode(문자열) // url형식으로 인코딩한다
cURL (https://www.php.net/manual/en/book.curl.php) // curl 요청
// index.php
switch ($_SERVER['REQUEST_METHOD']) {
case 'GET':
echo filter_input(INPUT_GET, 'message');
break;
case 'POST':
print_r($_POST);
break;
default:
http_response_code(404);
}
// httpClient.php
$ch = curl_init(); // cURL 초기화
$queryString = http_build_query([message' => 'Hello, world']); // 쿼리스트링 생성
curl_setopt($ch, CURLOPT_HTTPGET, true); // cURL을 GET요청으로 보내기 옵션 설정
curl_setopt($ch, CURLOPT_URL, 'http://localhost:8080/?' . $queryString); // cURL을 index.php로 보내기 URL옵션 설정
curl_exec($ch); // cURL 전송
curl_reset($ch); // 옵션내용 리셋
curl_setopt($ch, CURLOPT_POST, true); // cURL을 POST요청으로 보내기 옵션 설정
curl_setopt($ch, CURLOPT_POSTFIELDS, ['message' => 'Hello, world']); // 전송할 POST데이터 옵션설정
curl_setopt($ch, CURLOPT_URL, 'http://localhost:8080');// cURL을 index.php로 보내기 URL옵션 설정
curl_exec($ch); // cURL 전송
curl_close($ch); // cURL을 종료
JSON
- json_encode(배열) // JSON형식으로 인코딩
- json_decode(JSON문자열,연관배열유무) // JSON문자열을 객체/배열로 디코딩, 연관배열유무가 true면 배열 false면 객체
Directories
- chdir('경로명') // 현재 디렉토리 변경
- getcwd() // 현재 작업중인 디렉토리
- scandir(__DIR__ . '/../..') // 해당 디렉토리에 포함된 디렉토리들을 반환
Filesystem (https://www.php.net/manual/en/book.filesystem.php)
- FILE // 현재 스크립트의 경로부터 파일명까지 표기 // /Users/kim/Desktop/project/testPHP/index.php
- DIR // 현재 스크립트의 경로까지 표기 /Users/kim/Desktop/project/testPHP
- 파일핸들링에 대해선 링크를 참조 (https://github.com/php-courses-inflearn/php7/blob/main/ch2/Filesystem/2/index.php)
- basename(__FILE__) // 해당 경로의 파일명만 추출
- dirname(__FILE__) // 해당 경로의 디렉토리만 추출
- pathinfo(__FILE__) // 해당 경로로부터 파일명과 파일형식등의 정보 추출
- glob('./*.php'); // 해당 경로에서 형식과 일치하는 파일을 찾는다
- fnmatch('*.php', 'index.php'); // 해당 경로에 지정한 형식과 일치하는 파일명이 존재하는지 체크
- copy() // 파일복사
- mkdir('./dir'); // 디렉토리 생성
- unlink('./index.php'); // 파일 삭제
- rmdir('./dir'); // 디렉토리 삭제
- file_get_contents(경로); // 파일을 읽고 문자열로 반환
- file(경로); // 파일을 읽고 배열로 반환
- file_put_contents(경로, 내용); // 파일을 쓰기
- stat(파일경로명) // 파일의 상세정보를 보여준다
- filesize(파일경로명) // 파일 사이즈를 출력
- filemtime(파일경로명) // 파일 수정시간을 출력
- is_file(파일경로명) // 파일타입이 파일인지 링크파일인지등을 보여준다
- link(파일명) // 하드링크파일 생성
- symlink(파일명) // 심볼릭링크파일 생성 (바로가기파일)
- readlink(심볼릭링크파일명) // 심볼릭링크파일의 원본파일 경로 표시
Stream
// 스트림을 이용해서 URL요청을 보내는 예제
$context = stream_context_create();
stream_context_set_option($context, ['http' => ['method' => 'GET']]);
file_get_contents('http://example.com', false, $context);
// 스트림 필터를 이용해서 해당 파일의 문자열을 전부 대문자로 바꾸는 예제
stream_get_filters();
$fh = fopen(dirname(__DIR__, 3) . '/README.md', 'r');
stream_filter_append($fh, 'string.toupper'); // 대문자로 변경
stream_get_contents($fh);
// 클라이언트와 서버를 생성가능
// 서버
$server = stream_socket_server('tcp://127.0.0.1:8000', $errno, $errstr); //서버열기
while ($sock = stream_socket_accept($server)) { // 클라이언트의 연결이있을경우 소켓열기
stream_socket_get_name($sock, true); // 클라이언트명
fwrite($sock, 'Hello, world from Server', 1024); // 데이터전송
fread($sock, 1024); // 데이터수신
fclose($sock); //클라이언트 연결 소켓닫기
}
fclose($server);//서버 닫기
//클라이언트
$sock = stream_socket_client('tcp://127.0.0.1:8000', $errno, $errstr); //생성
fwrite($sock, 'Hello, world', 1024); // 전송
fread($sock, 1024); // 수신
fclose($sock); // 닫기
※반환형이 리소스인 경우, 리소스란 무엇인가?
-
리소스는 파일타입의 하나이다 (String이나 Boolean처럼)
-
리소스는 PHP 외부에 존재하는 외부 자원을 의미한다 (DB나 네트워크 혹은 파일등)
-
리소스 핸들러는 파일이나 네트워크 연결과 같은 외부 자원의 리소스를 관리하기 위한 기능
-
예를 들어 fopen()이라는 함수를 사용할 경우, 반환형이 resource라는 리소스타입(=stream)이다. 외부자원(파일)을 핸들링 하기 위한 용도로 사용된다
-
해당 리소스는 열고 사용한 후 메모리 누수방지를 위해 해제해줘야한다 fclose()
-
리소스타입 참고 ( fopen()도 반환형이 resource타입이지만 구체적으로는 resource의 stream이다 ) // http://php.adamharvey.name/manual/kr/resource.php
-
resource와 handler는 정확히 같은 의미는 아니지만 같은 의미로 사용되는듯하다 (이 부분은 애매)
// document에 기재된 fopen함수의 상세 (반환형을 주목) fopen( string $filename, string $mode, bool $use_include_path = false, ?resource $context = null // ?이란 null이 들어가도 된다는 nullable이란뜻 ): resource|false
Program Execution
- exec('ls -al') // OS의 해당 CMD명령어 실행결과
- shell_exec('ls -al') // OS의 해당 CMD명령어 실행결과 // ls -al 이것도 동일 // exec()함수보다 더욱 상세