PHP

함수와 객체의 비교

수업소개

객체를 만들기 전에 객체를 사용하는 것은 먼저입니다. 사용자가 되서 객체가 무엇인가에 대해서 충분히 느낀 후에 객체를 만드는 것이 더 좋은 접근이라고 생각합니다. 이 수업에서는 PHP를 통해서 파일을 다루는 두가지 방법을 살펴봅니다. 하나는 함수를 이용하는 것이고, 다른 하나는 객체를 사용하는 것입니다. 객체를 도입했을 때 어떤 좋은 효과가 생기는지를 느껴보는 시간이 되시길 바랍니다. 

수업

함수 방식

객체 방식 

 

함수와 객체의 비교 

 

소스코드

<h1>Function</h1>
<?php
var_dump(is_file('data.txt'));
var_dump(is_dir('data.txt'));
var_dump(file_get_contents('data.txt'));
file_put_contents('data.txt', rand(1,100));
?>
<h1>Object</h1>
<?php
$file = new SplFileObject('data.txt');
var_dump($file->isFile());
var_dump($file->isDir());
var_dump($file->fread($file->getSize()));
$file->fwrite(rand(1,100));

$file2 = new SplFileObject('data2.txt');
var_dump($file2->isFile());
var_dump($file2->isDir());
var_dump($file2->fread($file2->getSize()));
$file2->fwrite(rand(1,100));

// SplFileObject : Class
// $file, $file2 : Instance
// isFile, isDir, fread : Method(function)
// data.txt, data2.txt : state
?>

 

댓글

댓글 본문
작성자
비밀번호
  1. 훈댕
    함수와 객체 3번 영상 4분27초 쯤 file 파일을 동시에 file2로 바꾸는 단축키를 알고싶습니다.
  2. 와이에스
    1. fread()후에는 파일내에서 point가 끝으로 가 있어서 두번째 부터는 fread()가 안되는것 같습니다.
    다시 fread()하기 전에 point를 다시 처음으로 돌려주는 "rewind()"함수를 써주면 되는 것 같은데요.

    2. new SplFileObject('data1.txt', 'r+')처럼 두번째 인자로 'r+'을 넣어줘야 '읽기쓰기'로 파일을 오픈하는 것 같습니다. 생략하면 'r'로 인식하여 '읽기'로 파일이 오픈되는 것 같네요.

    참고하세요
  3. rand와 같은 난수를 반환하는 함수의 경우
    주로 특정 설정값을 바탕으로 새로운 난수값을 반환합니다.
    난수 알고리즘은 여러 알고리즘이 존재합니다.
    php프로그램을 실행할 때마다 반환되는 난수값이
    계속 바뀌는 것으로 보아 컴퓨터의 시간을 바탕으로하는
    난수 알고리즘을 사용하는 것 같습니다.

    위 코드의 경우, 먼저 5번째 줄에서 data.txt의 내용을 읽습니다.
    그 다음 6줄에서 난수값을 data.txt에 쓰는 것입니다.
    그리고 이 내용을 13줄에서 읽습니다. 마지막으로 14줄에서
    다시 새로운 난수값을 data.txt에 적습니다.
    마지막으로 새로 적힌 난수값이 다음 php프로그램이 실행될 때
    5번째 줄에서 읽히는 것 입니다. 이것이 규칙처럼 보이지만,
    사실은 똑같은 프로그램이 반복적으로 리로드되는 것일 뿐입니다.

    5번째 줄과 6번째 줄을 바꾸고, 13줄과 14줄을 바꾼 후 다시
    실행해보시면, 계속 같은 값이 반환되는 것을 알 수 있습니다.
    rand(1,100) 함수는 2번 호출되어야하지만 실제로는 1번만 호출되고
    똑같은 값을 반환한 것을 알 수 있습니다.
    이는 PHP코드를 해석하는 인터프리터단에서 1번만 호출했기 때문일 수도
    있고, FILE I/O를 줄이기 위해서 일 수도 있고, 메모리 접근 속도를 빠르게
    하기 위해 캐시메모리를 사용했기 때문일 수도 있습니다.
    대화보기
    • 웅이
      file_put_contents('data.txt', rand(1,100)); 의 값과 $file->fwrite(rand(1,100)); 의 값이 다를 수도 있다고 하셨는데,
      같은의미의 코드인데 값이 다르게 나오는 이유가 있나요?
      계속 리로드해보면 후자의 값이 다시 리로드했을때 전자의 값이 되는게 뭔가 규칙같은게 있는데 말이죠...
    • 봉봉봉
      꼭 필요했었던 내용이였는데
      오늘에서야 알게되어 많이 배우고
      또한 느낄 수 있어서 강의 내내 행복했습니다.
      정말 감사합니다.
      복 받으실 겁니다.
    • 청호
      fwrite 작동안할 때 해결 방법 : $file = new SplFileObject('파일.txt', 'rw+'); 로 바꾸면 해결됩니다. (읽기와 쓰기 권한)
    • Hyung Jun Choi
      댓글을 보니 offset과 관련한 문제인것 같네요 ㅎㅎ 한번 구글링해보세요 :)
    • sunday00
      ㅋㅋㅋㅋ 진행했다가 되돌아와서 적어둡니다. 아래의 경우는 아마도 txt 파일 내의 커서가 어디에 있는가에 의한 문제인것 같은데, 이 강의 '상속' 즈음 해서 다시 언급하십니다. 그래서, 그냥 진행하시면 될듯 합니다.
    • sunday00
      그러게요,,, fwrite는 작동을 하지 않고, 신기한게, fwrite 이후에 fread를 다시 호출하면, ''이 뜹니다. 파일을 열어보면 이전에 file_put_contents로 인한 값이 있음에도 값을 읽어오지 못하는군요...;;
    • 쿠반
      항상 양질의 강의 감사드립니다
      한가지 막히는 점이 있는데요/
      예제의 소스 코드가 오류는 안뜨지만
      $file->fwrite(rand(1,100));, $file2->fwrite(rand(1,100)); 이부분이 작동을 안하는거 같은데요.
      예제대로 하면 file_put_contents 때문에 data1.txt 의 값은 변하는데 data2.txt 안의 내용이 안변하네요
      file_put_contents('data.txt',rand(1,100)); 부분을 주석처리해보니 data1.txt, data2.txt 안의 내용이
      둘다 변하지 않는 것으로 보아 뭔가 잘못된거 같은데 잘 모르겠네요;;
      권한도 other한테 rwx 다 주었는데 ㅠㅠ..
    • junohera
      넘나 좋네요 ㅎㅎ
      야근하고 집와서 이거보고 기분좋아졌어요 !!
    • Leos
      PHP 에서 객체지향 수업 감사합니다.
    • adad
      개인적으로는 이 수업이랑 php의 객체지향프로그래밍 수업보다 파이썬 루비에 있는 객체지향 개념수업을 들으니 더 이해가 잘 됬어요! 어려우신 분들은 참고해보세요
    • 노마드
      모양은 Atom editor인것 같으네요,,
      대화보기
      • Shresol
        여기서 사용하는 개발도구는 무슨프로그램이신가요?
      • Frank
        고맙습니다~
      • egoing
        같은 의미가 맞습니다~ object access operator라고도 하죠~
        대화보기
        • 폭스킴
          PHP에서 ->가 Python & Ruby에서 . 하고 같은 의미의 문법인거죠?
          제가 초보기도 하고, PHP 수업을 너무 뜨문뜨문 봐서 못보고 지나친건가해서 질문드려요~
          PHP에서 .을 이미 사용하고 있어서 그런거 같은 추측을 하게 되는데,
          객체지향 프로그래밍 소개 동영상 후에 바로 모르는 문법이 나오니까 약간 당황하게 되네요~ ㅎ
          그리고, Python & Ruby 수업을 버리지 말아주세요 ㅜ_ㅜ
        • jiaa
          이고잉님!!!pdo수업도부탁드려요ㅠㅠㅠㅠㅠ!!!
        • 폭스킴
          맞춤형 수업을 듣게 되다니 저는 럭키가이입니다~!! 늘 빚진 마음입니다~ 감사합니다~ ^^
          대화보기
          • egoing
            ㅋㅋ 이거 하고 가셔야 좀 편하실꺼예요~
            대화보기
            • 폭스킴
              PHP 이틀 안으로 수업 완강하고 바로 코드이그나이터 수업 들어가려고 들떠 있었는데, 수업이 추가돼서 당황스럽네요 ㅎㅎ
            • egoing
              고맙습니다~
              대화보기
              • 구녹수수
                정말 듣고 싶었던 강의인데 이고잉 님이 강의해주셔서 정말 유용할 것 같습니다! 감사합니다 ㅎㅎ
              • egoing
                객체지향수업을 완성하고
                객체지향 이전 수업도 차차로 새롭게 리뉴얼하려고요
                대화보기
                • 구녹수수
                  이고잉님!!php강의를 다시 만드시는건가요? 아님 이어서 진행하시는 건가요?!
                  이어서 진행하신다면 예전에 만들어놓았던 강의를 그대로 이어서 공부하면 되는건가요?!!!
                버전 관리
                egoing
                현재 버전
                선택 버전
                graphittie 자세히 보기