SlideShare a Scribd company logo
1 of 18
PHP 7 특징 및 기능
연구개발팀
손정아
목표
1. Modern PHP – 올바른 코딩이란
2. PHP >=7(ver.) 의 새로운 특징 및 기능
세부
1. PHP 표준 권고 (PSR)
2. 네임스페이스
3. 간결한 배열 문법
4. 트레이트
5. 클래스 오토로딩
6. 익명 함수
7. 동적 프로퍼티/메소드 생성
8. ::class 키워드로 클래스 이름 결정
9. 타입 힌팅
1. PHP 표준 권고 (PSR)
• PHP 프레임워크 상호 운영성 그룹((PHP-FIG; PHP Framework Interop
Group - http://www.php-fig.org)은 Drupal, Laravel, Symfony, CakePHP,
Composer 등을 만든 권위있는 PHP 개발자들이 모인 커뮤니티 그룹
• 프레임워크나 라이브러리를 사용하면 종속되어 버리는 문제를 해결하
고 각 프레임워크이나 애플리케이션간의 상호 운용성을 확보하기 위
한 PHP 표준 권고(PSR; PHP Standard Recommendation) 이라는 규약을
제정
• Coding Style : PSR-1(Basic), PSR-2
• AutoLoading : PSR-4
• Interfaces : PSR-3(Logger), PSR-6(Caching), PSR-7(HTTP Message)
1-1. PSR-1 Basic Coding Standard
• Files MUST use only <?php and <?= tags.
• Files MUST use only UTF-8 without BOM for PHP code.
• Namespaces and classes MUST follow an "autoloading" PSR: [PSR-0,
PSR-4].
• 클래스 이름은 반드시 StudlyCaps 와 같이 첫 글자를 대문자로 할
것
• 클래스내 상수는 반드시 모두 대문자로 작성하고 구분자로 _ 를
사용할 것
• 클래스내 메소드의 이름은 반드시 camelCase() 처럼 카멜케이스
(camelCase) 를 사용할 것.
1
2
3
4
5
6
7
8
9
10
11
<?php
namespace VendorModel;
class Foo
{
const VERSION = '1.0';
const DATE_APPROVED = '2012-06-01';
function camelCase(){
}
}
1-2. PSR-2 Coding Style Guide
• 들여 쓰기는 tab 대신 4칸의 공백 사용
• 닫는 태그(?>) 는 사용하지 않음
• namespace 선언뒤에는 한 줄의 공백을 사용하고 여러 개의 use는 줄 공백없이
사용후에 마지막 블록뒤에 한 줄의 공백을 사용할 것
• 클래스 구문의 여는 괄호는 다음 줄에 사용하고 닫는 괄호는 본문 다음 줄에 사용할 것
• 메소드 구문의 여는 괄호는 다음 줄에 사용하고 닫는 괄호는 본문 다음 줄에 사용할 것
• 가시성과 관련된 키워드인 abstract 과 final 은 모든 메소드와 프로퍼티에 명시적으로 사용하고 제일 먼
저 와야 하며 static 구문은 그 후에 위치시킬 것
• if 나 elseif 같은 제어 관련 구문은 제어문 뒤에 한 개의 공백을 두고 그 후에 괄호를 사용하고 조건문을
기술할 것. 함수 호출이나 메소드 호출은 메소드명 뒤에 공백이 있으면 안 됨,
• if 나 elseif 같은 제어 관련 구문의 여는 괄호는 제어문과 같은 줄에 위치해야 함. 닫는 괄호는 본문의 다
음 줄에 위치
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
namespace VendorPackage;
use FooInterface;
use BarClass as Bar;
class Foo extends Bar implements FooInterface
{
public function sampleFunction($a, $b = null)
{
if ($a === $b) {
bar();
} elseif ($a > $b) {
$foo->bar($arg1);
}
}
}
1-3. PSR-4 : AutoLoader
• PHP 5 에 오토로딩 기능이 추가되었지만 라이브러리를 오토로딩하려면 직접 spl_autoload_register 메소드를 호출하여 일일이 등록해야 합니
다. 외부 라이브러리를 사용할 경우 일일이 이를 등록하는 것은 만만한 작업이 아닙니다.
• PSR-4 는 PSR-0 을 대체하는 새로운 오토로딩 표준으로 다음과 같이 정규화된 클래스 이름(FQCN; Fully Qualified Class Name) 을 규정하고 있으
며 이를 준수하여 패키지를 개발할 경우 패캐지 관리자인 컴포저를 통해 손쉽게 의존성 있는 모든 패키지를 로딩할 수 있습니다.
<NamespaceName>(<SubNamespaceNames>)*<ClassName>
• 컴포저는 vendor/autoload.php 파일을 생성하므로 개발자는 다음과 같이 한 줄만 추가하면 include나 require를 사용하지 않고도 편리하게 개발
할 수 있습니다.
<?php
require 'vendor/autoload.php';
• 여기에서 NamespaceName 은 최상위 네임스페이스(일반적으로 회사명이나 개인의 id 를 사용합니다)를 설정하고 SubNamespaceNames 은 하
위 네임스페이스를 ClassName 은 클래스 이름을 입력합니다.
2. 네임스페이스
선언 Defining [Wiki2.php] 사용 Using
<?php
namespace Wiki2Sub;
Class Book{
public function show(){
echo "test2";
}
}
<?php
include "Wiki2.php";
use Wiki2SubBook as wiki2;
$c = new wiki2();
$c->show();
• http://php.net/manual/kr/language.namespaces.rationale.php
3. 간결한 배열 문법
변경 전 변경 후
<?php
$arr = array(
"name1" => "test1",
"name2" => "test2",
);
<?php
$arr = [
"name1" => "test1",
"name2" => [
"name_sub1"=>"test_sub1",
"name_sub2"=>"test_sub2",
],
];
• array() 문법대신 간단하게 [ ] 로 배열을 기술
4. 트레이트 (trait)
• http://php.net/language.oop5.traits
• 코드 재사용 기법
• class 대신 trait이라는 키워드를 사용
• 우선순위 : trait, class
<?
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}
class TheWorldIsNotEnough {
use HelloWorld;
public function sayHello() {
echo 'Hello Universe!';
}
}
$o = new TheWorldIsNotEnough();
$o->sayHello();
>> Hello World!
5. 클래스 오토로딩 Class Autoloading
• http://php.net/manual/kr/languag
e.oop5.autoload.php
• http://php.net/manual/kr/function
.spl-autoload-register.php
• 1-3 PSR-4 AutoLoader 참조
<?php
spl_autoload_register('MyClassLoader::LibraryLoader');
spl_autoload_register('MyClassLoader::DatabaseLoader');
class MyClassLoader
{
public static function LibraryLoader($class)
{
include 'libraries/' . $class. '.php';
}
public static function DatabaseLoader ($class)
{
include 'databases/' . $class. '.php';
}
}
6. 익명함수 (annoymous function)
• http://php.net/manual/kr/languag
e.oop5.anonymous.php
• http://modernpug.github.io/php-
the-right-way/pages/Functional-
Programming.html
• 클로져 또는 콜백이라고도 함
?php
$input = array(1, 2, 3, 4, 5, 6);
// 익명 함수를 하나 만들어서 변수에 대입
$filter_even = function($item) {
return ($item % 2) == 0;
};
// array_filter 내장 함수는 배열과 함수를 인자로 받는다.
$output = array_filter($input, $filter_even);
// 익명 함수를 변수에 할당해서 전달할 필요없이 이렇게 하는 것도 가능
하다.
$output = array_filter($input, function($item) {
return ($item % 2) == 0;
});
print_r($output);
7. 동적 프로퍼티/메소드 생성
• http://php.net/manual/kr/languag
e.oop5.overloading.php
• __set, __get [프로퍼티] ,
• __call, __callStatic [메서드] 등으
로 동적으로 변수, 메서드를 생성
<?php
class MethodTest
{
public function __call($name, $arguments)
{
// 주의: $name 의 값은 대소를 구분합니다.
echo "Calling object method '$name' "
. implode(', ', $arguments). "n";
}
/** PHP 5.3.0 이후 */
public static function __callStatic($name, $arguments)
{
// 주의: $name 의 값은 대소를 구분합니다.
echo "Calling static method '$name' "
. implode(', ', $arguments). "n";
}
}
$obj = new MethodTest;
$obj->runTest('in object context');
MethodTest::runTest('in static context'); // As of PHP 5.3.0
8. 스코프 해결 연산자 (::)
• http://php.net/manual/kr/languag
e.oop5.paamayim-
nekudotayim.php
• className::Method/Property
<?php
class MyClass {
const CONST_VALUE = 'A constant value';
}
$classname = 'MyClass';
echo $classname::CONST_VALUE; // As of PHP 5.3.0
echo MyClass::CONST_VALUE;
9. 타입 힌팅
• http://php.net/manual/kr/language.oop5.paamayim-nekudotayim.php
• 함수는 이제 파라미터를 객체(함수 프로토 타입에 클래스의 이름을 명시하는것으로), 인터페이스, 배
열(PHP 5.1 이후) 또는 callable(PHP 5.4 이후) 로 강제할수 있게 되었습니다. 하지만, NULL을 디폴트 값으
로 지정하게 되면, 이후 호출시 NULL을 인자로 넘기는것도 가능합니다.
<?php
use IlluminateContractsContainerContainer as ContainerContract;
class Dispatcher implements DispatcherContract
{
public function __construct(ContainerContract $container = null) // $container 타입을 클래스명으로!
{
$this->container = $container ?: new Container;
}
}
10. PHP7
• http://php.net/manual/kr/migration70.new-features.php
• https://daylerees.com/php-pandas-php7/
• Return Type Declarations
• Scalar Type Declarations
• Null Coalesce Operator
• Spaceship Operator
• Define Constant Arrays
• Group Use Declarations
더 읽을거리
• PHP Framework Trend : https://goo.gl/S5DafV
• PHP Best Practices : http://www.meye.net/php-best-practices
• PHP Best Practices 원문 : https://phpbestpractices.org
• Xpressengine: https://www.xpressengine.com/learn
참조사이트
1. PHP Right Way (영어) : http://www.phptherightway.com
2. PHP Right Way (한국어) : http://modernpug.github.io/php-the-right-
way
3. Laravel (정광섭) :
https://www.lesstif.com/pages/viewpage.action?pageId=24445740
4. php.net : http://php.net/manual/kr/langref.php

More Related Content

What's hot

What's hot (20)

Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scopeJavascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
 
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop
 
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive
 
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가
 
(쿼리 변환, Query Transformation,서브쿼리푸시,SubQuery Pushing)SQL튜닝을 위해 서브쿼리의 드라이빙을 제어...
(쿼리 변환, Query Transformation,서브쿼리푸시,SubQuery Pushing)SQL튜닝을 위해 서브쿼리의 드라이빙을 제어...(쿼리 변환, Query Transformation,서브쿼리푸시,SubQuery Pushing)SQL튜닝을 위해 서브쿼리의 드라이빙을 제어...
(쿼리 변환, Query Transformation,서브쿼리푸시,SubQuery Pushing)SQL튜닝을 위해 서브쿼리의 드라이빙을 제어...
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
 
Javascript introduction, dynamic data type, operator
Javascript introduction, dynamic data type, operatorJavascript introduction, dynamic data type, operator
Javascript introduction, dynamic data type, operator
 
(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)
(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)
(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료
 
(오라클힌트/SQL튜닝 강좌)쿼리튜닝을 위한 오라클의 10053 이벤트
(오라클힌트/SQL튜닝 강좌)쿼리튜닝을 위한 오라클의 10053 이벤트(오라클힌트/SQL튜닝 강좌)쿼리튜닝을 위한 오라클의 10053 이벤트
(오라클힌트/SQL튜닝 강좌)쿼리튜닝을 위한 오라클의 10053 이벤트
 
자바모델 클래스에 날개를달자_롬복(Lombok)
자바모델 클래스에 날개를달자_롬복(Lombok)자바모델 클래스에 날개를달자_롬복(Lombok)
자바모델 클래스에 날개를달자_롬복(Lombok)
 
자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초
 
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
 
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
 
Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수
 
[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit
[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit
[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit
 
Assembly 스터디 2
Assembly 스터디 2Assembly 스터디 2
Assembly 스터디 2
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개
 

Similar to PHP 7의 새로운 특징과 기능 요약

자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수
유진 변
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
NAVER Engineering
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamic
knight1128
 

Similar to PHP 7의 새로운 특징과 기능 요약 (20)

Laravel 로 배우는 서버사이드 #3
Laravel 로 배우는 서버사이드 #3Laravel 로 배우는 서버사이드 #3
Laravel 로 배우는 서버사이드 #3
 
PSR - Code Convention
PSR - Code ConventionPSR - Code Convention
PSR - Code Convention
 
Perl Script Document
Perl Script DocumentPerl Script Document
Perl Script Document
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수
 
5.Spring IoC&DI(DI와 관련된 어노테이션)
5.Spring IoC&DI(DI와 관련된 어노테이션)5.Spring IoC&DI(DI와 관련된 어노테이션)
5.Spring IoC&DI(DI와 관련된 어노테이션)
 
Java_05 class
Java_05 classJava_05 class
Java_05 class
 
Java class
Java classJava class
Java class
 
자바야 놀자 PPT
자바야 놀자 PPT자바야 놀자 PPT
자바야 놀자 PPT
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
 
Java script
Java scriptJava script
Java script
 
파이썬 namespace Binding 이해하기
파이썬 namespace Binding 이해하기 파이썬 namespace Binding 이해하기
파이썬 namespace Binding 이해하기
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamic
 
4-1. javascript
4-1. javascript4-1. javascript
4-1. javascript
 
Postman과 Newman을 이용한 RestAPI 테스트 자동화 가이드
Postman과 Newman을 이용한 RestAPI 테스트 자동화 가이드 Postman과 Newman을 이용한 RestAPI 테스트 자동화 가이드
Postman과 Newman을 이용한 RestAPI 테스트 자동화 가이드
 
Java_01 기초
Java_01 기초Java_01 기초
Java_01 기초
 
Java 기초
Java 기초Java 기초
Java 기초
 
E government framework
E government frameworkE government framework
E government framework
 
Sonarqube 20160509
Sonarqube 20160509Sonarqube 20160509
Sonarqube 20160509
 
Spring MVC
Spring MVCSpring MVC
Spring MVC
 
웹 개발 스터디 01 - PHP
웹 개발 스터디 01 - PHP웹 개발 스터디 01 - PHP
웹 개발 스터디 01 - PHP
 

PHP 7의 새로운 특징과 기능 요약

  • 1. PHP 7 특징 및 기능 연구개발팀 손정아
  • 2. 목표 1. Modern PHP – 올바른 코딩이란 2. PHP >=7(ver.) 의 새로운 특징 및 기능
  • 3. 세부 1. PHP 표준 권고 (PSR) 2. 네임스페이스 3. 간결한 배열 문법 4. 트레이트 5. 클래스 오토로딩 6. 익명 함수 7. 동적 프로퍼티/메소드 생성 8. ::class 키워드로 클래스 이름 결정 9. 타입 힌팅
  • 4. 1. PHP 표준 권고 (PSR) • PHP 프레임워크 상호 운영성 그룹((PHP-FIG; PHP Framework Interop Group - http://www.php-fig.org)은 Drupal, Laravel, Symfony, CakePHP, Composer 등을 만든 권위있는 PHP 개발자들이 모인 커뮤니티 그룹 • 프레임워크나 라이브러리를 사용하면 종속되어 버리는 문제를 해결하 고 각 프레임워크이나 애플리케이션간의 상호 운용성을 확보하기 위 한 PHP 표준 권고(PSR; PHP Standard Recommendation) 이라는 규약을 제정 • Coding Style : PSR-1(Basic), PSR-2 • AutoLoading : PSR-4 • Interfaces : PSR-3(Logger), PSR-6(Caching), PSR-7(HTTP Message)
  • 5. 1-1. PSR-1 Basic Coding Standard • Files MUST use only <?php and <?= tags. • Files MUST use only UTF-8 without BOM for PHP code. • Namespaces and classes MUST follow an "autoloading" PSR: [PSR-0, PSR-4]. • 클래스 이름은 반드시 StudlyCaps 와 같이 첫 글자를 대문자로 할 것 • 클래스내 상수는 반드시 모두 대문자로 작성하고 구분자로 _ 를 사용할 것 • 클래스내 메소드의 이름은 반드시 camelCase() 처럼 카멜케이스 (camelCase) 를 사용할 것. 1 2 3 4 5 6 7 8 9 10 11 <?php namespace VendorModel; class Foo { const VERSION = '1.0'; const DATE_APPROVED = '2012-06-01'; function camelCase(){ } }
  • 6. 1-2. PSR-2 Coding Style Guide • 들여 쓰기는 tab 대신 4칸의 공백 사용 • 닫는 태그(?>) 는 사용하지 않음 • namespace 선언뒤에는 한 줄의 공백을 사용하고 여러 개의 use는 줄 공백없이 사용후에 마지막 블록뒤에 한 줄의 공백을 사용할 것 • 클래스 구문의 여는 괄호는 다음 줄에 사용하고 닫는 괄호는 본문 다음 줄에 사용할 것 • 메소드 구문의 여는 괄호는 다음 줄에 사용하고 닫는 괄호는 본문 다음 줄에 사용할 것 • 가시성과 관련된 키워드인 abstract 과 final 은 모든 메소드와 프로퍼티에 명시적으로 사용하고 제일 먼 저 와야 하며 static 구문은 그 후에 위치시킬 것 • if 나 elseif 같은 제어 관련 구문은 제어문 뒤에 한 개의 공백을 두고 그 후에 괄호를 사용하고 조건문을 기술할 것. 함수 호출이나 메소드 호출은 메소드명 뒤에 공백이 있으면 안 됨, • if 나 elseif 같은 제어 관련 구문의 여는 괄호는 제어문과 같은 줄에 위치해야 함. 닫는 괄호는 본문의 다 음 줄에 위치 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <?php namespace VendorPackage; use FooInterface; use BarClass as Bar; class Foo extends Bar implements FooInterface { public function sampleFunction($a, $b = null) { if ($a === $b) { bar(); } elseif ($a > $b) { $foo->bar($arg1); } } }
  • 7. 1-3. PSR-4 : AutoLoader • PHP 5 에 오토로딩 기능이 추가되었지만 라이브러리를 오토로딩하려면 직접 spl_autoload_register 메소드를 호출하여 일일이 등록해야 합니 다. 외부 라이브러리를 사용할 경우 일일이 이를 등록하는 것은 만만한 작업이 아닙니다. • PSR-4 는 PSR-0 을 대체하는 새로운 오토로딩 표준으로 다음과 같이 정규화된 클래스 이름(FQCN; Fully Qualified Class Name) 을 규정하고 있으 며 이를 준수하여 패키지를 개발할 경우 패캐지 관리자인 컴포저를 통해 손쉽게 의존성 있는 모든 패키지를 로딩할 수 있습니다. <NamespaceName>(<SubNamespaceNames>)*<ClassName> • 컴포저는 vendor/autoload.php 파일을 생성하므로 개발자는 다음과 같이 한 줄만 추가하면 include나 require를 사용하지 않고도 편리하게 개발 할 수 있습니다. <?php require 'vendor/autoload.php'; • 여기에서 NamespaceName 은 최상위 네임스페이스(일반적으로 회사명이나 개인의 id 를 사용합니다)를 설정하고 SubNamespaceNames 은 하 위 네임스페이스를 ClassName 은 클래스 이름을 입력합니다.
  • 8. 2. 네임스페이스 선언 Defining [Wiki2.php] 사용 Using <?php namespace Wiki2Sub; Class Book{ public function show(){ echo "test2"; } } <?php include "Wiki2.php"; use Wiki2SubBook as wiki2; $c = new wiki2(); $c->show(); • http://php.net/manual/kr/language.namespaces.rationale.php
  • 9. 3. 간결한 배열 문법 변경 전 변경 후 <?php $arr = array( "name1" => "test1", "name2" => "test2", ); <?php $arr = [ "name1" => "test1", "name2" => [ "name_sub1"=>"test_sub1", "name_sub2"=>"test_sub2", ], ]; • array() 문법대신 간단하게 [ ] 로 배열을 기술
  • 10. 4. 트레이트 (trait) • http://php.net/language.oop5.traits • 코드 재사용 기법 • class 대신 trait이라는 키워드를 사용 • 우선순위 : trait, class <? trait HelloWorld { public function sayHello() { echo 'Hello World!'; } } class TheWorldIsNotEnough { use HelloWorld; public function sayHello() { echo 'Hello Universe!'; } } $o = new TheWorldIsNotEnough(); $o->sayHello(); >> Hello World!
  • 11. 5. 클래스 오토로딩 Class Autoloading • http://php.net/manual/kr/languag e.oop5.autoload.php • http://php.net/manual/kr/function .spl-autoload-register.php • 1-3 PSR-4 AutoLoader 참조 <?php spl_autoload_register('MyClassLoader::LibraryLoader'); spl_autoload_register('MyClassLoader::DatabaseLoader'); class MyClassLoader { public static function LibraryLoader($class) { include 'libraries/' . $class. '.php'; } public static function DatabaseLoader ($class) { include 'databases/' . $class. '.php'; } }
  • 12. 6. 익명함수 (annoymous function) • http://php.net/manual/kr/languag e.oop5.anonymous.php • http://modernpug.github.io/php- the-right-way/pages/Functional- Programming.html • 클로져 또는 콜백이라고도 함 ?php $input = array(1, 2, 3, 4, 5, 6); // 익명 함수를 하나 만들어서 변수에 대입 $filter_even = function($item) { return ($item % 2) == 0; }; // array_filter 내장 함수는 배열과 함수를 인자로 받는다. $output = array_filter($input, $filter_even); // 익명 함수를 변수에 할당해서 전달할 필요없이 이렇게 하는 것도 가능 하다. $output = array_filter($input, function($item) { return ($item % 2) == 0; }); print_r($output);
  • 13. 7. 동적 프로퍼티/메소드 생성 • http://php.net/manual/kr/languag e.oop5.overloading.php • __set, __get [프로퍼티] , • __call, __callStatic [메서드] 등으 로 동적으로 변수, 메서드를 생성 <?php class MethodTest { public function __call($name, $arguments) { // 주의: $name 의 값은 대소를 구분합니다. echo "Calling object method '$name' " . implode(', ', $arguments). "n"; } /** PHP 5.3.0 이후 */ public static function __callStatic($name, $arguments) { // 주의: $name 의 값은 대소를 구분합니다. echo "Calling static method '$name' " . implode(', ', $arguments). "n"; } } $obj = new MethodTest; $obj->runTest('in object context'); MethodTest::runTest('in static context'); // As of PHP 5.3.0
  • 14. 8. 스코프 해결 연산자 (::) • http://php.net/manual/kr/languag e.oop5.paamayim- nekudotayim.php • className::Method/Property <?php class MyClass { const CONST_VALUE = 'A constant value'; } $classname = 'MyClass'; echo $classname::CONST_VALUE; // As of PHP 5.3.0 echo MyClass::CONST_VALUE;
  • 15. 9. 타입 힌팅 • http://php.net/manual/kr/language.oop5.paamayim-nekudotayim.php • 함수는 이제 파라미터를 객체(함수 프로토 타입에 클래스의 이름을 명시하는것으로), 인터페이스, 배 열(PHP 5.1 이후) 또는 callable(PHP 5.4 이후) 로 강제할수 있게 되었습니다. 하지만, NULL을 디폴트 값으 로 지정하게 되면, 이후 호출시 NULL을 인자로 넘기는것도 가능합니다. <?php use IlluminateContractsContainerContainer as ContainerContract; class Dispatcher implements DispatcherContract { public function __construct(ContainerContract $container = null) // $container 타입을 클래스명으로! { $this->container = $container ?: new Container; } }
  • 16. 10. PHP7 • http://php.net/manual/kr/migration70.new-features.php • https://daylerees.com/php-pandas-php7/ • Return Type Declarations • Scalar Type Declarations • Null Coalesce Operator • Spaceship Operator • Define Constant Arrays • Group Use Declarations
  • 17. 더 읽을거리 • PHP Framework Trend : https://goo.gl/S5DafV • PHP Best Practices : http://www.meye.net/php-best-practices • PHP Best Practices 원문 : https://phpbestpractices.org • Xpressengine: https://www.xpressengine.com/learn
  • 18. 참조사이트 1. PHP Right Way (영어) : http://www.phptherightway.com 2. PHP Right Way (한국어) : http://modernpug.github.io/php-the-right- way 3. Laravel (정광섭) : https://www.lesstif.com/pages/viewpage.action?pageId=24445740 4. php.net : http://php.net/manual/kr/langref.php