ioerror

Coding Convention 본문

개발이야기

Coding Convention...

반응형

참고자료

https://www.joinc.co.kr/w/man/12/php/PSR

https://psr.kkame.net/

https://www.php-fig.org/psr/

https://github.com/yujineeee/clean-code-php

https://modernpug.github.io/php-the-right-way/

https://docs.phpdoc.org/latest/guides/docblocks.html

<?php
/**
* 기본적으로 phpDocumentor 의 주석 규칙을 따른다.
* @link https://docs.phpdoc.org/latest/references/phpdoc/index.html
* php 파일의 시작은 <?php 로 시작한다.
* php 파일의 끝이 php 코드가 마지막이면 ?> 로 닫지 않아도 된다.
* 파일의 첫번째 주석은 해당 파일의 설명을 기록한다.
*/
/** @var 와 같이 phpDoc의 태그가 들어가는 한 줄 주석은 여러줄 주석 형식으로 한다.  */
/** @link https://docs.phpdoc.org/latest/glossary.html#term-phpdoc */
// 태그가 들어가지 않는 주석을 슬래시 2개로 한다.
/**
* phpDoc 태그 목록은 아래의 주소를 참고 한다.
* @link https://docs.phpdoc.org/latest/references/phpdoc/tags/index.html
* @link https://docs.phpdoc.org/latest/guides/docblocks.html#list-of-tags
*/
/**
* 아래부터는 php 코드를 통한 예시이다.
*
* 가상의 회원관리 클래스를 예를 들어 주석 및 코딩규약을 설명한다.
* 이 주석은 php 문서의 첫 부분에 위치하여 문서를 설명하는 것이다.
*
* @package   ZOO
* @author    Dev Team
* @since     2020-02-01 마지막 수정일과 간단한 수정 내용 및 목적 
*/

/**
* 네임스페이스는 PSR-4를 따른다.
* @link https://psr.kkame.net/accepted/psr-4-autoloader
* \<NamespaceName>(\<SubNamespaceNames>)*\<ClassName> 
*/
namespace Member

/**
* 상수는 대문자의 스네이크케이스를 사용한다.
* php7에서는 define("TBL_MEMBER", array(...)); 형식으로도 사용 가능하다.
* 짧은 배열선언도 가능하다 const ARR = [....]
* 상태를 나타내거나 비교가 되는 값은 가급적 상수로 선언하는 것이 좋다.
*/
define("TBL_MEMBER","member");
const MEMBER_FIELDS = array(
				"mem_pk"
				,"mem_id"
				,"mem_nm"
			);
const LOGIN_STAT = true;
/**
* 클래스 등의 맴버변수를 제외한 일반 변수는 소문자의 스네이크케이스를 사용한다.
*/
$mem_nm = "test";

/**
* 구조적요소(Structural Element)의 중괄호는 한줄 내림한다.
* 구조적요소 : class, interface, abstarct, trait, function, property, constant
* 인터페이스 및 추상화는 접미사로 각각 Insterface, Abstract를 추가한다.
*/

interface MemberInterface
{
	
	/**
	* 인터페이스 및 클래스의 메소드와 일반 함수는 소문자로 시작하는 카멜케이스를 사용한다.
	* 맴버함수의 반환값 자료형을 명시한다.
	*/
	public function loginStat(): bool;
	
	/**
	* 메소드, 함수의 인자값은 자료형을 명기한다.
	*
	* @param int $mem_pk     회원 PK
  * @param string $mem_nm  회원 ID
  *
  * @return array          회원 정보
	*/
	public function memberInfo(int $mem_pk, string $mem_id = null): array;

	public static function myInfo(): array;
}

namespace Member

/**
* 인터페이스 선언되어 있으면 구현을 하라... 뭔 개소리야?
*/
class Member implements MemberInterface
{
	
	/**
	* 로그인 여부.
	*
	* @var bool
	*/
	public $loginStat = false;
	
	/**
	* 맴버변수와 맴버함수(메소드)는 소문자로 시작하는 카멜케이스를 사용한다.
	*
	* @var array
	*/
	public $memberInfo = array();

	/**
	* 맴버변수는 객체외에서 바로 접근하도록 하지 않는다(캡슐화)
	* 
	* @var array
	*/
	private static $myInfo = array();

	/**
	* 클래스 맴버 상수
	*/
	const IAM_MANAGER = 1;
	const LOGIN_STAT_OK = true;
	/**
	* 생성자
	*
	* @param array $config
	*/
	public function __construct($config)
	{
	}

	/**
	* 로그인 여부를 반환하는 메소드
	* 반환 값의 형식을 표기할때는 콜론과 공백 다음에 자료형을 표기한다.
	*
	* @return bool
	*/
	public function loginStat(): bool
	{
		/**
		* 모든 제어문의 중괄호는 같은 라인에 입력한다.
		* else if 대신 elseif 를 사용한다.
    * else와 중괄호 사이에는 공백을 입력한다.
		* 한줄에 많은 조건을 표기하기 어려우면 여러줄로 나누어 표기 가능하되 논리 연산자는 앞에 둔다.
		*/
		if ($this->loginStat === self::LOGIN_STAT_OK){
			return $this->loginStat;
		} elseif (
				$this->loginStat === self::LOGIN_STAT_OK
				&& LOGIN_STAT === false
		)
		{
			return $this->loginStat = false;
		} else {
			if($this->myInfo['mem_level'] === self::IAM_MANAGER){
				$this->myInfo['iam_manager'] = self::IAM_MANAGER;
			)
			return $this->loginStat;
		}

		/**
		* @todo 추가해야할 코드를 todo 키워드로 입력 가능하다.
		*/
		$loginchk = true;

		/**
		* 삼항연산자는 연산자별로 띄어쓰기를 한다.
		*/
		return $this->loginStat = $loginchk === true ? true : fase;
	}
	
	/**
	* 메소드, 함수의 인수는 자료형을 가급적 명시한다.
	* 여러개의 인수들 사이는 콤마와 공백으로 표기한다. 
	* 인수를 포함한 스코프 변수는 자료형을 접두어로 하는 소문자 스네이크 케스를 사용하낟.
	*/
	public function memberInfo(int $int_mem_pk, array $arr_mem_info): array
	{
		$arr_mem_info = Array();
		$str_mem_nm;
		for( $i = 0 ; $i < 10 : $i++ ){
		}
	}
	
	/**
	* 여러개의 인수가 여러줄로 표기할 경우
	* 한번의 들여쓰기를 하고 함수명괄호(소괄호)와 스코프(중)괄호를 같은 줄에 표기한다.
  * 반환값의 형선언이 있으면 그 사이에 표기한다.	
	* nullable type 선언시 ?과 자료형 사이는 공백이 없어야 한다. 
	*/
	public function multiLineArgs(
		int $arg1,
		?string $arg2
	): ?string {
		return $arg2 ? $arg1 : $arg2;
	} 
}
반응형
Comments