본문 바로가기

코딩공부/WEB2 - PHP

[14] PHP 파일로 모듈화 - require

리팩토링 - 내부적인 코드를 유지 보수하기 편하게 중복된 코드를 제거하고 개선하는 작업

 

  • require() - 다른 파일에 정의되어있는 코드가 필요할 때, 해당 파일이 필요하다고 알려준다.
  • require_once() - 한 번 require된 코드는 무시하고 넘어간다.

 

코드의 문제점 살피기

1. 코드 중복 - 재사용 코드

index.php 와 create.php 에 함수를 정의하는 부분이 중복

print_title()함수에 개선사항을 추가하면?

다 수개의 페이지에서 print_title()함수를 수정해야 하는 번거로움이 생기고, 놓치기 쉽다.

좋은 코드를 만드는 아주 쉬운 실천 방법 - "중복을 제거", 정리정돈

 

 

 

프로그래밍에서 재상요할만한 코드나 로직을 잘 정리 정돈해놓은 것 - 라이브러리(lib)

* 도서관(라이브러리) - 책을 꺼내 보기 쉽도록 잘 정리정돈한 곳

lib 디렉토리애 재사용할 가능성이 있는 것들을 잘 정리 정돈하여 저장한다.

 

1. lib디렉토리 생성 후, print.php에 print 함수들 정의 구현 부분을 저장

2. 기존에 print_xx() 함수구현 부분을 삭제 후, require 코드 추가

이 코드는 "lib안에 있는 print.php 라는 파일에 있는 코드들을 필요로 한다.(require) " 고 알려줘야한다.

index.php, create.php, update.php 파일 모두 수정

<?php
  require('./lib/print.php');
 ?>

 

 

2. 코드 중복 - view 코드

라이브러리는 "재사용"이 가능한 코드를 모아두는 곳이다. 보여지는 것과 관련된 코드는 보통 라이브러리라고 한다기보다는 별도의 폴더로 저장한다.

모든 페이지를 통합적으로 관리할 수 있는 장점이 생긴다.

 

1. view 디렉토리 생성 - 화면을 구성하는 view 관련 코드들을 저장한다.

2. 모든 페이지에 마지막은 </body></html> 로 끝난다. 이 부분을 bottom.php 파일로 저장

3. 기존  </body></html> 태그를 삭제 후, require 코드 추가

 

 

 

 

1. 모든 페이지에 상단에 중복된 코드를 제거 후, top.php 파일로 저장

2. 기존 코드 위치에 require 코드 추가

 

 

이상적인 코드는 아니다. index.php에서 호출하는 print_title() 이라는 함수는 ./lib/print.php 라는 파일에 존재한다는 것을 알 수 있지만, top.php 코드에서 print_title()함수를 호출하고 있음에도 어디서 왔는지 알 수 없다. 따라서 "인과관계가 항상 드러나야 할 필요가 있다."

 

 

 

따라서 top.php 파일의 상단에도 require로 ./lib/print.php 코드를 추가해주면, top.php 파일만 봤을 때 print_title()함수가 print.php 에서 왔다는 것을 한눈에 알 수 있다.

=> "코드가 분명해지고 암시적이지 않게 된다."

 

▶ 이렇게 수정했을 때 error가 발생한다.

"중복해서 선언되었다."

 

 

 

index.php 코드에서 print.php 를 require 하면 print.php에서 print_title() 함수를 정의하고 있다. 그런데 index.php 에서 top.php를 require 하고, top.php에서 다시 print.php를 require 하면, print.php 에서 print_title() 함수를 정의하려고 하는데, 이미 한번 정의가 되어있기 때문에 "재정의 할 수 없다"는 오류 메시지가 뜨는 것이다.

PHP에서는 한 번 만들어진 함수는 다시 재정의할 수 없도록 되어있다.

 

 

 

이러한 에러를 방지하기 위한 함수 "require_once()" 가 있다.

index.php에서 print.php를 require 하고, top.php를 require 한다. top.php에서 print.php를 require 하려고 하면 php가 이미 한번 require 했기 때문에 이 코드를 무시하고 넘어간다.

 

 

 

중복해서 print.php가 호출되는 것을 방지하기 때문에, 에러가 발생하지 않는다.

 

 

 

 

 

 

 

 

 

 

 

'코딩공부 > WEB2 - PHP' 카테고리의 다른 글

[15] PHP 보안  (0) 2019.09.27
[13] PHP 글 삭제 기능 구현  (0) 2019.09.26
[12] PHP 글 수정 기능 구현  (1) 2019.09.26
[11] PHP 글 생성 기능 구현  (0) 2019.09.26
[10] PHP에서 FROM과 GET, POST  (0) 2019.09.26