[입문자용 강좌] 함수 1 > 개발자팁

개발자팁

개발과 관련된 유용한 정보를 공유하세요.
질문은 QA에서 해주시기 바랍니다.

[입문자용 강좌] 함수 1 정보

PHP [입문자용 강좌] 함수 1

첨부파일

함수1.hwp (64.0K) 82회 다운로드 2007-02-14 21:20:27

본문

[함수1]
# 본내용은 스킨제작을 목적으로 하는 분들을 위한 입문자용 기본 강좌입니다.
# 입문자가 쉽게 php를 느낄수 있도록 되도록 간추려서 쉽게 구성한 강좌입니다.
# 입문자가 아니면 보실 필요가 없습니다.
# 강좌의 순서는 입문자가 쉽게 와닿을수 있도록 임의로 조정했습니다.
# 강좌는 누구나 읽고 사용할수 있지만, 다른 책의 내용으로 포함될수 없습니다.


제어구조를 진행하다가 갑자기 왜 함수로 갔는지 의아해 하시는 분들이 있을것입니다.
제어구조에 대한 설명이 끝난 것은 아니지만
함수라는 것의 이해가 먼저 선행되어야
제어구조를 좀 더 쉽게 풀어나갈수 있을 것 같아서
함수에 대한 기본적인 것을 먼저 언급한후
다시 제어구조로 돌아가고
그다음에 함수에 대한 것을 마무리 할것입니다.

1. 함수란?

함수라는 것은 프로그램상에서 자주 사용되는 동작, 처리 부분을
미리 따로 정의 해 놓음으로서
복잡한 반복 과정없이 간단하게 호출하여 사용할수 있도록 만든 것입니다.
함수에 따라서 true, false 또는 특정값을 돌려주는 것이 있고
동작, 처리만 하고 값을 돌려주지 않는 것도 있습니다.

함수의 규칙이 어떻고
어떻게 만들어서 어떻게 사용하냐 의 사용자 정의함수 부분은 이후에 다룰것이며
여기에서는 아주 자주 사용되고 꼭 알아야할 php에서 제공하는 유용한 함수 몇가지를
설명합니다.


2. 많이 사용하는 함수

1) echo

먼저 echo 라는 함수를 설명하기 이전에
php메뉴얼의 함수 검색에서
함수 설명보는 부분을 설명합니다.

먼저, http://kr.php.net 에 접속합니다.
상단 메뉴부분에 검색할수 있는 인풋 박스가 있습니다.
그곳에 echo 라고 입력을 하고 엔터를 칩니다.

echo
(PHP 3, PHP 4, PHP 5 )
echo -- 하나 이상의 문자열을 출력합니다.

설명
void echo ( string arg1 [, string argn...])


모든 인자를 출력합니다.
echo()은 실제 함수가 아니기에 (언어 구조입니다) 괄호를 사용할 필요가 없습니다. 실제로, 둘 이상의 인자를 사용할 때는 괄호를 사용해서는 안됩니다.



이런식으로 함수 설명 페이지가 나옵니다.

(PHP 3, PHP 4, PHP 5 )
이부분은 어떤 php버전에서 사용가능한지에 대해서 보여줍니다.
이것 같은 경우는 php3부터 그이후의 버전에서 모두 사용할수 있다는 뜻입니다.

echo -- 하나 이상의 문자열을 출력합니다.
이부분은 간략한 함수 설명 부분입니다.

void echo ( string arg1 [, string argn...])
이부분은 맨앞에 void라는 것이 있는데
이것은 리턴값이 없는 함수라는 뜻입니다.

다른 함수인경우에는 bool, int, string, array, mixed 등등의 값들이 올수 있습니다.
각각 참거짓, 숫자형, 문자결합형, 배열, 혼합형 등이 리턴 된다는 뜻입니다.
여러 가지 함수를 검색해봄으로서 어떤 리턴값이 있는지 확인해봅니다.

( string arg1 [, string argn...])
이부분은 함수를 사용할 때 몇 개의 인자를 어떤 형태로 받을지를 보여줍니다.
string arg1은 문자결합형 인자를 하나 받는다는 뜻입니다.
,를 구분자로 추가해 나가며 그 개수대로 인자를 지정된 형태를 주어야 합니다.
[, string argn...]은 인자로서 넣어도 되고 안넣어도 되는 경우에
다음과 같이 표현합니다.

그 이후에는 상세설명이 나오게 됩니다.

매뉴얼을 잘 확인하고 이해하는 것만으로도
많은 발전이 있습니다.


그럼, 본격적으로 echo() 라는 함수를 설명하면
echo() php에서 html로 확인가능하도록 출력해주는 역할을 합니다.
php상에서 어떤 작업을 하더라도
echo나 비슷한 출력함수를 사용하여 출력하지 않으면
웹페이지에 나타나지 않습니다.
즉 웹페이지에 드러나게끔 해주는 함수입니다.

위에 매뉴얼 부분에서도 설명이 있듯이
다른 함수와는 다르게 ()를 사용하지 않아도 됩니다.
<?php

echo "우리나라는 좋은 나라입니다. <br>“;

echo '우리나라는 좋은 나라입니다. <br>';

echo ("우리나라는 좋은 나라입니다. <br>");

echo ('우리나라는 좋은 나라입니다. <br>');

?>

위예제의 결과는 모두 같은 결과의 내용이 네번 출력되게 됩니다.
모두 맞는 사용법입니다.


#### 참고사항 ####
“ 와 ‘ 의 차이에 대해서 설명하고자 합니다.
둘다 문자열을 감싸주는 역할을 하는데
대부분 비슷하지만 결정적으로 중요한 한가지 역할이 다릅니다.
다음의 예제를 확인합니다.
<?php

$a = '안녕하세요?';

echo "$a 우리나라는 좋은 나라입니다. <br>“;

echo '$a 우리나라는 좋은 나라입니다. <br>';

echo ("$a 우리나라는 좋은 나라입니다. <br>");

echo ('$a 우리나라는 좋은 나라입니다. <br>');

?>

위의 예제는 모두 같은 결과를 출력할까요?
첫 번째와 세 번째는 안녕하세요? 우리나라는 좋은 나라입니다.
라고 출력됩니다.
두 번째와 네 번째는 $a 우리나라는 좋은 나라입니다.
라고 출력됩니다.

느낌이 오십니까?
쌍따움표(“)로 감싸게 되면 php가 내부에 변수가 있는지 확인하여 그값을 돌려받아서
출력합니다.
홑따움표(‘)로 감싸게 되면 전혀 변환하지 않고 있는 그대로를 출력합니다.
이차이는 아주 중요한 차이이며
실수로 간과할수도 있는 부분이니 잘 새기도록 합니다.

2) isset

isset

(PHP 3, PHP 4, PHP 5 )isset -- 존재하는 변수인지 확인합니다.

설명
bool isset ( mixed var [, mixed var [, ...]])


var가 존재하면 TRUE를, 존재하지 않는 다면 FALSE를 반환합니다.

isset 이라는 함수는
현재 부분 이전에서
인자로 받은 변수가 정의 되었는지 확인하여
정의되었으면 true, 정의되어있지 않으면 false를 반환합니다.

설명앞에 bool 이라고 되었는 것이 보일것입니다.
아까도 설명했지만 bool이라고 되어있으면
함수의 실행결과로 리턴값을 돌려주는데 그 값이 true 나 false 라는 뜻입니다.

이 isset 이라는 함수는 해당 변수에 값이 있던 없던 간에
$a = 값;
형태로 이전에 정의되어있으면 true를 반환합니다.

<?php

$a = 5;

if (isset($a)){//$a라는 변수가 정의되어 있으면?

  echo '상위에서 $a 라는 변수가 정의 되어있습니다.';
}
else if (!isset($a)){//$a라는 변수가 정의되어 있지 않으면?

 echo '상위에서 $a 라는 변수가 정의 되어 있지 않습니다.‘;
}

if (isset($b)){//$b라는 변수가 정의되어 있으면?

  echo '상위에서 $b 라는 변수가 정의 되어있습니다.';
}
else if (!isset($b)){//$b라는 변수가 정의되어 있지 않으면?

 echo '상위에서 $b 라는 변수가 정의 되어 있지 않습니다.‘;
}

?>

첫 번째 if else 구문은 정의된 변수 $a 대해 정의되어있는지 아닌지를 비교하여
해당 문자열을 출력하도록 한것입니다.

두 번째 if else 구문은 정의되지 않은 변수 $b 에 대해 정의되어있는지 아닌지를 비교하여
해당 문자열을 출력하도록 한것입니다.

#### 참고사항
php에서 !의 의미?
이전에 연산자에 대해 배울때
== 같다라는 의미의 연산자와
!= 같지 않다라는 의미의 연산자를 봣을 것입니다.

!은 반대의 값을 되돌려 줍니다.
함수 앞에서 !을 붙이게 되면
함수의 리턴값의 반대의 값을 돌려주게 됩니다.
즉 리턴값이 true 이면 false를
false 이면 true를 돌려주게 됩니다.

따라서 위조건문 예제에서 보면
if 문은 조건절이 참일 경우에만 실행된다고 배웠으므로
else if (!isset($b)){
이부분은 먼저 isset($b)를 통해서 존재하는지 여부를 판단하고,
정의되지 않았으니까 함수의 리턴값은 false 입니다.
그런데 그앞에 !가 있으니까
다시 반대의값을 돌려주게 됩니다. true
결과적으로 if의 조건문이 참이므로
echo '상위에서 $b 라는 변수가 정의 되어 있지 않습니다.‘;
이 구문이 실행되게 되는 것입니다.

3) empty

empty

(PHP 3, PHP 4, PHP 5 )empty -- 변수가 비어있는지 검사합니다.

설명
bool empty ( mixed var)


empty()는 var가 비어있지 않고 제로가 아닌 값이라면 FALSE를 반환합니다. 즉, "", 0, "0", NULL, FALSE, array(), var $var, 비어있는 프로퍼티의 객체를 비어있는 것으로 판단합니다. var가 비어있다면 TRUE를 반환합니다.

설명이 조금 어렵게 나와있는데 다시 제 설명을 들어보기 바랍니다.

empty 영어로도 ‘빈’, ‘비어있는’을 뜻하는 형용사입니다.
즉 인자로 넘겨지는 변수가
비어있는지 아닌지를 판단해서
비어 있으면 true, 비어있지 않으면 false를 돌려줍니다.
비어있다라고 판단되는 값에는
1. 상위에 변수 자체가 저의되어 있지 않은 경우, 즉 !isset(변수)가 참인 경우
2. 변수는 정의 되어 있되 ‘’ 거나, “” 거나, NULL이거나, false 이거나, 0 이거나, ‘0’ 이거나, “0”일 경우
3. 배열이나 객체는 선언되어 있되, 배열에 값을 아무것도 할당하지 않은 경우

자, 다음의 예제를 확인합니다.
<?php

$a = "";//변수는 정의하되 아무값도 넣지 않음
$b = '';//변수는 정의하되 아무값도 넣지 않음
$c = NULL;//변수는 존재하되 어떤 값도 없음
$d = false;//변수에 거짓에 해당하는 false를 대입
$e = 0;//변수에 숫자 0을 대입
$f = '0';//변수에 수 문자열 0을 대입
$g = "0";//변수에 수 문자열 0을 대입
$h = Array();// 배열만 선언

if (empty($a)) echo '$a 는 비어있습니다. <br>';
if (empty($b)) echo '$b 는 비어있습니다. <br>';
if (empty($c)) echo '$c 는 비어있습니다. <br>';
if (empty($d)) echo '$d 는 비어있습니다. <br>';
if (empty($e)) echo '$e 는 비어있습니다. <br>';
if (empty($f)) echo '$f 는 비어있습니다. <br>';
if (empty($g)) echo '$g 는 비어있습니다. <br>';
if (empty($h)) echo '$h 는 비어있습니다. <br>';
if (empty($i)) echo '$i 는 비어있습니다. <br>';

?>

위의 예제에서 보면 알수 있듯이 모두 비었다고 나옵니다.

#### 참고사항
변수형을 설명할 때 NULL 에 대해서 설명하지 않았는데
이것은 완전이 비어있다라는 뜻입니다.
 ‘’ 나 “” 이것과는 다릅니다.
이 부분을 설명하기 위해선 복잡한 개념이 들어가야 하는데
그부분은 생략하고
간편하게
NULL 은 완전히 빈값이되 ‘’ 나 “”와는 다르다
정도로 숙지하도록 합니다.

4) 이외에는 아주 유용한 미리 정의된 함수가 많지만,
그것들은 앞으로 나올때마다 조금씩 다루기로 하고 이번 강좌는 여기서 마칩니다.<div class='small'>[이 게시물은 관리자님에 의해 2011-10-31 17:12:10 PHP & HTML에서 이동 됨]</div>
추천
1

댓글 28개

감사합니다^^
아주 쉽게 잘 이해됩니다.

강좌의 흐름을 방해할까봐 망설여집니다만 두어가지 여쭤보겠습니다.
is_file() 함수에서 선행조건 즉 어떠한 파일정보가 있어야 이 함수가 동작하는지 궁금합니다.
예를 들면 외부이미지 http://sir.co.kr/gnuboard4/img/abc.jpg 라는 파일이 있다고 가정할때
단지 파일의 경로만으로는 파일의 존재 여부를 돌려주지 않는것 같은데 이처럼 외부파일의 존재여부를 파악하는 간단한 방법이 있을런지요?

또 한가지는 라이브러리 파일을 extend나 lib폴더에 올려서 인클루드 하는 방식으로 사용하지 않고
각각의 스킨에 해당 파일을 넣어두고 다음과 같이 펑션의 중복을 피하는 방법으로 사용해도 괜찮은지 알고싶습니다.
if (!function_exists("Ymake_sumnail_remoteimage")) {
  include_once($board_skin_path . "/Ylink_thumb.lib.php");
}
네 먼저 두번째 것부터 설명 하자면
그렇게 하면 됩니다.

그런데 함수가 들은 라이브러리 파일을 인클루드 할때
항상 include_once를 사용한다면
체크 과정은 필요가 없습니다.
include_once 자체가
인클루드 한것인지 아닌지를 먼저 판별하기 때문에
항상 include_once로 라이브러리 파일을 인클루드 하여 사용한다면
함수가 존재하는지 여부는 필요없습니다.

그리고 첫번째 부분은 난이도가 있는 부분인데요
완벽하게 체크하는 방법은 없습니다.
상대 서버측에서 원천적으로 외부에서 파일을 읽어가는것을 막는다면
방법이 없습니다.
그경우가 아니라면
다음과 같은 함수로서 대용할수 있습니다.
이전에 외부이미지 정보 가져오는 함수 생각나시죠?
그런식으로 활용하면 됩니다.

<?php

//변수가 정의 되었으면 해당 값을 반환하고 정의 되어있지 않으면 지정된 기본값을 반환합니다.
function Yvar_check(&$var, $return=''){

  return (isset($var)) ? $var : $return;
}

//변수가 정의되지 않았거나 값이 NULL값 이거나, 값이 0, false 일경우 지정된 기본값을 반환합니다.
function Yvar_empty_check(&$var, $return=''){

  return (!empty($var)) ? $var : $return;
}

//http, GET 방식의 소켓연결
function Ysockopen($url, $referer='', $accept='*/*', $contenttype='application/x-www-form-urlencoded', $cachecontrol='private', $pragma='no-cache', $connection='close'){

  if (!empty($url) && preg_match("`^http://.+`i", $url)) {

    $array = parse_url($url);
    $url_scheme = Yvar_check($array['scheme']);
    $url_server = Yvar_check($array['host']);
    $url_path = Yvar_check($array['path']);
    $url_query= Yvar_check($array['query']);
    $url_port = Yvar_empty_check($array['port'], 80);

    $fp = fsockopen($url_server, $url_port);

    if (empty($fp)) {

      return false;
    }

    fputs($fp, "GET " . $url_path . "?" . $url_query . " HTTP/1.0\n");
    if (!empty($accept)) fputs($fp, "Accept: " . $accept . "\n");
    if (!empty($contenttype)) fputs($fp, "Content-Type: " . $contenttype . "\n");
    fputs($fp, "Host: $url_server:$url_port\n");
    if (!empty($referer)) fputs($fp, "Referer: " . $referer . "\n");
    if (!empty($cachecontrol)) fputs($fp, "Cache-control: " . $cachecontrol . "\n");
    if (!empty($pragma)) fputs($fp, "Pragma: " . $pragma . "\n");
    if (!empty($connection)) fputs($fp, "Connection: " . $connection . "\n\n");

    return $fp;
  }
  else {

    return false;
  }
}

function Ysockclose(&$fp){

  if (!empty($fp)) fclose($fp);

  return true;
}

//소켓으로 외부파일이 존재하는지 판단, 존재할경우 true, 존재하지 않으면 false
function Yis_file_remote($url, $referer='', $accept='*/*', $contenttype='application/x-www-form-urlencoded', $cachecontrol='private', $pragma='no-cache', $connection='close') {

  $fp = Ysockopen($url, $referer, $accept, $contenttype, $cachecontrol, $pragma, $connection);
  if (!empty($fp)) {

    $text = '';
    $check_header = 0;
    while (!feof($fp)){

      $temp = fgets($fp, 1024);

      if ($check_header == 0){

        if(preg_match("|^HTTP/[^\s]*\s(.*?)\s|",$temp, $status)){

          $check_header = trim($status[1]);
          break;
        }
      } 
    }

    Ysockclose($fp);

    if ($check_header == 200) return true;
    else return false;
  }
  else {

    return false;
  }
}

$url = 'http://8bong.com/Limages/logo.gif';
$refer = 'http://8bong.com';
if (Yis_file_remote($url, $referer)) {

  echo "$url 파일이 존재합니다.";
}
else {

  echo "$url 파일이 존재하지 않습니다.";
}

?>
친절하고 상세한 답변 주셔서 감사합니다.^^
두번째 문제는 제가 유창화님의 외부이미지 썸네일 생성엔진을 스크롤링 되는 최신글에 적용하면서 한페이지에 두 스킨이 놓이게 되면 아래 에러가 발생하기에 취해본 내용입니다.
Fatal error: Cannot redeclare yget_microtime() (previously declared in /home/tx/g4/skin/latest/latest_link_scroll/Yfunction.php:9) in /home/tx/g4/skin/board/basic_link_thumb/Yfunction.php on line 7
Yfunction.php 파일은 공히 같은 파일로 해당 라인은 아래와 같습니다.
//현재 마이크로타임 측정함수
function Yget_microtime(){ //7행

  list($usec, $sec) = explode(' ', microtime()); //9행
  return ((float)$usec + (float)$sec);
}

첫번째 답변과 더불어 공부해보고 차후 보고드리겠습니다.
거듭 감사드립니다~~*
저건 이미 아시겠지만

같은 함수이름의 함수가 두번정의될때 나는 에러인데요

이런에러를 줄일수 있는 가장좋은 방법은

같은 이름의 함수를 파일여기 저기에 정의하지 말고

특정 라이브러리 파일로 만들어

include_once를 이용하여 인클루드 시켜서 사용하는것이

가장 좋습니다.
강좌를 읽으실때
한글파일 다운로드 받아서 보시는게 좋습니다.

박스도 쳐놓고 보기 좋게 되어있는데
이게시판은 에디터모드가 사용안함으로 되어있어서
저렇게 밖에 안나오네요
전체 64
개발자팁 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT