'Programming/PHP'에 해당하는 글 117건

PSR-2

Programming/PHP 2016. 2. 18. 23:20

PSR-2 : 코드 스타일 가이드 (http://www.php-fig.org/psr/psr-2/)


PSR-1 코딩 스타일의 확장판이다.


<?php
namespace Vendor\Package;
 
use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
 
class Foo extends Bar implements FooInterface
{
    public function sampleFunction($a$b = null)
    {
        if ($a === $b) {
            bar();
        } elseif ($a > $b) {
            $foo->bar($arg1);
        } else {
            BazClass::bar($arg2$arg3);
        }
    }
 
    final public static function bar()
    {
        // method body
    }
}
cs



Basic Coding Standard


PSR-1 에 명시된 모든 코딩 스타일 가이드를 준수해야 한다.



Files


라인 끝은 Unix LF (linefeed) 를 사용해야 한다.

파일의 끝은 한 줄을 띄고 마지막 ?> 태그는 생략해야 한다.



Lines


한 줄에 soft 길이 제한은 120 자가 되어야 한다; 자동 스타일 체커 (경고여야지 에러로 출력하지 말아야 한다.)

한 줄에 너무 길지 않도록 80 자 정도만 사용하고 80 자 이상은 다음 줄로 분리하도록 한다.

라인의 끝에 공백을 두지 않는다.

가독성과 코드 블럭을 가리키기 위해 빈 라인을 사용할 수 있다.

한 줄에 하나 이상의 구문을 사용하지 않아야 한다.



Indenting


들여쓰기는 스페이스 4칸을 사용하고, 탭은 사용하지 않아야 한다.



Keywords and True/False/Null


PHP 키워드나 상수 true, false, null 등은 모두 소문자로 사용해야 한다.



Namespace and Use Declarations


namespace 나 use 블럭을 선언하고는 한 줄을 띄어야 한다.

모든 use 선언은 namespace 다음에 와야 한다.

use 키워드는 선언 하나 당 하나씩만 사용해야 한다.


<?php
namespace Vendor\Package;
 
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
 
// ... additional PHP code ...
cs



Extends and Implements


extends 와 implements 키워드는 클래스 이름과 같은 줄에 선언되어야 한다.

implements 리스트는 한번의 들여쓰기와 함께 여러 행에 걸쳐 분리될 수 있다.

class 와 method 의 시작 중괄호는 다음 줄에 와야 하고, 끝 중괄호도 본문 끝의 다음 줄에 와야 한다.


<?php
namespace Vendor\Package;
 
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
 
class ClassName extends ParentClass implements \ArrayAccess, \Countable
{
    // constants, properties, methods
}
cs


<?php
namespace Vendor\Package;
 
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
 
class ClassName extends ParentClass implements
    \ArrayAccess,
    \Countable,
    \Serializable
{
    // constants, properties, methods
}
cs



Properties


가시성(Visibility) 은 모든 property 에 선언되어야 한다.

var 키워드는 property 선언으로 사용하지 않아야 한다.

구문 당 하나 이상의 property 를 선언하지 않아야 한다.

property 의 이름에 protected 나 private 를 가리키는 _(underscore) 접두어를 사용하지 않는 것이 좋다.


<?php
namespace Vendor\Package;
 
class ClassName
{
    public $foo = null;
}
cs



Method


가시성(Visibility) 은 모든 method 에 선언되어야 한다.

property 의 이름에 protected 나 private 를 가리키는 _(underscore) 접두어를 사용하지 않는 것이 좋다.

method 이름 뒤에 공백과 함께 선언하지 말아야 한다.

method 의 시작 중괄호는 다음 줄에 와야 하고, 끝 중괄호도 본문 끝의 다음 줄에 와야 한다.

시작 괄호는 다음에 공백을 갖지 않아야 하고, 끝 괄호 전에 공백을 갖지 않아야 한다.


<?php
namespace Vendor\Package;
 
class ClassName
{
    public function fooBarBaz($arg1, &$arg2$arg3 = [])
    {
        // method body
    }
}
cs



Method Arguments


매개변수 리스트에서 각 콤마(,)의 앞에는 공백이 없어야 하고, 뒤에는 공백이 있어야 한다.

매개변수 리스트는 한번의 들여쓰기와 함께 여러 행에 걸쳐 분리될 수 있으며, 이 경우 닫힘 괄호와 시작 중괄호는 같은 줄에 위치한다.


<?php
namespace Vendor\Package;
 
class ClassName
{
    public function aVeryLongMethodName(
        ClassTypeHint $arg1,
        &$arg2,
        array $arg3 = []
    ) {
        // method body
    }
}
cs



abstract, final, and static


abstract 와 final 은 가시성 전에 선언되어야 하고, static 은 가시성 뒤에 선언되어야 한다.


<?php
namespace Vendor\Package;
 
abstract class ClassName
{
    protected static $foo;
 
    abstract protected function zim();
 
    final public static function bar()
    {
        // method body
    }
}
cs



Method and Function Calls


메소드나 함수를 호출시, 시작 괄호와 끝 괄호의 앞, 뒤에 공백이 없어야 한다.

매개변수 리스트에서 각 콤마 앞에 공백이 없어야 하고, 콤파 뒤에 공백 한칸이 있어야 한다.

매개변수 리스트는 한번의 들여쓰기와 함께 여러 행에 걸쳐 분리될 수 있으며, 한 줄에 하나의 매개변수만 있어야 한다.


<?php
bar();
$foo->bar($arg1);
Foo::bar($arg2$arg3);
cs


<?php
$foo->bar(
    $longArgument,
    $longerArgument,
    $muchLongerArgument
);
cs



Control Structures


제어문 키워드는 뒤에 한칸 공백이 와야 한다.

시작 괄호는 다음에 공백을 갖지 않아야 하고, 끝 괄호 전에 공백을 갖지 않아야 한다.

끝 괄호와 시작 중괄호 사이에 공백 한칸이 있어야 한다.

제어문의 본문은 한번의 들여쓰기를 해야 한다.

끝 중괄호는 본문 끝의 다음 줄에 와야 한다.

제어문의 본문은 중괄호로 감싸야 한다.


모든 제어문은 한 단어로 사용하는 것이 좋다. else if(x) elseif(o)

case 의 break; 는 case 본문과 동일한 레벨의 들여쓰기를 해야 한다.

case 의 본문이 비어있지 않을 때 break 없이 진행해야 한다면 // no break 식의 주석을 달아야 한다.


<?php
if ($expr1) {
    // if body
} elseif ($expr2) {
    // elseif body
else {
    // else body;
}
 
switch ($expr) {
    case 0:
        echo 'First case, with a break';
        break;
    case 1:
        echo 'Second case, which falls through';
        // no break
    case 2:
    case 3:
    case 4:
        echo 'Third case, return instead of break';
        return;
    default:
        echo 'Default case';
        break;
}
 
while ($expr) {
    // structure body
}
 
do {
    // structure body;
while ($expr);
 
for ($i = 0$i < 10$i++) {
    // for body
}
 
foreach ($iterable as $key => $value) {
    // foreach body
}
 
try {
    // try body
} catch (FirstExceptionType $e) {
    // catch body
} catch (OtherExceptionType $e) {
    // catch body
}
 
cs



Closures


클로저 선언시 function 키워드 다음에 공백이 한칸 와야 하고, use 키워드 앞, 뒤로 공백이 한칸 와야 한다.

시작 중괄호는 같은 줄에 와야 하고 끝 중괄호는 본문의 다음 줄에 와야 한다.

매개변수 리스트나 변수 리스트의 시작 괄호 다음에 공백이 없어야 하고, 끝 괄호 전에도 공백이 없어야 한다.

매개변수 리스트나 변수 리스트의 각 콤마 전에 공백이 있으면 안되고, 콤바 뒤에는 공백이 한칸 있어야 한다.

기본 값을 가진 클로저 매개변수는 매개변수 리스트의 끝에 와야 한다.

매개변수 리스트나 변수 리스트는 한번의 들여쓰기와 함께 여러 행에 걸쳐 분리될 수 있으며, 이 경우 닫힘 괄호와 시작 괄호/중괄호는 같은 줄에 위치한다.


<?php
$closureWithArgs = function ($arg1$arg2) {
    // body
};
 
$closureWithArgsAndVars = function ($arg1$arg2) use ($var1$var2) {
    // body
};
cs


<?php
$longArgs_noVars = function (
    $longArgument,
    $longerArgument,
    $muchLongerArgument
) {
   // body
};
 
$noArgs_longVars = function () use (
    $longVar1,
    $longerVar2,
    $muchLongerVar3
) {
   // body
};
 
$longArgs_longVars = function (
    $longArgument,
    $longerArgument,
    $muchLongerArgument
) use (
    $longVar1,
    $longerVar2,
    $muchLongerVar3
) {
   // body
};
 
$longArgs_shortVars = function (
    $longArgument,
    $longerArgument,
    $muchLongerArgument
) use ($var1) {
   // body
};
 
$shortArgs_longVars = function ($arg) use (
    $longVar1,
    $longerVar2,
    $muchLongerVar3
) {
   // body
};
cs


<?php
$foo->bar(
    $arg1,
    function ($arg2) use ($var1) {
        // body
    },
    $arg3
);
cs




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

PSR-1

Programming/PHP 2016. 2. 17. 09:07

PSR(PHP Standard Recommendation)은 PHP-FIG (PHP Framework Interop Group) 이 주도하여 제안한 PHP 표준 권장안이다.

최근 대부분의 PHP 프로젝트들이 이 PSR을 표준으로 하여 개발 중이다.



PSR-1 : 기본 코딩 표준 (http://www.php-fig.org/psr/psr-1/)



PHP Tags


php 코드는 <?php ?>와 short echo 인 <?= ?> 태그 안에서만 사용해야 한다.



Character Encoding


php 파일의 문자 인코딩은 BOM(Byte order Mark) 없이 UTF-8 만 사용해야 한다.



Side Effects


다른 파일들과 클래스, 함수, 상수 등을 선언할 때 충돌하지 않도록 조건부 선언(no side-effects) 등을 사용한다.

side-effects 는 출력 생성, require 나 include 의 사용, 외부 서비스 연결, .ini 설정 변경, 에러나 예외 생략 global 이나 static 변수 변경, 파일 읽고 쓰기 등을 포함된다.

하나의 php 파일에 새로운 심볼(클래스, 함수, 상수 등)을 선언 + side-effects 를 사용 or

하나의 php 파일에 새로운 심볼(클래스, 함수, 상수 등)을 선언 + no side-effects 를 사용

side-effects 와 no side-effects 를 함께 사용하지 않는 것이 좋다.


<?php
// side effect: change ini settings
ini_set('error_reporting', E_ALL);
 
// side effect: loads a file
include "file.php";
 
// side effect: generates output
echo "<html>\n";
 
// declaration
function foo()
{
    // function body
}
cs


<?php
// declaration
function foo()
{
    // function body
}
 
// conditional declaration is *not* a side effect
if (! function_exists('bar')) {
    function bar()
    {
        // function body
    }
}
cs



Namespace and Class Names


네임스페이스와 클래스는 PSR-0, PSR-4 의 autoloading 을 따라야 한다.

즉, 각 클래스는 하나의 파일을 가져야 하고, 최소 하나의 레벨의 네임스페이스에 위치해야 한다 : (최상위 레벨은 vendor 이름)

클래스 이름은 StudlyCaps(대문자로 시작, 대문자로 구분) 방식으로 선언되어야 한다.

PHP 5.3 이후의 코드에서는 형식적인 네임스페이스를 사용해야 한다. (namespace Vendor\Model; class Foo)

PHP 5.2 이전의 코드에서는 가상 네임스페이스 관례를 사용해야 한다. (class Vendor_Model_Foo)


<?php
// PHP 5.3 and later:
namespace Vendor\Model;
 
class Foo
{
}
cs


<?php
// PHP 5.2.x and earlier:
class Vendor_Model_Foo
{
}
cs



Constants


클래스 상수는 _(underscore)로 구별된 대문자로만 선언되어야 한다.


<?php
namespace Vendor\Model;
 
class Foo
{
    const VERSION = '1.0';
    const DATE_APPROVED = '2012-06-01';
}
cs



Properties


권장하는 방식은 없지만 일관되게 합리적인 범위 내에서 선언한다.



Methods


메소드는 camelCase() (소문자로 시작, 대문자 구분) 로 선언한다.




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

raw POST data

Programming/PHP 2015. 9. 8. 23:38

보통 HTTP 통신에서 페이지 요청(Request)시 GET 이나 POST 방식을 많이 사용한다.
POST 방식의 폼 데이터 전송시 헤더에는 변수1=값1&변수2=값2... 의 형태로 구성이 되는데,
PHP 에서는 이 값들을 $_POST 같은 전역 배열로 파싱된 데이터를 얻어낼 수 있다.

 

하지만 쿼리스트링 형태(변수1=값1&변수2=값2...) 가 아닌 json 이나 xml 등의 데이터를 POST 방식으로 보내게 되면,
$_POST 전역 배열은 파싱된 결과를 저장하므로 데이터를 저장할 수 없다.
이런 raw POST 데이터를 받기 위해서 $HTTP_RAW_POST_DATA 를 사용할 수 있다.
하지만 최신 버전(5.6이상)에서는 위 전역 변수를 추천하지 않고,
Request Body로부터 raw data를 읽을 수 있는 php://input 사용을 권장한다.
enctype="multipart/form-data" 에서는 사용할 수 없다.

 

<? echo file_get_contents("php://input"); ?>

 

// result
{"os":"Android","cc":"KR","lc":"ko","type":"ongoing","currencyCode":"KRW","lastEvaluateKey":-1}

 

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

error_reporting

Programming/PHP 2015. 3. 14. 18:00

int error_reporting([ int $level ])

 

error_reporting() 함수는 명시한 에러 지시어 대로 에러 수준을 즉시 변경한다.
지시어를 명시하지 않으면 현재 에러 수준을 표시한다.

 

error_reporting 은 bit 필드를 각각 정수로 표현한 값으로 지정할 수도 있고 이미 정의된 상수(E_*)를 사용할 수도 있다.
php.ini 나 php 스크립트에서는 상수를 사용할 수 있지만, httpd.conf 나 .htaccess 에서 bitmask 정수만 사용 가능하다.
현재 설정되어 있는 값을 알고 싶다면 phpinfo(), ini_get() 함수로 확인이 가능하다.
PHP 버전별로 bitmask 값은 다르지만 정의된 상수, -1,  0 등은 모든 버전에서 사용 가능하다.

 

error_reporting 은 정수로 표현되기 때문에 정확한 에러 수준을 확인하기는 어렵다
하지만 인터넷을 뒤져보면 계산기를 찾을 수 있다. - http://www.bx.com.au/tools/ultimate-php-error-reporting-wizard
이미 정의된 상수 보기 - http://php.net/manual/en/errorfunc.constants.php

 

 

// PHP 5.3 이후의 default 값
error_reporting( E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED );

// 추천 개발환경
error_reporting( E_ALL | E_STRICT );

// 추천 서비스 환경
error_reporting( E_ALL & ~E_DEPRECATED );

 

php.ini 파일에서 직접 수정하거나 include 'test.php' 식으로 변경될 에러 수준으로 테스트할 파일을 불러와야 테스트가 가능하다.

 

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

php.ini

Programming/PHP 2015. 3. 13. 00:01

/어딘가에 있는/php.ini
php 설정파일이다. phpinfo() 함수로 php 설정 내용을 확인할 수 있다.
설정을 바꿔보겠다고 php.ini 파일에서 직접 수정을 하다가는 여러 프로젝트에 모두 적용이 되서 낭패를 보는 일은 없어야 한다.
딱히 낭패볼 일도 없긴 하지만...
php.ini 파일을 직접 수정한다면 웹서버를 다시 실행시켜 변경된 적용한다.

 

프로젝트마다 php 설정을 달리해야 한다면 php 파일 안에서 변경이 필요한 부분들만 ini_set() 함수로 설정해 주면 되겠다.
공통적으로 불러오는 common 같은 파일 안에 넣으면 모든 페이지를 호출할 때 ini_set 부분이 적용될 것이다.
하지만 모든 부분이 ini_set() 함수로 변경되지는 않는다.

 

 

php.ini 지시어 목록 : http://php.net/manual/en/ini.list.php

 

 

모든 지시어에 설정되어 있는 Changeable 모드에 따라 각각 변경 방법이 다르다.

  • PHP_INI_USER - ini_set() 으로 설정 가능. PHP 5.3 부터 .user.ini 에서 설정 가능.
  • PHP_INI_PERDIR - php.ini, .htaccess, httpd.conf, .user.ini 에서 설정 가능.
  • PHP_INI_SYSTEM - php.ini, httpd.conf 파일에서 설정 가능.
  • PHP_INI_ALL - 어디서든 설정 가능.

 

 

이러하니. ini_set() 으로 설정을 변경할 수 있는 모드는 PHP_INI_USER 와 PHP_INI_ALL 밖에 없다.
변경하고 싶은 지시어가 있다면 모드를 잘 확인하고 변경하면 되겠다.

 

주의할 지시어는 error_reporting 이나 display_errors.
php.ini 가 어떻게 설정되어 있든 ini_set() 을 이용하여 변경하고 에러 상태를 확인하려 할 때,
동일한 페이지에서 일부러 에러를 내버리면 해당 페이지의 파싱이 제대로 되지 않아 처리가 되지 않는다.
에러 수준 테스트를 하려면 아래처럼 해당 페이지를 호출하는 방법이 있다.

 

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
include './test.php';

 

경로를 GET 으로 넘겨받아 해도 되고...

 

 

디렉토리 별로 설정을 가능하게 하려면 .htaccess 를 사용하는 방법도 있다.

 

  • php_value name value
    PHP_INI_ALL / PHP_INI_PERDIR 모드의 지시어만 가능. value=none 가능.
  • php_flag name on|off
    PHP_INI_ALL / PHP_INI_PERDIR 모드의 지시어만 가능.(Boolean)
  • php_admin_value name value
    .htaccess 파일에서 사용불가. 설정된 값은 .htaccess 나 ini_set 으로 적용 불가.
  • php_admin_flag name on|off
    .htaccess 파일에서 사용불가. 설정된 값은 .htaccess 나 ini_set 으로 적용 불가.(Boolean)

 

 

$ vi .htaccess
php_flag display_errors on

 

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,