'PHP'에 해당되는 글 21건

정리

PHP 2012. 5. 4. 09:26

 $v_title = str_ireplace("script","",$v_title);

대소문자 구분 하지 않는 str_replace  게시판 등의 스크립트 심기 방지 등

mysql -u root -p db_name < db.dmp   mysql import

is_string 문자열 확인

 

reset 배열 첫번째를 가르킴

if(reset(explode(".",$_SERVER[HTTP_HOST])) != "www") {

www 안붙은 놈들만

}

extract($_GET);  변수 그대로 쓰기 비추인데 은근 쓰는데 많음 유지보수 할 때 특히 디비!

'PHP' 카테고리의 다른 글

이클립스 Remote System 에서 코드 어시스트 받기 !  (0) 2012.07.11
PHP 함수 모음  (0) 2012.05.08
php cURL  (0) 2012.04.30
PHP 코딩 팁  (0) 2012.04.23
PHP 난수 (시리얼 만들기)  (2) 2012.04.09
블로그 이미지

스마트전

,

php cURL

PHP 2012. 4. 30. 18:54

cURL (Client URL Library Functions)이라는 모듈을 서버에 깔다음 실행해야 합니다.

이것이 하는 역할은 내가 원하는 주소의 페이지에서 내가 임의의 값을 넣고 그 넣은 값으로 페이지에서 리턴되는 값을 받아오는 역할입니다.

 

$ch = curl_init([String url])        /* curl 세션의 초기화 [파라메터는 선택사항]. */

curl_setopt($ch, OPTION, VALUE)  /* curl 옵션을 세팅한다. */

curl_setopt 의 OPTION
      CURLOPT_HEADER    : 헤더 정보를 받기 원한다면 이 옵션을 추가한다. VALUE : 1 OR true
      CURLOPT_NOBODY    : 본문의 정보를 받기 원하지 않는다면 이 옵션을 추가한다.
      CURLOPT_TIMEOUT  : curl 타임아웃을 설정한다.
      CURLOPT_URL            : 접속할 url정보를 설정
      CURLOPT_REFERER  : 리퍼러 정보를 설정
      CURLOPT_USERAGENT : 에이전트 정보를 설정
      CURLOPT_POST          : 전송 메소드를 post로 정의한다.
      CURLOPT_POSTFIELDS: POST 메소드라면 파라미터 값들을 이 옵션에 정의하면된다.

 

curl_exec($ch)      /* curl을 실행 */

curl_errno($ch)    /* 에러번호를 가져온다. */

curl_error($ch)    /* 에러 메시지를 가져온다. */

curl_getinfo($ch)  /* 상태 정보를 리턴한다. */

curl_close($ch)  /* curl 세션을 닫는다 */

 curl을 이용한 Gmail 로그인 예제.


$src = "https://".$gmailId.":".$gmailPw."@mail.google.com/mail/feed/atom";

$ch = curl_init();

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST,true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_USERAGENT, 'My Agent Name');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');

$res = curl_exec($ch);

curl_close($ch);

/** 결과는 Atom xml 형식이다. DOM 또는 xml 파싱 function을 이용해서 파싱하면 됩니다. **/
echo $res;

?>

'PHP' 카테고리의 다른 글

PHP 함수 모음  (0) 2012.05.08
정리  (0) 2012.05.04
PHP 코딩 팁  (0) 2012.04.23
PHP 난수 (시리얼 만들기)  (2) 2012.04.09
git 가편 사용법 펌  (0) 2012.04.09
블로그 이미지

스마트전

,

PHP 코딩 팁

PHP 2012. 4. 23. 12:22

1. If a method can be static, declare it static. Speed improvement is by a factor of 4.
메쏘드가 static이 될 수 있다면 static으로 선언하라. 4배 빨라진다.

2. echo is faster than print.
echo가 print보다 빠르다.

3. Use echo’s multiple parameters instead of string concatenation.
문자열을 이어붙이지 말고, echo를 이용하여 여러 개의 파라미터를 적어라.

4. Set the maxvalue for your for-loops before and not in the loop.
for 루프을 위핸 최대값(탈출조건)을 루프 안에서가 아니고 루프 시작 이전에 지정하라.

5. Unset your variables to free memory, especially large arrays.
메모리를 해제하기 위해 변수를 unset하라. 특히 커다란 배열은 그래야 된다.

6. Avoid magic like __get, __set, __autoload
__get, __set, __autoload와 같은 마법을 피해라.

7. require_once() is expensive
require_once()는 비싸다.

8. Use full paths in includes and requires, less time spent on resolving the OS paths.
include와 require를 사용할 때, 경로를 찾는데 시간이 적게 걸리는 full path를 사용하라.

9. If you need to find out the time when the script started executing, $_SERVER[’REQUEST_TIME’] is referred to time()
스크립트가 언제 실행했는지 알고 싶으면 time()보다 $_SERVER[’REQUEST_TIME’]이 좋다.

10. See if you can use strncasecmp, strpbrk and stripos instead of regex
정규표현식보다는 가능하면 strncasecmp나 strpbrk, stripos를 사용하라.
* 역주
strncasecmp: 두 문자열의 앞쪽 일부가 대소문자 구분없이 일치하는지 확인할 때 사용
strpbrk: 문자 집합에 속한 특정 문자가 문자열에 나타나는지 확인할 때 사용
stripos: 대소문자 구분없이 특정 문자열이 다른 문자열에 포함되는지 확인할 때 사용

11. str_replace is faster than preg_replace, but strtr is faster than str_replace by a factor of 4 str_replace가 reg_replace보다 빠르지만, strtr은 str_replace보다 4배 빠르다.

12. If the function, such as string replacement function, accepts both arrays and single characters as arguments, and if your argument list is not too long, consider writing a few redundant replacement statements, passing one character at a time, instead of one line of code that accepts arrays as search and replace arguments.
만약 문자열 교체 같은 함수가 배열과 문자열을 인자로 받아들이면, 그리고 그 인자 리스트가 길지 않다면, 배열을 한 번에 받아들여서 처리하는 것 대신에 한 번에 문자열을 하나씩 넘겨서 처리하는 것을 고려해봐라.

13. It’s better to use select statements than multi if, else if, statements.
여러 개의 if/else if 문장 대신에 select 문장을 사용하는 게 더 좋다.

14. Error suppression with @ is very slow.
@를 이용한 에러 출력 방지는 매우 느리다.

15. Turn on apache’s mod_deflate
Apache의 mod_deflate를 켜라.
*역주
mod_deflate는 서버의 출력을 클라이언트에게 보내기 전에 압축하는 모듈임

16. Close your database connections when you’re done with them
DB를 다 사용했으면 연결을 닫아라.

17. $row[’id’] is 7 times faster than $row[id]
$row[’id’]가 $row[id]보다 7배 빠르다.

18. Error messages are expensive
에러 메시지는 비싸다.

19. Do not use functions inside of for loop, such as for ($x=0; $x < count($array); $x) The count() function gets called each time.
for 루프의 표현식 안에서 함수를 사용하지 마라.
for ($x = 0; $x < count($array); $x)에서 count() 함수가 매번 호출된다.

20. Incrementing a local variable in a method is the fastest. Nearly the same as calling a local variable in a function.
메쏘드 안에서 지역 변수를 증가시키는 것이 거의 함수 안에서 지역 변수를 호출(증가?)하는 것만큼 빠르다.

21. Incrementing a global variable is 2 times slow than a local var.
전역 변수를 증가시키는 것이 지역 변수를 증가시키는 것보다 2배 느리다.

22. Incrementing an object property (eg. $this->prop++) is 3 times slower than a local variable.
객체의 멤버변수를 증가시키는 것이 지역 변수를 증가시키는 것보다 3배 느리다.

23. Incrementing an undefined local variable is 9-10 times slower than a pre-initialized one.
값이 지정되지 않은 지역 변수를 증가시키는 것이 미리 초기화된 변수를 증가시키는 것보다 9~10배 느리다.

24. Just declaring a global variable without using it in a function also slows things down (by about the same amount as incrementing a local var). PHP probably does a check to see if the global exists.
전역 변수를 함수 안에서 사용하지 않으면서 그저 선언하기만 해도 (지역 변수를 증가시키는 것만큼) 느려진다. PHP는 아마 전역 변수가 존재하는지 알기 위해 검사를 하는 것 같다.

25. Method invocation appears to be independent of the number of methods defined in the class because I added 10 more methods to the test class (before and after the test method) with no change in performance.
메쏘드 호출은 클래스 안에서 정의된 메쏘드의 갯수에 독립적인 듯 하다. 왜냐하면 10개의 메쏘드를 테스트 클래스에 추가해봤으나 성능에 변화가 없었기 때문이다.

26. Methods in derived classes run faster than ones defined in the base class.
파생된 클래스의 메쏘드가 베이스 클래스에서 정의된 것보다 더 빠르게 동작한다.

27. A function call with one parameter and an empty function body takes about the same time as doing 7-8 $localvar++ operations. A similar method call is of course about 15 $localvar++ operations.
한 개의 매개변수를 가지고 함수를 호출하고 함수 바디가 비어있다면(함수 내부에서 아무것도 실행하지 않는다면) 그것은 7~8개의 지역변수를 증가시키는 것과 똑같은 시간을 차지한다. 비슷한 메쏘드 호출은 마찬가지로 15개의 지역변수를 증가시키는 연산쯤 된다.

28. Surrounding your string by ‘ instead of ” will make things interpret a little faster since php looks for variables inside “…” but not inside ‘…’. Of course you can only do this when you don’t need to have variables in the string.
문자열을 이중 따옴표 대신에 단일 따옴표로 둘러싸는 것은 좀 더 빠르게 해석되도록 한다. 왜냐하면 PHP가 이중 따옴표 안의 변수를 찾아보지만 단일 따옴표 안에서는 변수를 찾지 않기 때문이다. 물론 문자열 안에서 변수를 가질 필요가 없을 때만 이렇게 사용할 수 있다.

29. When echoing strings it’s faster to separate them by comma instead of dot. Note: This only works with echo, which is a function that can take several strings as arguments.
문자열을 echo할 때 마침표 대신에 쉼표로 분리하는 것이 더 빠르다.
주의: 이것은 여러 문자열을 인자로 받아들이는 함수인 echo로만 작동한다.

30. A PHP script will be served at least 2-10 times slower than a static HTML page by Apache. Try to use more static HTML pages and fewer scripts.
Apache에 의해 PHP 스크립트는 정적 HTML 페이지보다 최소 2에서 10배 느리게 서비스된다. 더 많은 정적 HTML 페이지와 더 적은 스크립트를 사용하려고 노력하라.

31. Your PHP scripts are recompiled every time unless the scripts are cached. Install a PHP caching product to typically increase performance by 25-100% by removing compile times.
PHP 스크립트는 캐시되지 않으면 매번 재 컴파일된다. 컴파일 시간을 제거함으로써 25~100%만큼의 성능을 증가시키기 위해 PHP 캐싱 도구를 설치하라.

32. Cache as much as possible. Use memcached - memcached is a high-performance memory object caching system intended to speed up dynamic web applications by alleviating database load. OP code caches are useful so that your script does not have to be compiled on every request
가능한 한 많이 캐시하라. memcached를 사용하라. memcached는 고성능 메모리 객체 캐싱 시스템이다.

33. When working with strings and you need to check that the string is either of a certain length you’d understandably would want to use the strlen() function. This function is pretty quick since it’s operation does not perform any calculation but merely return the already known length of a string available in the zval structure (internal C struct used to store variables in PHP). However because strlen() is a function it is still somewhat slow because the function call requires several operations such as lowercase & hashtable lookup followed by the execution of said function. In some instance you can improve the speed of your code by using an isset() trick.
문자열을 가지고 작업하며 문자열이 특정 길이인지 확인할 필요가 있을 때, strlen() 함수를 쓸 것이다. 이 함수는 계산없이 zval 구조체에서 사용할 수 있는 이미 알려진 문자열 길이를 반환하기 때문에 매우 빠르다. 그러나 strlen()이 함수이기 때문에 여전히 조금 느리다. 왜냐하면 함수 호출은 언급된 함수의 실행 뒤에 lowercase와 hashtable lookup같은 여러 개의 연산을 호출하기 때문이다. 어떤 경우에는 isset() 트릭을 이용하여 코드의 스피드를 증가시킬 수도 있다.
Ex.
if (strlen($foo) < 5) { echo "Foo is too short"; }
vs.
if (!isset($foo{5})) { echo "Foo is too short"; }
Calling isset() happens to be faster then strlen() because unlike strlen(), isset() is a language construct and not a function meaning that it's execution does not require function lookups and lowercase. This means you have virtually no overhead on top of the actual code that determines the string's length.
isset()을 호출하는 것은 strlen()과는 달리 isset()이 언어 기본문법이고 함수가 아니기 때문에 함수 찾와 lowercase 작업을 필요로 하지 않으므로 strlen()보다 더 빠를 수도 있다. 이것은 가상적으로 문자열의 길이를 결정하는 실제 코드에 과부하가 없다는 것을 의미한다.

34. When incrementing or decrementing the value of the variable $i++ happens to be a tad slower then ++$i. This is something PHP specific and does not apply to other languages, so don't go modifying your C or Java code thinking it'll suddenly become faster, it won't. ++$i happens to be faster in PHP because instead of 4 opcodes used for $i++ you only need 3. Post incrementation actually causes in the creation of a temporary var that is then incremented. While pre-incrementation increases the original value directly. This is one of the optimization that opcode optimized like Zend's PHP optimizer. It is a still a good idea to keep in mind since not all opcode optimizers perform this optimization and there are plenty of ISPs and servers running without an opcode optimizer.
변수 $i의 값을 증가시키거나 감소키킬 때, $i++은 ++$i보다 조금 더 느릴 수 있다. 이것은 PHP의 특징이고 다른 언어에는 해당되지 않으니 좀 더 빨라질 것을 기대하면서 C나 Java 코드를 바꾸러 가지 마라. 안 빨라질 것이다. ++$i는 PHP에서 좀 더 빠른데 그것은 $i++에 4개의 opcode가 사용되는 대신에 3개만 필요하기 때문이다. 후증가는 사실 증가될 임시변수의 생성을 초래한다. 반면에 전증가는 원래 값을 직접 증가시킨다. 이것은 opcode가 Zend의 PHP optimizer처럼 최적화하는 최적화 기법의 하나이다. 모든 opcode optimizer들이 이 최적화를 수행하는 것은 아니고 많은 ISP와 server들이 opcode optimizer없이 수행되고 있기 때문에 명심하는 게 좋을 것이다.

35. Not everything has to be OOP, often it is too much overhead, each method and object call consumes a lot of memory.
모든 것이 OOP일 필요는 없다. 종종 그것은 너무 많은 과부하가 된다. 각각의 메쏘드와 객체 호출은 메모리를 많이 소비한다.

36. Do not implement every data structure as a class, arrays are useful, too
모든 데이터 구조를 클래스로 구현하지 마라. 배열도 유용하다.

37. Don't split methods too much, think, which code you will really re-use
메쏘드를 너무 많이 분리하지 마라. 어떤 코드를 정말 재사용할지 생각해봐라.

38. You can always split the code of a method later, when needed
항상 메쏘드의 코드를 나중에 필요할 때 분리할 수 있다.

39. Make use of the countless predefined functions
수많은 미리 정의된 함수를 활용해라.

40. If you have very time consuming functions in your code, consider writing them as C extensions
매우 시간을 소비하는 함수가 있다면, C 확장으로 작성하는 것을 고려해봐라.

41. Profile your code. A profiler shows you, which parts of your code consumes how many time. The Xdebug debugger already contains a profiler. Profiling shows you the bottlenecks in overview
당신의 코드를 프로파일해봐라. 프로파일러는 코드의 어떤 부분이 가장 많은 시간을 소비하는지 보여준다. Xdebug 디버거는 이미 프로파일러를 포함하고 있다. 프로파일링은 전체적인 병목을 보여준다.

42. mod_gzip which is available as an Apache module compresses your data on the fly and can reduce the data to transfer up to 80%
Apache 모듈로 사용가능한 mod_gzip은 실행 중에 데이터를 압축하여 전송할 데이터를 80%까지 줄일 수 있다.


출처: 40 Tips for optimizing your php Code
      http://skystory.kr/333

'PHP' 카테고리의 다른 글

정리  (0) 2012.05.04
php cURL  (0) 2012.04.30
PHP 난수 (시리얼 만들기)  (2) 2012.04.09
git 가편 사용법 펌  (0) 2012.04.09
PHP class 정리  (0) 2012.03.30
블로그 이미지

스마트전

,

숫자로 된 시리얼 만들기

 

<?

//지정된 자릿수의 랜덤한 숫자를 반환합니다. 최대 10까지 가능합니다. 4 이면 1000 에서 9999 사이의 랜덤 숫자
function get_rand_number($len=4) {

    if (empty($len) || !is_int($len)) $len = 4;
    else if ($len < 0) $len = abs($len);
    if ($len > 10) $len = 10;

    return rand(bcpow(10, $len - 1), bcadd(bcpow(10, $len), -1));
}

//지정된 자릿수의 숫자로된 시리얼을 반환합니다. - 를 포함하고 싶지 않을때는 $cut 이 $len 보다 크거나 같으면 됩니다.
function get_serial($len=16, $cut=4, $hipen='-'){

    if (empty($len) || !is_int($len)) $len = 16;
    else if ($len < 0) $len = abs($len);

    if (empty($cut) || !is_int($cut)) $cut = 4;
    else if ($cut < 0) $cut = abs($cut);

    list($usec, $sec) = explode(' ', microtime());

    $serial = (string)bcmul((int)str_replace('.', '', (string)((float)$usec + (float)$sec)) , get_rand_number(4));
    $serial_length = strlen($serial);
    $sub = $len - $serial_length;

    if ($sub > 0) $serial .= (string)get_rand_number($sub); 
else if ($sub < 0) $serial = substr($serial, 0, $len); 

    return preg_replace("`([0-9]{" . $cut . "})`", "$1" . $hipen, $serial, floor($len / $cut) - 1);
}

echo get_serial(16, 4, '-');

?>

 

 

 

---------------------------------------------------------------------------------------------

$code = strtoupper( md5( rand( 1000 , 2000 ).date( "Y-m-d H:i:s" ).$i ) );
$sn=$code[rand(0,1)].$code[rand(2,3)].$code[rand(4,5)].$code[rand(6,7)]."-";
$sn.=$code[rand(8,9)].$code[rand(10,11)].$code[rand(12,13)].$code[rand(14,15)]."-";
$sn.=$code[rand(16,17)].$code[rand(18,19)].$code[rand(20,21)].$code[rand(22,23)];
결과물 : B307-47B8-8FC5

'PHP' 카테고리의 다른 글

php cURL  (0) 2012.04.30
PHP 코딩 팁  (0) 2012.04.23
git 가편 사용법 펌  (0) 2012.04.09
PHP class 정리  (0) 2012.03.30
PHP file 정리  (0) 2012.03.30
블로그 이미지

스마트전

,

git 가편 사용법 펌

PHP 2012. 4. 9. 09:44

만든이: Roger Dudler
도와준 이들: @tfnico, @fhdNamics
다른 언어로도 있어요: english, deutsch, español, français, italiano, nederlands,
português, русский, 日本語, 中文
문제 보고는 여기(github)로!

자, 갑시다!

새로운 저장소 만들기

폴더를 하나 만들고, 그 안에서 아래 명령을 실행하세요.
git init
새로운 git 저장소가 만들어집니다.

저장소 받아오기

로컬 저장소를 복제(clone)하려면 아래 명령을 실행하세요.
git clone /로컬/저장소/경로
원격 서버의 저장소를 복제하려면 아래 명령을 실행하세요.
git clone 사용자명@호스트:/원격/저장소/경로

작업의 흐름

로컬 저장소는 git이 관리하는 세 그루의 나무로 구성돼있어요.
첫번째 나무인 작업 디렉토리(Working directory)
실제 파일들로 이루어져있고, 두번째 나무인 인덱스(Index)
준비 영역(staging area)의 역할을 하며, 마지막 나무인 HEAD
최종 확정본(commit)을 나타내요.

로컬 저장소는 이렇게 생겼어요.

추가와 확정(commit)

변경된 파일은 아래 명령어로 (인덱스에) 추가할 수 있어요.
git add <파일명>
git add *
이것이 바로 git의 기본 작업 흐름에서 첫 단계에 해당돼요.
하지만 실제로 변경 내용을 확정하려면 아래 명령을 내려야 한답니다.
git commit -m "이번 확정본에 대한 설명"
자, 이제 변경된 파일이 HEAD에 반영됐어요.
하지만, 원격 저장소에는 아직 반영이 안 됐답니다.

변경 내용 발행(push)하기

현재의 변경 내용은 아직 로컬 저장소의 HEAD 안에 머물고 있어요.
이제 이 변경 내용을 원격 서버로 올려봅시다. 아래 명령을 실행하세요.
git push origin master
(다른 가지를 발행하려면 master를 원하는 가지 이름으로 바꿔주세요.)

만약 기존에 있던 원격 저장소를 복제한 것이 아니라면,
원격 서버의 주소를 git에게 알려줘야 해요.
git remote add origin <원격 서버 주소>
이제 변경 내용을 원격 서버로 발행할 수 있어요.

가지(branch)치기

가지는 안전하게 격리된 상태에서 무언가를 만들 때 사용해요.
여러분이 저장소를 새로 만들면 기본으로 master 가지가 만들어집니다.
이제 다른 가지를 이용해서 개발을 진행하고, 나중에 개발이 완료되면
master 가지로 돌아와 병합하면 돼요.

가지치기 예제를 보여드리죠.

아래 명령으로 "feature_x"라는 이름의 가지를 만들고 갈아탑니다.
git checkout -b feature_x
아래 명령으로 master 가지로 돌아올 수 있어요.
git checkout master
아래 명령으로는 가지를 삭제할 수 있어요.
git branch -d feature_x
여러분이 새로 만든 가지를 원격 저장소로 전송하기 전까지는
다른 사람들이 접근할 수 없어요.
git push origin <가지 이름>

갱신과 병합(merge)

여러분의 로컬 저장소를 원격 저장소에 맞춰 갱신하려면
아래 명령을 실행하세요.
git pull
이렇게 하면 원격 저장소의 변경 내용이 로컬 작업 디렉토리에
받아지고(fetch), 병합(merge)된답니다.
다른 가지에 있는 변경 내용을 현재 가지(예를 들면, master 가지)에
병합하려면 아래 명령을 실행하세요.
git merge <가지 이름>
첫번째 명령이든 두번째 명령이든, git은
자동으로 변경 내용을 병합하려고 시도해요.
문제는, 항상 성공하는 게 아니라 가끔
충돌(conflicts)이 일어나기도 한다는 거예요.
이렇게 충돌이 발생하면, git이 알려주는 파일의 충돌 부분을
여러분이 직접 수정해서 병합이 가능하도록 해야 하죠.
충돌을 해결했다면, 아래 명령으로 git에게
아까의 파일을 병합하라고 알려주세요.
git add <파일명>
변경 내용을 병합하기 전에, 어떻게 바뀌었는지 비교해볼 수도 있어요.
git diff <원래 가지> <비교 대상 가지>

꼬리표(tag) 달기

소프트웨어의 새 버전을 발표할 때마다 꼬리표를 달아놓으면 좋아요.
(물론 꼬리표는 SVN 등에 이미 존재하는 기능이지요.)
아래 명령을 실행하면 새로운 꼬리표인 1.0.0을 달 수 있어요.
git tag 1.0.0 1b2e1d63ff
위 명령에서 1b2e1d63ff 부분은 꼬리표가 가리킬 확정본 식별자입니다.
아래 명령으로 확정본 식별자를 얻을 수 있어요.
git log
확정본 식별자의 앞부분 일부만 입력해도 꼬리표를 붙일 수 있지만,
그 일부분이 반드시 고유하다는 조건이 필요해요.

로컬 변경 내용 되돌리기

만약 여러분이 (물론 그럴 일은 없겠지만 ;) 실수로 무언가 잘못한 경우,
아래 명령으로 로컬의 변경 내용을 되돌릴 수 있어요.
git checkout -- <파일명>
위 명령은 로컬의 변경 내용을 변경 전 상태(HEAD)로 되돌려줘요.
다만, 이미 인덱스에 추가된 변경 내용과
새로 생성한 파일은 그대로 남는답니다.

만약, 로컬에 있는 모든 변경 내용과 확정본을 포기하려면,
아래 명령으로 원격 저장소의 최신 이력을 가져오고,
로컬 master 가지가 저 이력을 가리키도록 할 수 있어요.
git fetch origin
git reset --hard origin/master

유용한 힌트

git의 내장 GUI
gitk
콘솔에서 git output을 컬러로 출력하기
git config color.ui true
이력(log)에서 확정본 1개를 딱 한 줄로만 표시하기
git config format.pretty oneline
파일을 추가할 때 대화식으로 추가하기
git add -i

'PHP' 카테고리의 다른 글

PHP 코딩 팁  (0) 2012.04.23
PHP 난수 (시리얼 만들기)  (2) 2012.04.09
PHP class 정리  (0) 2012.03.30
PHP file 정리  (0) 2012.03.30
PHP DATE 정리~  (0) 2012.02.08
블로그 이미지

스마트전

,

PHP class 정리

PHP 2012. 3. 30. 12:20

PHP는 OOP(Object Oriented Programming) 즉 객체지향 프로그래밍 언어로써 class 사용이 가능합니다. 그 사용법이나 쓰임새는 JAVA의 그것과 매우 흡사하여 JAVA를 공부하신 분들은 쉽게 익히실 수 있습니다. 그럼 지금부터 class 사용법을 간략히 알아보겠습니다.

 

1. class 선언

class aaa{ //함수를 정의하는 것과 같은 방식으로 class를 선언합니다. 다만, 선언된 class로 객체를 만들면 독립적으로 활동하므로 함수의 인자와 같은것은 없습니다.

 

var $aaa_mv; //맴버변수(member variable) 정의합니다. class 안에서 정의된 변수를 맴버변수라고 합니다.

 

function aaa1(){ //메서드(method) 정의합니다. class 안에서 정의된 함수를 메서드라고 합니다.

     echo "class선언";

}

 

}

 

$aaa_rv = new aaa; //메모리상에 인스턴스(객체)를 생성하기 위해서는 new 연산자를 이용해서 명시적으로 생성을 해주어야 합니다. 이렇게 생성된 인스턴스를 가리키는 변수가 레퍼런스 변수(Reference Variable)입니다. 그렇다면 class 만 정의 하면 되지, 인스턴스 생성은 왜 필요한가? 이것은 class 자체는 객체를 정의한 것에 불과하고, 실제로 사용되기 위해서는 메모리상에 올라와야 하기 때문입니다. 그리고 여기서 절대 혼동해서 안되는 것은 레퍼런스 변수인 $rv 는 그 자체로 객체가 아니라 인스턴스 즉, 객체를 가리키는 역할만 한다는 것입니다.

$aaa_rv -> aaa1(); //연산자 -> 를 사용하여 위에서 정의한 aaa1()를 호출합니다. JAVA에서는 '레퍼런스변수.메서드' 로 사용합니다. 여기서 '.' 이 PHP에서는 '->' 입니다.

 

*앞으로 '인스턴스'와 '객체'는 같은 뜻으로 혼용하여 사용하겠습니다.

 

2. $this(의사-변수)

class aaa{  

 

var $aaa_mv;  

 

function aaa1(){

echo $this->aaa_mv; //$this는 aaa의 인스턴스 즉, 자신을 가리킵니다. class 밖에서는 레퍼런스 변수를 사용해서 인스턴스에 접근하고 class 안에서는 $this로 인스턴스에 접근합니다.

}

 

}

 

$rv = new aaa;

$rv -> aaa_mv = "의사-변수"; //레퍼런스 변수를 이용하여 맴버변수에 접근하는 방법입니다. JAVA에서는 '레퍼런스변수.맴버변수' 로 사용합니다. 여기서 '.' 이 PHP에서는 '->' 입니다.

$rv -> aaa1();


*맴버변수를 선언하지 않고 의사-변수에 바로 값을 넣고 사용해도 문제가 발생하지 않으나 올바른 방법은 아닙니다.

 

3. ::(영역 해결 연산자)

class aaa{  

 

var $aaa_mv = "영역 해결 연산자"; 

 

function aaa1(){

echo "영역 해결 연산자";

}

 

}

 

aaa :: aaa1(); //영역 해결 연산자 '::' 는 new연산자로 인스턴스를 생성하지 않은 상태에서 class 자체의 함수를 사용하고 싶을 때 사용합니다. 그리고 class 함수는 존재하지만, class 변수는 존재하지 않습니다. 왜냐하면 인스턴스가 생성되지 않았기 때문에 의사-변수 $this 로 class 변수 즉, 맴버변수에 접근할 수 없기 때문입니다. 하지만 맴버변수 정의시 static을 주면 전역변수가 되어서 aaa :: $aaa_mv; 와 같이 사용할 수 있다.

 

4. extends(상속) // 상속이란 이미 만들어진 class(상위class)의 기능을 그대로 물려받는 새로운 class(하위class)를 만들고 싶을 때 사용합니다. 상위class를 그대로 물려받은 상태에서 맴버변수와 메소드를 조금 더 추가하여 하위class를 만듭니다.

class aaa{ //상위class 선언

 

var $aaa_mv; 

function aaa1(){

echo "aaa";

}

 

}

 

class bbb extends aaa{ //하위class 선언

 

var $bbb_mv; 

function bbb1(){

echo "bbb";

}

 

}

 

$bbb_rv = new bbb;

$bbb_rv -> aaa1(); //class bbb는 class aaa로 부터 상속 받았기에 레퍼런스변수 $bbb_rv로 class aaa의 aaa1() 함수를 호출할 수 있습니다. 

 

5. Method Overring(메서드 오버라이딩) // 상속받은 하위class는 상위class의 메서드에 접근할 수 있습니다. 그런데 하위class에서 메서드의 이름은 같지만 동작은 다르게 해야 할 경우는 어떻게 해야 할까요? 이때 메서드 오버라이딩을 사용합니다. 지금부터 사용방법을 설명하겠습니다. 일단 하위class에 사용하고자 하는 상위class의 메소드의 이름과 똑같이 정의 합니다. 그 안에 기능만 바꾸만 메서드 호출시 하위class에서 정의된 기능으로 구현됩니다.

class A {


function example() { //하위class의 메서드 이름과 같습니다.
echo "aaa";
}


}

class B extends A {


function example() { //상위class의 메서드 이름과 같습니다.
echo "bbb";
}


}

 

$b = new B;
$b->example(); //상위class와 하위class 모두 example()라는 같은 메서드를 가지고 있지만 여기서 메서드 오버라이딩되어서 하위class의 메서드가 구현됩니다.

 

*상위,하위class 메소드 작성시 인자는 될 수 있으면 같아야 합니다. (JAVA와는 달리 인자가 다르더라도 에러는 발생하지는 않습니다만) 하지만, 메서드를 호출할 때 하위class의 인자와 같아야 합니다. 예를 들어 위의 하위class가 fuction example($var){ 로 정의 되어 있다면 메서드 호출시에도 $b->example("인자 값"); 와 같이 인자개수를 맞추어야 합니다. (메서드 호출시 보내는 인자개수는 하위class에서 작성된 인자개수보다 많아도 에러가 발생하지 않지만, 그 반대가 되면 에러가 발생하므로 유의하시기 바랍니다.)


*JAVA에서의 Method Overloading(메서드 오버로딩)의 개념은 PHP에 없습니다. Cannot redeclare 라고 에러가 발생합니다.

 

6. 메서드 오버라이딩 구현시 상위class 메서드에 접근하기 위한 parent 사용 //하위class에서 메서드 오버라이딩을 해주게 되면, 상위 클래서의 해당 메서드의 직접적인 호출이 불가능합니다. 하지만 오버라이딩된 상위class의 메서드를 호출해야 하는 경우가 종종 있습니다. 이렇게 상위class에 접근하기 위해서 parent를 사용합니다. parent를 사용하면 상위class 명을 사용하는 것을 피할 수 있습니다. 그리고 parent를 메서드 오버라이딩이 아니더라도 상위class에 접근하기 위한 방법으로 사용할 수 있으나, 그때는 $this->메서드 와 같이 사용하면 됨에 따라 굳이 parent를 사용할 필요는 없습니다.

class A {


function example() { //하위class의 메서드 이름과 같습니다.
echo "aaa";
}


}

class B extends A {


function example() { //상위class의 메서드 이름과 같습니다.
parent::example(); //상위class인 A는 인스턴스가 생성되지 않았기 때문에 인스턴스로 접근할 방법이 없습니다. 따라서 영역 해결 연산자'::'를 사용합니다. parent는 JAVA에서 super와 비슷한 역할을 한다고 볼 수 있습니다.

}


}

 

$b = new B;
$b->example(); //메서드 오버라이딩이된 하위class의 메서드가 구현되지만, 그 메서드가 다시 상위class 메서드를 구현하여 "aaa"이 출력됩니다.

 

7. 맴버변수 상수가 아닌 값으로 초기화

class aaa{  

 

 var $aaa_mv = "상수"; //이렇게 맴버변수 선언시 바로 값을 주면 상수로 초기화 됩니다.

 

function aaa1(){

echo $this->aaa_mv;

}

 

}

 

$rv = new aaa;

$rv -> aaa_mv = "상수가 아닌 값"; //이렇게 맴버변수를 먼저 선언하고 따로 값을 주면 상수가 아닌 값으로 초기화 됩니다.

$rv -> aaa1();

 

8. 접근 제어자

public : 아무 객체나 접근가능

protected : 상속 관계까지 접근가능

private : 외부 객체 접근불가

*var는 variable의 약자로 단지, 일반적으로 맴버변수를 정의 할때 사용하는 default입니다. 접근제어자 측면에서의 그 기능은 public과 비슷하다고 할 수 있으나 완전히 같지는 않습니다. PHP5 로 가면서 class기능이 더욱 강화되었고 그러므로 앞으로는 var보다 위의 정확한 접근 제어자를 주는 것이 유익합니다.

 

class A {
 
protected $a = "접근제어자"; //protected 로 맴버변수 정의


}

 

class B extends A {
 
function example() {
echo $this->a; //protected 는 상속관계까지 접근을 허용함으로 출력이 됩니다.
}


}

 

$b = new B;
$b->example();
echo $b->a; //외부에서 호출을 하고 있으므로 에러가 발생한다. 이때 상위class의 맴버변수를 public으로 선언하면 출력이 됩니다.

 

자바랑 거의 비슷하네..

'PHP' 카테고리의 다른 글

PHP 난수 (시리얼 만들기)  (2) 2012.04.09
git 가편 사용법 펌  (0) 2012.04.09
PHP file 정리  (0) 2012.03.30
PHP DATE 정리~  (0) 2012.02.08
PHP 배열 정리  (0) 2012.02.03
블로그 이미지

스마트전

,

PHP file 정리

PHP 2012. 3. 30. 12:14
 int fopen(string filename, string mode)

file을 열기위해 사용하는 함수입니다. 함수의 첫번째 parameter로 file이름이 들어가며 두번째 parameter로는 file을 어떻게 열것인지를 지정하는 지정값이 필요합니다.

fopen()함수 사용시 지정할 수 있는 mode값으로는 다음과 같습니다.

 r  읽기, file pointer는 file의 시작에 위치
 r+  읽기 쓰기, file pointer는 file의 시작에 위치
 w  쓰기, file pointer는 file의 시작에 위치
 w+  읽기, 쓰기, file pointer는 file의 시작에 위치
 a  쓰기, file pointer는 file의 끝에 위치
 a+  쓰기, file pointer는 file의 끝에 위치

w과 w+는 지정한 file이 존재하지 않는 경우 신규로 file을 생성하며 file이 있으면 내용을 모두 지워버립니다. 하지만 a나 a+는 file이 존재하지 않는 경우에만 신규로 생성하고 존재하는 경우 내용을 보존하고 pointer를 맨 끝으로 보내게 됩니다.

fopen()으로 file열기에 성공하게 되면 실제 file을 다루게 되는 pointer를 반환하고 그렇지 않으면 false를 반환하게 됩니다.

 int fputs(int filepointer, string s)

file pointer가 지정하고 있는 file에 문자열 내용을 쓰기위한 함수입니다. 이 함수를 사용할때는 첫번째 parameter로 file pointer를 두번째 parameter로 쓰고자 하는 내용의 문자열을 지정합니다.

 string fgets(int fileopinter, int length)

file pointer가 지정하고 있는 file에서 내용을 읽어오는 함수입니다. 이 함수의 첫번째 parameter로 file pointer를 지정해야 하며 두번째 parameter에서 얼마만큼의 내용을 읽어올지 나타내는 길이를 지정합니다. fgets함수는 length - 1byte 만큼 읽거나 리턴혹은 파일의 끝에 도달하면 읽기를 중지하고 읽은 값을 그대로 반환합니다.

만약 정상적으로 읽기에 실패하면 false를 반환하게 됩니다.

 bool fclose(int filepointer)

fopen() 함수로 file을 열어서 필요한 작업을 수행된 뒤 마무리를 지으려면 fclose로 file을 닫아야 합니다. 이 함수가 필요로 하는 유일한 parameter는 fopen()함수에서 반환받은 file pointer이며 file닫기에 실패하는 경우 false값을 반환합니다.

만일 fclose()로 file을 제때 닫아주지 않으면 다른 사용자나 process가 해당 file에 접근할 수 없게 됩니다. fopen()함수는 file을 열고서 다른 쪽에서 file에 접근할 수 없도록 rock을 걸어두기 때문입니다.


위는 sample1.txt과 sample.txt file에 대해 읽고 쓰기를 작업하는 예제입니다. 먼저 fopen을 통해 file을 열고 fgets()과 fputs()로 file 작업을 수행한 뒤 fclose로 file을 닫아줍니다. 보시면 아시겠지만 처음 file을 open한 이 후 부터는 오로지 file pointer(예제에서는 $cusFile)를 대상으로 file작업을 수행하게 됩니다.

 

'PHP' 카테고리의 다른 글

git 가편 사용법 펌  (0) 2012.04.09
PHP class 정리  (0) 2012.03.30
PHP DATE 정리~  (0) 2012.02.08
PHP 배열 정리  (0) 2012.02.03
PHP JSON 처리  (0) 2012.02.02
블로그 이미지

스마트전

,

PHP DATE 정리~

PHP 2012. 2. 8. 15:14

1. date()

  > string date ( string format [, int timestamp])

ex)------------------------------------

 // 다음의 출력: Wednesday 15th of January 2003 05:51:38 AM
 echo date("l dS of F Y h:i:s A");

---------------------------------------

 

2. getdate()

  > 현재의 날짜(파라미터를 안넣은 경우)나 타임스탬프값으로 날짜를 배열로 가져온다.

  > array getdate ( [int timestamp])
ex)-------------------------------

Array
(
    [seconds] => 40
    [minutes] => 58
    [hours]   => 21
    [mday]    => 17
    [wday]    => 2
    [mon]     => 6
    [year]    => 2003
    [yday]    => 167
    [weekday] => Tuesday
    [month]   => June
    [0]       => 1055901520
)

----------------------------------

 

3. time()
  > 파라미터를 받지 않으며 항상 현재 일시와 유닉스 타임스탬프를 리턴한다.
  > int time(void)
 
4. mktime()
  > 날짜와 시간을 유닉스 타임스탬프로 바꾸고자 할때 사용한다.
  > 파라미터를 넣지 않는다면 현재시간을 가져온다.(이는 time()과 date("U")와 같다.)
  > int mktime ( [int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst]]]]]]])
  > int is_dst파라미터는 서머타임 기간인지 아닌지를 알려주는데 사용한다.

ex)-------------------------------------------------------------------------
// 0시, 0분, 0초, 12월, 31일, 1997년도를 타임스탬프값으로 받아와서 date로 출력
echo date("M-d-Y", mktime(0, 0, 0, 12, 31, 1997));
----------------------------------------------------------------------------
 

5. strtotime() 

 > date("보여줄날짜의 형태",strtotime("구할인자", 기준이되는날짜)) 형태로 잘 사용되는 함수

ex)--------------------------------------------------------------------------

$time = time();
echo date("Y-m-d",strtotime("-1 day", $time))." 하루 전(어제)";
echo date("Y-m-d",strtotime("-1 day", $time))." 하루 전(어제)<br>";
echo date("Y-m-d",strtotime("now", $time))." 현재<br>";
echo date("Y-m-d",strtotime("+1 day", $time))." 하루 후(내일)<br>";
echo date("Y-m-d",strtotime("+1 week", $time))." 일주일 후<br>";
echo date("Y-m-d",strtotime("-1 month", $time))." 한달 전<br>";
echo date("Y-m-d",strtotime("+1 month", $time))." 다음달<br>";
echo date("Y-m-d",strtotime("+6 month", $time))." 6달후<br>";
echo date("Y-m-d",strtotime("+12 month", $time))." 12달후<br>";
echo date("Y-m-d",strtotime("next Thursday", $time))." 다음주 목요일<br>";
echo date("Y-m-d",strtotime("last Monday", $time))." 지난 월요일<br>";
echo date("Y-m-d",strtotime("10 September 2000", $time))." 2000년 9월 10일 <br>"; 
 

 

ex )-----------------------------------------------------------------

if(date("Ymd") < "20110331" && date("Ymd") > "20110701") {

echo "팝업 등의 시간 설정에 사용";

}

 

 

'PHP' 카테고리의 다른 글

PHP class 정리  (0) 2012.03.30
PHP file 정리  (0) 2012.03.30
PHP 배열 정리  (0) 2012.02.03
PHP JSON 처리  (0) 2012.02.02
PHP $_SERVER 정의  (0) 2012.01.31
블로그 이미지

스마트전

,