on
PHP 정리
PHP 정리
생활코딩 (https://opentutorials.org/course/1) PHP 기본문법 정리
// PHP란 무엇인가?
- 주로 HTML코드를 프로그래밍 적으로 생성
- 서버쪽에서 실행 되는 언어
*서버의 구성 : DB, 언어, WAS
- Personal Home Page Tools 의 약자에서 PHP:Hypertext Preprocessor 로 의미가 변경 되었다.
- PHP의 장점
- 웹에 최적화 된 언어이다.
- 웹개발에 필요한 수많은 로직들이 함수의 형태로 미리 제공 된다.
// 함수
- 코드의 재활용성을 높이기 위해 사용
*정의 function 함수이름 () {.....} *호출 function();
// 배열
*배열 = Array(‘’,‘’);
= [‘’,‘’];
*array.size() = count(변수) // 배열의 사이즈 만큼 카운트
*array 정렬 sort()
*array 역정렬 rsort()
*연관배열(‘’ => ‘’);
foreach($함수 as $키 => $밸류){
}
// include 와 require
-include 포함하려고 하는 파일이 없을 경우 warnning :주의 에러
-require 포함하려고 하는 파일이 없을 경우 fatal : 치명적인 에러
-include_once, require_once 파일을 한번만 추가하여 호출 한다.
PHP파일이 인클루드가 되어 있고 또 인클루드 되어있는 파일안에 같은 파일이 인클루드 되어있는 경우 , 코드에 중복이 생기기 때문에 이를 방지 하고자 _once를 사용 한다.
// namespace (네임 스페이스)
- 파일의 이름, 함수, 상수, 클래스 이름 등 중복을 피하기 위하여 충돌을 피하고자 사용
*디렉토리 파일처럼 계층적인 구조가 된다
namespace language/kr
namespace language/En
language/kr/함수명
- 하나의 파일 안에는 여러 네임스페이스 가질수 있음
// composer
- PHP의 의존성 관리 프로그램
* require :{”vendor/이름“:”버젼“}
- compser.lock : 이전에 사용 했었던 Composer를 기록, 앞으로 먼저 설치했던 패키지 버전 설치
- 프로젝트 관리의 역할을 함.
* require_one __DIR__.'/vendor/autoload.php';
- 한번만 선언하면 나머지는 컴포져가 알아서 실행 한다.
- “vendor”라고 하는 약속된 디렉토리 패키지에 다운로드 하여 관리 한다.
- 의존하고 싶은 라이브러리 찾는 법 -> packagist 원하는 패키지 검색
"require":{
"vendor/package":"x.xx"
ex.) "monolog/mnolog" :"1.22" #모노로그 벤더에 / 모노로그 패키지 : 1.22 버젼 을 의존하고 있다
} // 의존성
*mololog : 로깅 관련
// 정규 표현식
*preg_match("/\b검색문자\b/i"); // 불리언 반환
b는 단어의 경계를 의미 한다. 독립된 단어만을 의미 한다.
*preg_match("/정규표현식/", "검색할 문자 열", "$변수");
문자열에서 정규 표현식에 들어갈 문자를 검색해서 아무변수로 리턴 해 줌
- 구분자는 다른 것으로 대체가능
- 괄호로 묶인 구간은 독립적으로 찾을 수 있음
// 쿠키와 세션
-쿠키
- 보안상에서 신뢰할 수 없는 데이터, 유출되도 문제 없는 데이터를 저장
- 모든 데이터를 웹브라우저에 저장하므로 보안상 위험하다
- 세션 = 현재 사용자가 누구인지 식별할 수 있는 식별자만을 웹브라우저에 저장
- 실질적인 데이터는 서버나 데이터 베이스에 저장
- 세션이 시작되는 부분 에서는 * session_start();
Ex. 로그인 (사용자의 정보 입력받음) -> 입력받은 사용자 정보 (로그인) 비교후 참이면, 세션에 데이터 저장 -> 로그인
- 세션 전역변수를 이용해 로그인이 되었는지 확인 한다
// 디버깅
- bug : 의도 하지 않은 프로그램의 동작
- debugging : 버그의 원인을 찾아서 해결하는 활동
- debugger : 디버깅을 도와주는 프로그램
- log 프로그램의 상태를 기록해 놓았다가 문제발생시 문제에 맥락을 찾는데
도움을 주고 분석할 수 있음
* var_dump() 인자로 전달된 값을 화면에 출력해 주는 함수
( - tail : 파일의 끝 부분 부터 거꾸로 읽어서 출력하는 명령어
-f 옵션을 사용하면 실시간으로 파일의 변경사항을 열람 할 수 있다 )
- access log : (html, css, js, image 와 같은) 리소스가 웹서버를 통해서 로드 됐을 때 기록되는 정보 (권한이 있어야 접근가능)
* bitnami : /opt/bitnami/apache2/logs/access_log
* ubuntu : /var/log/apache2/access_log
/var/log/httpd/access_log
- error log : 오류가 발생했을 때 기록되는 정보
*bitnami : /opt/bitnami/apache2/logs/error_log
*ubuntu : /var/log/apache2/error_log
/var/log/httpd/error_log
EX.) tail -f /opt/bitnami/apache2/logs/access_log
-Xdeburg - 디버깅을 도와주는 도구
- 리모트 버전으로 사용 시 9000 포트 사용
- vi와 연동해서 디버깅 도구로 사용 가능
// PHP Document
- php는 개발에 필요 할만한 기능들이 거의 내장 되어 있다.
- 어떠한 기능이 궁금할때 도큐먼트 검색 하자
- 관심을 가져야 할 함수
* Data/Time 날짜 관련
* File System , GD: 이미지 처리 , math : 반올림 구하기 등등 수 제어
* session Extensions , Text pocessing : 정규 표현식 , 문자 처리
* class/object : 객체 지향 , database: 데이터 베이스 관련 (7v – mysqli)
* [] 감싸져 있으면 생략가능 인자이다
* see Also = 함수와 연관되어 사용 되는 함수
-예제를 꼭 보자
// php web application
- FTP 파일전송 프로그램 win scp 사용
- 원격 서버 ssh접속 putty
- 압축해제
* tar xvfzp xxxx.tar.gz
* unzip xxxx.zip
- TEXTCUBE 설치형 블로그
// OOP (object oriented programming) 객체지향 프로그래밍
OOP <-> PP(procedural programming)
- pp기반 위에서 oop탄생
- 탄생배경
-프로그램안의 코드들의 간섭도가 높아지면서 복잡해짐
- 각각의 함수들의 복잡도를 낮추기 위해
- 오브젝트 :서로 연관되어 있는 함수 . 변수들을 함수로 묶어 분류 하는 것
// 함수와 객체
- 함수를 통하여 프로그램을 제어한다. -> PP : 함수가 중요한 역할을 한다.
- 객체를 통하여 프로그램을 제어한다. -> OOP : 객체가 중요한 역할을 한다.
- PP와 OOP의 차이
* pp : 함수들이 각각의 독립적이기 때문에 파일이름을 각각 적어 줘야 한다. ->
파라미터 값이 바뀌면 일일이 바꿔 줘야 함
* OOP: 객체를 생성할 때 파라미터를 한번만 선언 -> 중복코드 제거
// 생성자
- 객체의 인스턴스를 생성할 때 인자를 입력 받음
* 생성자 명은 무조건 !! __construct
function __construct($파라미터){
...
}
* this -> 파라미터 : 클래스를 통해서 인스턴스화 한 인스턴스 자체를 가르킴
// 스태틱
- 인스턴스 변수는 각각의 인스턴스를 생성할 때 인스턴스 변수는 각각 만들어 진다 -> 독립적
- 스태틱 변수는 클래스에 소속되는 변수로, 모든 인스턴스가 공유 한다.
* 인스턴스에 작기 자신을 원할때는 this ->
* 스태틱이 자기 자신을 원할때는 self::
// 클래스 로딩과 네임스페이스
* NameSapace = package 라고 보면 편함.
- autoloading
- 필요한 파일을 자동으로 require 해주는 기능
- 정의 되지 않은 함수의 정의 부를 때 자동으로 로딩시켜 주는 기능을 함
- php파일에 정의된 클래스가 많을 때 사용 하면 좋음
- namespace
/*
namespace greeting\en; #선언
class Hi __construct(){
ehco 'hi';
}
namespace greeting\ko;
class Hi __construct(){
echo '안녕';
}
greeting < 부모 네임 스페이스
-호출
new \greeting\en\Hi(); //영어
new \greeting\ko\Hi(); //한글
use \greeing\en, greeting\ko // 사용할 네임 스페이스 지정
new en\Hi(); //영어
new ko\Hi(); //한글
또는
use \greeting\en\Hi as Hien ;
use \greeting\ko\hi as Hiko ;
new Hien();
new Hiko();
// 익명함수(콜백함수) 로 사용 법
spl_autoroad_register (funtion ($path){
$path = str_replace('\\','/',$path); //맥을 사용할때 , 맥에서는 경로를 잡을때 '/'를 사용
$path =$path.'.php';
require_once $path
});
use \greeting\en\Hi as Hien ;
use \greeting\ko\hi as Hiko ;
new Hien();
new Hiko();
// override 와 parent
-override (오버라이드)
-부모자식 클래스 간의 관계에서 메소드를 어떻게 할 것인가?
-부모클래스의 메소드를 자식클래스에서 부모클래스의 메소드를 덮어쓰거나, 또는 부모클래스의 기능을 자식클래스에서 사용 하고 싶을때 사용하는 기법
- "자식클래스에서 부모클래스를 오버라이드 했다." = 재정의
class PrentClass {
function callMethod($param){
echo "{$param}";
}
}
class ChildClass extends ParentClass{
function callMethod($param){
echo "child.{$param}";
}
}
$obj = new ChildClsss();
obj -> callMethod('Method');
- 현재 우리가 사용하고 있는 자식 클래스에서 부모 클래스의 메소드를 호출 하는 키워드
parent:: callMethod($param);
// 캡슐화 (상속,접근제어)
class ParentClass{
public $_public = 'public'; // 부모자식 모두 접근 가능
protected $_protected = 'protected'; // 부모자식 간의 메소드 안에서는 호출가능, 메소드 바깥에서는 불가능
private $_private = 'private'; // 같은 클래스 안에서만 사용 가능
}
// 기본적으로 private 설정 외부의 노출이 필요하다만 public
- protected :인스턴스를 통해서 직접접근은 금지,상속관계로 연결되어 있는 자식클래스에서는 접근이 가능하다.
class ChildClass extends ParentClass{
function callPublic(){
echo $this->_public;
}
function callProtected(){
echo $this->_protected;
}
function callPrivate(){
echo $this->_private;
}
}
$obj = new ChildClass();
echo $obj->_public;
//echo $obj->_protected; // 접근 불가능
echo $obj->_private;
$obj->callPublic();
$obj->callProtected(); // 접근 가능
$obj->callPrivate();
--final! :자식클래스에서 부모클래스의 메소드를 오버라이드를 못하게 하는 것!
final class ParentClass{ // 클래스 앞에 선언하면 클래스를 오버라이드 할 수 없게 함.
function a(){
echo 'Parent';
}
final function b(){ // 자식클래스에서 오버라이드 안됨
echo 'Parent B';
}
}
class ChildClass extends ParentClass{
function a(){
echo 'Child';
}
function b(){
echo 'Child B';
}
}
$obj = new ChildClass();
$obj->a();
-인터페이스 (interface)
- 인터페이스를 implements 받은 클래스는 반드시 인터페이스에서 정의된 메소드를 정의해야 됨!
- 인터페이스는 코드에서 이루어지는 사회적 계약이다.!!!
interface ContractInterface
{
public function promiseMethod(array $param):int; // 인자는 array로 받고 리턴은 int형이다.
}
interface ContractInterface2
{
public function promiseMethod2(array $param):int;
}
class ConcreateClass implements ContractInterface, ContractInterface2 // 복수의 인터페이스 구현 가능 (복수의 인터페이스 implements 가능)
{
public function promiseMethod(array $param):int
{
return 1;
}
public function promiseMethod2(array $param):int
{
return 1;
}
}
$obj = new ConcreateClass();
$obj->promiseMethod([1,2]);
// abstract 추상 클래스
abstract class ParentClass // 추상메소드가 하나라도 있다면 abstract 선언
{
public function a()
{
echo 'a';
}
public abstract function b(); // 자식클래스에서 강제 정의 해야함
}
class ChildClass extends ParentClass
{
public function b()
{
}
* 템플릿 디자인 패턴
소프트웨어를 개발하는 중에 부딪히는 문제중에서 주기성을 가지고 자주 등장하는 문제들을
형식화 시켜서(패턴화 시켜서) 프로그래밍 하는 기법
“공부를 위한 공부를 하는 것이 아니다, 현실의 문제를 해결하기 위해 공부하는 것이다.“ - egoing님
공유하기 글 요소 저작자표시
from http://print-helloworld.tistory.com/1 by ccl(A) rewrite - 2021-12-27 17:26:40