[PHP] function과 class 사용법, 접근제한자 그리고 static


Study/PHP  2019. 9. 6. 22:22

안녕하세요. 명월입니다.


이 글은 PHP에서 function과 class 사용법, 그리고 접근제한자에 대한 글입니다.


PHP에서는 스크립트 언어이기 때문에 javascript처럼 function과 class를 선언하지 않아도 PHP페이지를 만들 수 있습니다.

그러나 최근 웹 프로그램은 데이터 베이스의 값을 그대로 내보내는 것보다 복잡한 계산과 여러 데이터를 종합적으로 보여주는 포탈 프로그램 형식이 많기 때문에 상당히 복잡하게 작성됩니다.

그때 단순히 데이터베이스 혹은 파일등에서 계산해서 보여주게 되면 프로그램이 상당히 복잡해 지고 무엇보다 재사용성이 매우 떨어질 것입니다.


그래서 function(함수)나 class 형식의 구조가 필요합니다.

먼저 function의 구조는 Java와 C#과 다르게 따로 반환 자료형이 없습니다. 처음부터 php는 변수 선언할 때도 자료형을 선언하지 않기 때문에 function 구조에서도 반환 자료형이 없습니다.

이는 javascrpt와 비슷한 구조를 가져가네요.

<?php
  $title = "title";

  // 함수는 function으로 시작되고 따로 반환 자료형은 설정하지 않습니다.
  function sum($a, $b) {
    return $a + $b;
  }
  
  // 함수를 사용해서 결과는 3이 나오겠네요.
  $data = sum(1,2);    
?>
<!DOCTYPE html>
<html>
<head>
<title>
    <?=$title?>
  </title>
</head>
<body>
  <?=$data?>
</body>
</html>

class의 구조는 일반 OOP프로그램처럼 맴버 변수가 존재하고 함수가 존재하는 구성으로 되어있습니다.

<?php
  $title = "title";
    
  class Test {
    // 맴버변수 (접근 제한자가 필수)
    private $data;
    // 생성자 (클래스 이름과 동일한 함수가 아니고 이름이 정해져 있다.)
    function __construct() {
      //맴버 변수 접근 (반드시 $this가 필요하다. $data로 하게 되면 내무 지역변수로 선언이 되어버린다.)
      $this->data = "init";
    }
    // 함수
    public function setData($value) {
      //지역변수 선언!!
      $data = $value;
    }
    // 함수
    public function print(){
      echo $this->data;
    }
  }
  $obj = new Test();
  // 생성자의 파라미터가 없으면 ()는 생략이 가능하다.
  $obj1 = new Test;
  // 지역 변수에 넣었기 때문에 print()를 해도 값은 init으로 출력이 됩니다.!!
  $obj1->setData("hello world");
?>
<!DOCTYPE html>
<html>
<head>
<title>
    <?=$title?>
  </title>
</head>
<body>
  <?=$obj->print()?>
  <br />
  <?=$obj1->print()?>
</body>
</html>

여기서 맴버변수에 private라는 접근제한자가 사용되었습니다. 클래스 내부의 함수의 경우는 접근제한자가 필요가 없는데 맴버변수는 꼭 들어가 있어야 합니다.

접근 제한자는 private, protected, public이 있고 이는 다른언어와 마찬가지고 private는 외부접근 금지, protected는 내부와 상속된 클래스에서만 접근, public은 어떤 형태로도 접근이 가능한 형태입니다.

구분 접근자 설명
접근 권한 public 모든 클래스에서 접근이 가능함을 의미한다.
private 클래스 내에서만 접근이 가능하다
protected 클래스와 하위 클래스 관계의 클래스에 의해 접근이 가능하다.

링크 - [Java강좌 - 12] 접근제한자와 static

링크 - [C# 강좌 - 11] Static 과 접근 제한자


함수의 경우는 접근제한자가 필수는 아닙니다만, 클래스의 캡슐화를 제대로 활용하기 위해서는 접근제한자를 사용하는 편이 좋겠습니다.

클래스의 생성자는 클래스의 이름과 동일한 함수를 만드는 것이 아니고 __construct의 함수명으로 정의되어 있습니다.


그리고 함수 내에서 맴버변수를 접근하기 위해서는 반드시 $this가 필수있고 $this->맴버 변수명으로 접근하면 됩니다.

이유는 PHP에서는 따로 변수선언법이 없기 떄문에 $변수명으로 사용하게 되면 지역 변수로 값이 들어가게 됩니다. 저도 가끔 깜빡하는 부분이긴 하지만 작성시에 꼭 이걸 확인해야 합니다.


클래스를 선언할 때는 생성자의 파라미터가 없을때는 ()가 생략이 가능합니다. 하지만 소스의 가독성을 위해서는 반드시 작성하는 것이 좋겠군요.

php에서도 클래스는 new를 통해 객체 생성합니다. 여기까지는 OOP와 비슷한 구조이네요.. 그러나 내부적으로는 실제 OOP와 동작 방식은 다릅니다만, 이런 구현형태가 비슷하니 접근하기 쉽겠네요.

이런 클래스를 할당식이 아닌 정적으로로 선언 가능합니다.

<?php
  $title = "title";
  class Test {
    private static $data;
    
    public static function setData($value) {
      // 할당 맴버변수가 아니기 때문에 static으로 접근한다.
      Test::$data = $value;
    }
    public static function print(){
      echo Test::$data;
    }
  }
  // static은 new로 할당해서 접근하는 것이 아니기 때문에 「클래스명::함수명」으로 접근한다.
  Test::setData("hello world");
?>
<!DOCTYPE html>
<html>
<head>
  <title>
    <?=$title?>
  </title>
</head>
<body>
  <?=Test::print()?>
</body>
</html>

위 소스를 보면 static도 parent와 비슷한 구조로 접근합니다. 「클래스명::변수명」 혹은 「클래스명::함수명」으로 접근하네요.

여기서 특이 사항은 외부에서는 $data가 접근이 안됩니다. 왜냐하면 접근제한자가 private이기 때문입니다. static이라도 접근은 클래스 안에서만 가능합니다.


여기까지 PHP에서 function과 class 사용법, 그리고 접근제한자에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.