블로그 이미지
정신 못차리면, 벌 받는다. 와닥

카테고리

분류 전체보기 (1406)
Daily (587)
W3C (93)
Photo (229)
News (49)
Portfolio (24)
Database (42)
Programming (251)
Server (109)
Tip (22)
Total28,308
Today105
Yesterday141

New Born

와닥

달력

« » 2012.05
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

최근에 달린 댓글

최근에 받은 트랙백

'Programming/CodeIgniter'에 해당되는 글 23건

  1. 2011/11/12 CodeIgniter Style and Syntax (4/4)
  2. 2011/11/12 CodeIgniter Style and Syntax (3/4)
  3. 2011/11/12 CodeIgniter Style and Syntax (2/4)
  4. 2011/11/12 CodeIgniter Style and Syntax (1/4)
  5. 2011/11/12 Environment / Security
  6. 2011/11/12 View 파일의 PHP 구문
  7. 2011/11/12 Managing Applications
  8. 2011/11/12 CLI
  9. 2011/11/12 Profiling Application
  10. 2011/11/12 Caching

1. 지역에 맞는 텍스트(국가별 언어)

제어 구문에서의 출력되는 모든 문자는 lang 파일에서 language 변수를 사용해야 합니다.

INCORRECT:
return "Invalid Selection";

CORRECT:
return $this->lang->line('invalid_selection');


2. Private 메소드와 변수

클래스로부터 내부적으로만 접근가능한 메소드와 변수는 밑줄로 시작해야 합니다.

convert_text()  // public method
_convert_text()  // private method


3. Short Open Tags

서버에 short_open_tag 가 enable 이 아닐 수도 있으므로 항상 짧은 시작태그(<?)가 아닌 완벽한 시작태그(<?php)를 사용합니다.

INCORRECT:
<? echo $foo; ?>
<?=$foo?>

CORRECT:
<?php echo $foo; ?>


4. 한 줄당 한 구문 (One Statement Per Line)

한 줄에 여러 구문을 사용하지 않습니다.

INCORRECT:
$foo = 'this'; $bar = 'that'; $bat = str_replace($foo, $bar, $bag);

CORRECT:
$foo = 'this';
$bar = 'that';
$bat = str_replace($foo, $bar, $bag);


5. 문자열(Strings)

변수 해석이 필요하지 않는 한 항상 문자열에 작은 따옴표를 사용하고, 변수 해석이 필요한 곳에 중괄호를 사용합니다.
또한 문자열이 작은 따옴표를 포함한다면 문자열에 큰 따옴표를 사용할 것입니다.
이스케이프(\) 문자를 사용하지 않도록 합니다.

INCORRECT:
"My String"     // no variable parsing, so no use for double quotes
"My string $foo"    // needs braces
'SELECT foo FROM bar WHERE baz = \'bag\'' // ugly

CORRECT:
'My String'
"My string {$foo}"
"SELECT foo FROM bar WHERE baz = 'bag'"


6. SQL Queries

Mysql 키워드는 항상 대문자로 씁니다. SELECT, INSERT, UPDATE, WHERE, AS, JOIN, ON, IN, ...
긴 쿼리는 읽기 쉽도록 각 절마다 여러 라인으로 나눕니다.

INCORRECT:
// keywords are lowercase and query is too long for
// a single line (... indicates continuation of line)
$query = $this->db->query("select foo, bar, baz, foofoo, foobar as raboof, foobaz from exp_pre_email_addresses
...where foo != 'oof' and baz != 'zab' order by foobaz limit 5, 100");

CORRECT:
$query = $this->db->query("SELECT foo, bar, baz, foofoo, foobar AS raboof, foobaz
                                        FROM exp_pre_email_addresses
                                        WHERE foo != 'oof'
                                        AND baz != 'zab'
                                        ORDER BY foobaz
                                        LIMIT 5, 100");


7. 기본 함수 인자 (Default Function Arguments)

잘못된 호출시 PHP 오류를 방지하기 위해 기본적인 인수를 사용합니다.

function foo($bar = '', $baz = FALSE)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 와닥


1. 클래스나 파일 이름

클래스나 파일명이 너무 단순하다면 다른 PHP 스크립트와 충돌할 수 있으므로, 고유한 접두어를 붙이는 것이 좋습니다.
개발자의 이름이나 회사의 이름을 접두어로 쓰면 좋습니다.

INCORRECT:
class Email  pi.email.php
class Xml  ext.xml.php
class Import  mod.import.php

CORRECT:
class Pre_email  pi.pre_email.php
class Pre_xml  ext.pre_xml.php
class Pre_import mod.pre_import.php



2. 데이터베이스 테이블 이름

추가적으로 작성하는 모든 테이블은 'exp_' 접두어를 사용하고, 그 뒤에 개발자나 회사 이름으로 식별 가능한 접두어를 넣고, 그 다음 테이블 이름을 간략하게 기술합니다.

INCORRECT:
email_addresses  // missing both prefixes
pre_email_addresses // missing exp_ prefix
exp_email_addresses // missing unique prefix

CORRECT:
exp_pre_email_addresses



3. 공백 (Whitespace)

코드에 공백을 넣고 싶을 때 스페이스가 아닌 을 사용하는 것이 단계별 들여쓰기에도 좋고, 아주 미세하지만 소스코드의 크기도 줄여줍니다.


4. 코드 들여쓰기

Allman 스타일의 들여쓰기를 사용하세요.
클래스 선언만 제외하고, 중괄호는 항상 한라인을 차지하도록 하며, 자기가 속한 조건문과 같은 레벨의 들여쓰기를 합니다.

INCORRECT:
function foo($bar) {
    // ...
}

foreach ($arr as $key => $val) {
    // ...
}

if ($foo == $bar) {
    // ...
} else {
    // ...
}

for ($i = 0; $i < 10; $i++)
    {
    for ($j = 0; $j < 10; $j++)
       {
       // ...
       }
    }

CORRECT:
function foo($bar)
{
    // ...
}

foreach ($arr as $key => $val)
{
    // ...
}

if ($foo == $bar)
{
    // ...
}
else
{
    // ...
}

for ($i = 0; $i < 10; $i++)
{
    for ($j = 0; $j < 10; $j++)
    {
       // ...
    }
}



5. 괄호의 여백

일반적으로 괄호에는 공백을 사용하지 말아야 합니다.
가독성을 높이고 함수와 구별하기 위해, PHP 조건문에 매개변수를 사용할때는 예외입니다.

INCORRECT:
$arr[ $foo ] = 'foo';

CORRECT:
$arr[$foo] = 'foo'; // no spaces around array keys

 

INCORRECT:
function foo ( $bar )
{
}

CORRECT:
function foo($bar) // no spaces around parenthesis in function declarations
{
}

 

INCORRECT:
foreach( $query->result() as $row )

CORRECT:
foreach ($query->result() as $row) // single space following PHP control structures, but not in interior parenthesis
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 와닥

1. 주석 달기

일반적으로 코드는 많은 주석을 포함하는 것이 좋습니다.
클래스와 메소드 선언 전의 DocBlock 스타일의 주석은 통합개발환경(IDE)등에서 인식될 수 있습니다.

/**
 * Super Class
 *
 * @package Package Name
 * @subpackage Subpackage
 * @category Category
 * @author Author Name
 * @link http://example.com
 */

class Super_class {

/**
 * Encodes string for use in XML
 *
 * @access public
 * @param string
 * @return string
 */

function xml_encode($str)

코드에 한 줄 주석을 사용할 수 있고, 큰 주석 블럭과 코드 사이에는 빈 줄을 넣습니다.

// break up the string by newlines
$parts = explode("\n", $str);

// A longer comment that needs to give greater detail on what is
// occurring and why can use multiple single-line comments.  Try to
// keep the width reasonable, around 70 characters is the easiest to
// read.  Don't hesitate to link to permanent external resources
// that may provide greater detail:
//
// http://example.com/information_about_something/in_particular/


$parts = $this->foo($parts);


2. TRUE, FALSE, NULL

이 키워드는 항상 대문자가 되어야 합니다.

INCORRECT:
if ($foo == true)
$bar = false;
function foo($bar = null)

CORRECT:
if ($foo == TRUE)
$bar = FALSE;
function foo($bar = NULL)


3. 논리 연산자

|| 연산자는 숫자 11과 비슷해 보이므로 사용하지 않는 것이 좋습니다.
&& 연산자는 AND 보다 많이 쓰이지만 둘다 가능합니다.
! 연산자의 경우 앞뒤로 공백이 와야 합니다.

INCORRECT:
if ($foo || $bar)
if ($foo AND $bar)  // okay but not recommended for common syntax highlighting applications
if (!$foo)
if (! is_array($foo))

CORRECT:
if ($foo OR $bar)
if ($foo && $bar) // recommended
if ( ! $foo)
if ( ! is_array($foo))


4. 리턴값 비교와 형 변환

어떤 PHP 함수는 실패했을 때 FALSE를 반환하지만, "" 나 0 값을 반환할 수도 있을 것입니다.
조건문에서 반환된 값을 사용할 때 가능하면 변수 유형을 비교하여 명시합니다. (===, !== 이용)

INCORRECT:
// If 'foo' is at the beginning of the string, strpos will return a 0,
// resulting in this conditional evaluating as TRUE
if (strpos($str, 'foo') == FALSE)

CORRECT:
if (strpos($str, 'foo') === FALSE)

INCORRECT:
function build_string($str = "")
{
    if ($str == "") // uh-oh!  What if FALSE or the integer 0 is passed as an argument?
    {

    }
}

CORRECT:
function build_string($str = "")
{
    if ($str === "")
    {

    }
}

typecasting 도 매우 유용할 수 있습니다.

$str = (string) $str; // cast $str as a string

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 와닥

다음은 CodeIgniter를 개발할 때 준수한 코딩 규칙의 사용을 설명합니다.


1. File Format

텍스트에디터 사용시 아래 사항에 유의 합니다.
- 파일들은 유니코드(UTF-8, no BOM) 인코딩 저장. (UTF-16, UTF-32 와 달리 UTF-8에는 BOM을 사용하지 않습니다.)
- 라인 끝은 LF(\n)를 사용해야 합니다.


2. PHP 닫는 태그

PHP 문서에서 닫는 태그(?>)를 사용했을 때 닫는 태그 뒤에 공백 있다면, 빈 페이지나 원치 않는 화면을 출력할 것입니다.
주석으로 파일의 끝을 표시하여, 파일의 경로를 표시하면 파일의 끝 임을 알 수 있으므로 파일의 마지막에 주석을 권장합니다.
(PHP 여는 태그(<?)의 앞에도 공백이 있어서는 안됩니다.)

INCORRECT:
<?php

echo "Here's my code!";

?>

CORRECT:
<?php

echo "Here's my code!";

/* End of file myfile.php */
/* Location: ./system/modules/mymodule/myfile.php */


3. 클래스명과 메소드명

클래스는 항상 대문자로 시작합니다.
여러 단어일 경우 동사가 포함된 것이 좋으며 카멜케이스(CamelCased) 가 아닌 언더바(_)로 구분해야 합니다.
너무 길지 않게 목적을 잘 설명할 수 있는 이름으로 지어야 합니다.
다른 클래스 메소드는 모두 소문자로 되어야 합니다.

INCORRECT:
class superclass
class SuperClass

CORRECT:
class Super_class


INCORRECT:
function fileproperties()
function fileProperties()
function getfileproperties()
function getFileProperties()
function get_the_file_properties_from_the_file()

CORRECT:
function get_file_properties()


4. 변수명

클래스 메소드와 거의 흡사하게 이름 짓습니다. (소문자, 언더바 구별 등)
너무 짧거나 단어가 아닌 변수는 for문 등의 루프 등에만 사용해야 합니다.

INCORRECT:
$j = &apos;foo&apos;;
$Str
$bufferedText
$groupid
$name_of_last_city_used

CORRECT:
for ($j = 0; $j < 10; $j++)
$str
$buffer
$group_id
$last_city


5. 상수

상수는 모두 대문자로 하는 것을 제외하고는 변수명 짓는 것과 같습니다.
CodeIgniter는 적절할 때 SLASH, LD, RD, PATH_CACHE 상수를 항상 사용합니다.

INCORRECT:
myConstant
N
S_C_VER
$str = str_replace('{foo}', 'bar', $str); // should use LD and RD constants

CORRECT:
MY_CONSTANT
NEWLINE
SUPER_CLASS_VERSION
$str = str_replace(LD.'foo'.RD, 'bar', $str);
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 와닥

1. ENVIRONMENT 상수

환경을 설정은 로깅 및 오류보고 등에 영향을 미칩니다.
기본적으로 CodeIgniter는 index.php 파일 상단에 development에 대한 환경 상수 설정이 제공됩니다.

define('ENVIRONMENT', 'development');
// 1. development
// 2. testing
// 3. production


2. Security

CodeIgniter는 악의적인 데이터가 어플리케이션에 전달될 수 가능성을 최소화하기 위하여,
허용하는 URI 문자열이 매우 제한적이며, URI는 다음만을 포함할 수 있습니다.

  • Alpha-numeric text
  • Tilde: ~
  • Period: .
  • Colon: :
  • Underscore: _
  • Dash: -

Register_globals
시스템이 초기화 되는 동안 $_GET, $_POST, $_COOKIE 배열을 제외한 모든 글로벌 변수들은 해제(unset)됩니다.
해제되는 것은 register_globals = off 와 동일합니다.

error_reporting
production 환경에서는 내부 error_reporting 값을 0으로 지정하여 PHP의 에러 리포팅을 비활성화 하는 것이 보안상 바람직합니다.

magic_quotes_runtime
이 지시어는 시스템이 초기화 되는 동안 off 되므로, 데이터베이스에서 데이터를 검색할 때 슬래시를 제거하지 말아야 합니다.


3. Best Practices

POST 데이터, COOKIE 데이터, URI 데이터, XML-RPC 데이터, SERVER 배열 데이터 등으로부터 어플리케이션으로 데이터를 받기 전에 3단계의 과정을 거치기를 권장합니다.
  1. 변질된 데이터를 필터합니다. (Security class)
  2. 올바른 타입, 길이, 크기 등에 따라 데이터를 검증하며 1단계를 대신할 때도 있습니니다.(Form Validation class)
  3. 데이터베이스에 데이터가 전달되기 전에 이스케이프 합니다. (Queries class)

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 와닥

CodeIgniter의 템플릿 엔진을 활용하지 않는다면, View 파일에 순수 PHP를 사용하게 될 것입니다.
View 파일에서 PHP 코드를 최소화하려면 코드 블럭에 PHP 대체 문법, 단축 태그 등을 사용하길 권장합니다.
이 문법에 친숙하지 않다면, 코드에서 중괄호와 echo 구문을 제거하도록 합니다.


제어 구조 대체

if, for, foreach, while 같은 제어 구조는 더 간단한 형식으로 쓰여질 수 있습니다.
<ul>
    <?php foreach ($todo as $item): ?>
    <li><?=$item?></li>
    <?php endforeach; ?>
</ul>

중괄호가 없으며 마지막 중괄호는 endforeach 로 대체됩니다.
제어 구조의 간단한 마지막 문법입니다: endif, endfor, endforeach, endwhile.
각 구문의 뒤에는 콜론을 사용하며 마지막에는 세미콜론을 사용합니다.

if/elseif/else 를 사용하는 다른 예제입니다.
<?php if ($username == 'sally'): ?>
   <h3>Hi Sally</h3>
<?php elseif ($username == 'joe'): ?>
   <h3>Hi Joe</h3>
<?php else: ?>
   <h3>Hi unknown user</h3>
<?php endif; ?>
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 와닥

기본적으로 application 디렉토리에 빌드될 단일 어플리케이션을 관리하기 위해 CodeIgniter 를 사용사용합니다.
하지만 한번의 CodeIgniter 설치로 다중 어플리케이션을 관리하거나, application 디렉토리 이름 변경도 가능합니다.

application 경로/이름 변경은 index.php 파일에서 할 수 있습니다.

$application_folder = "/Path/to/your/application";


다중 어플리케이션

여러 다른 어플리케이션을 관리하려면, 각 어플리케이션을 application 디렉토리 안에 서브 디렉토리로 위치하면 됩니다.
예를 들어 "foo" 와 "bar" 를 생성한다면, 다음의 디렉토리와 구조를 가질 것입니다.

applications/foo/
applications/foo/config/
applications/foo/controllers/
applications/foo/errors/
applications/foo/libraries/
applications/foo/models/
applications/foo/views/

applications/bar/
applications/bar/config/
applications/bar/controllers/
applications/bar/errors/
applications/bar/libraries/
applications/bar/models/
applications/bar/views/
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 와닥

CLI

Programming/CodeIgniter / 2011/11/12 00:25

1. CLI(Command-Line Interface)를 통한 실행

브라우저에 URL로 Controller를 호출하며, 또한 CLI를 통해서도 로딩될 수 있습니다.
CLI는 터미널같은 텍스트 기반의 명령행 인터페이스를 말합니다.


2. CLI를 사용하는 이유?

  • wget, curl 등을 사용할 필요없이 cron 작업을 실행.
  • IS_CLI로 체크하여 URL에 로드되서 접근할 수 없는 cron 작업을 생성.
  • 캐쉬 디렉토리를 비우고, 백업을 만들고, 퍼미션을 지정하는 등의 작업을 생성.
  • 다른 언어들로 다른 어플리케이션과 통합 (임의의 C++ 스크립트는 Model에서 코드를 실행하고 명령어를 호출 가능)


3. Hello World!

$ vi application/controllers/tools.php
<?php
class Tools extends CI_Controller {
    public function message($to = 'World')
    {
        echo "Hello {$to}!" . PHP_EOL;
    }
}
?>

브라우저에서 URL로 접속해 봅니다.
domain.com/index.php/tools/message/oops
output is : Hello oops!

터미널을 열고 index.php 가 위치한 경로로 가서 URL 매개변수처럼 파라미터를 전달합니다.
$ php index.php tools message oops
output is: Hello oops!

이것은 커맨드 라인에서도 controllers에 대해 잘 알고 있다는 것이고, routing 과 _remap 역시 잘 작동할 것입니다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 와닥

Profiler 클래스는 벤치마크 결과, 실행한 쿼리, $_POST 데이터를 페이지 하단에 보여줄 것입니다.
이 정보는 개발하는 동안 디버깅과 최적화에 유용하게 사용할 수 있습니다.
Profiler 클래스는 Output Class로부터 자동으로 로드되므로 최기화가 필요없고, 원하는 Controller 함수에 삽입합니다.

$this->output->enable_profiler(TRUE);

벤치마크 데이터를 컴파일하고 보여주기 위해서 특정 문법을 사용하여 벤치마크 포인트를 지정해야 합니다.
Profiler 섹션 설정은 두 가지 방법으로 가능합니다.

$ vi application/config/profiler.php
$config['config'] = FALSE;
$config['queries'] = FALSE;

$ vi application/controller/user_controller.php
$sections = array(
    'config' => TRUE,
    'queries' => TRUE
    );
$this->output->set_profiler_sections($sections);


사용 가능한 섹션에 접근 가능한 배열의 키.

  • benchmarks : 벤치마크 포인트와 전체 실행의 경과 시간 (default: TRUE)
  • config : CodeIgniter 설정 변수 (default: TRUE)
  • controller_info : Controller 클래스와 메소드 (default: TRUE)
  • get : 요청에 전달된 GET 데이터 (default: TRUE)
  • http_headers : 요청에 대한 HTTP 헤더 (default: TRUE)
  • memory_usage : 요청에 할당된 메모리양(Bytes) (default: TRUE)
  • post : 요청에 전달된 POST 데이터 (default: TRUE)
  • queries : 실행 시간을 포함한 데이터베이스 쿼리 리스트 (default: TRUE)
  • uri_string : 현재 요청의 URI (default: TRUE)
  • query_toggle_count : 쿼리 블록의 기본값, 쿼리의 수 (default: 25)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 와닥

Caching

Programming/CodeIgniter / 2011/11/12 00:09

CodeIgniter 는 최고의 성능을 위해 페이지를 캐시합니다.
페이지가 처음 로드되면 application/cache 디렉토리에 기록되며 기한이 만료되면 삭제됩니다.
페이지 로딩 속도를 보여주는 Benchmark 태그는 캐시되지 않습니다.

캐시를 사용하려면 controller 함수에 다음 태그를 넣습니다.

$this->output->cache(n);

n은 새로고쳐질 분(minute) 단위의 수로 입력합니다.

캐시 태그는 어떤 함수에서도 사용 가능하지만, 주로 출력을 생성하는 view를 가진 controller에서만 작동합니다.
캐시 사용시 application/cache 디렉토리에 쓰기 권한을 설정해야 합니다.
캐시 만료 전에 캐시를 삭제하고 싶을 때는 application/cache 디렉토리에서 직접 삭제합니다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 와닥