R's Hacking Daily Log

php 상수 다루기 본문

PHP

php 상수 다루기

hanhxx 2023. 6. 30. 11:57

Step 1 :: 상수 

이번에 알아볼 상수는 변수지만 변수가 아니다(?)

변수와 동일하게 어떤 값을 저장하는 역할로 쓰이지만 값을 한 번 지정한 순간부터 그 값을 수정할 수 없다.

 

변수를 선언하는 방법은 크게 두 가지가 있는 데, 첫 번째로 살펴볼 방법은 define 함수를 사용하는 것이다.

사용법은 간단하게 define 함수에 상수명 & 값을 넣으면 된다.

 

<?php
define('CONSTANT', 'hello<br/>');

function sayName() {
    define('MYNAME', 'i am banana');
}

sayName();

echo CONSTANT;
echo MYNAME;

위의 코드에서는 총 2개의 상수가 만들어진 것을 볼 수 있다.

 

두 번째 줄에서 CONSTANT라는 이름의 "hello" 값을 갖는 상수와 sayName 함수 내부에서 만들어지는

MYNAME이라는 이름의 "i am banana" 값을 갖는 상수이다. 

 

echo 함수를 사용해 상수 값을 출력해 보면 'hello' & 'i am banana' 문자열을 볼 수 있다.

 

 

두 번째 방법으로는 const를 사용하는 것이다. 

<?php
const CONSTANT = "HELLO<br/>";

function msg() {
    #const MESSAGE;
}

msg();

class MyClass {
    public const MESSAGE = 'I am apple';

    public static function foo() {
        #const BYE;
    }
}

echo CONSTANT;
echo MyClass::MESSAGE;

const로 상수를 만들기 위해서는 상수명 앞에 const keyword를 붙이면 된다.

위의 코드에서는 CONSTANT & MESSAGE라는 두 개의 상수를 만들고 있다.

 

 

코드가 실행되면 msg 함수, CONSTANT 출력, MyClass::MESSAGE 출력 순으로 진행된다.

msg 함수는 내용이 주석 처리되었기 때문에 아무런 동작도 하지 않는다.

const.php 결과에서 볼 수 있듯이 정상적으로 'HELLO' & 'I am apple' 문자열이 출력되었다.

 

여기서 의문이 들 수 있는 게 "msg 함수와 MyClass의 foo 함수 내용은 왜 주석처리 되어있을까"이다.

주석을 풀고 코드를 실행해보면 아래와 같은 결과가 출력된다.

 

define 함수를 사용해서 상수를 만드는 방법과는 달리 const는 함수 내부에서 사용할 수 없다.

그렇다 보니 함수 & 클래스 내의 메서드에서 const를 사용한 경우에는 에러가 나는 것이다. 

 

 


Step 2 :: 매직 상수 

메직 상수는 메타 정보를 갖는 상수를 의미한다.

 

메타 정보란 데이터에 대한 데이터라고 표현할 수 있는 데 함수와 변수를 갖는 클래스가 있다고 할 때,

클래스가 갖는 함수명이 어떻게 되는지, 클래스 명은 무엇인지와 같이 

클래스 그 자체에 대한 정보메타 정보라고 생각하면 된다. 

 

 

매직 상수의 한 가지 특징이라면 이름에 " __ "가 붙는 다는 것이다.

php code를 작성하는 tool에 " __ "를 입력해보면 아래와 같이 매직 상수에 어떤 것들이 있는지 확인해 볼 수 있다.

 

 

매직 상수를 이용한 예시를 살펴보자.

<?php
class A {
	public function __construct()
	{
		echo __CLASS__;
	}

	public function sayHello() {
		return __METHOD__;
	}
}

$say = new A();
echo $say->sayHello();

코드의 전체 흐름은 [1]클래스 A를 만들고 [2]say라는 인스턴스 변수를 생성해 [3]sayHello 함수를 실행하는 것이다.

클래스 A에는 __construct 생성자와 sayHello 함수가 만들어져 있다. 

 

(1) __construct 생성자는 __CLASS__ 값을 출력하는 역할이고 

(2) sayHello 함수에서는 __METHOD__ 값을 반환한다. 

 

(1) = A & (2) = A::sayHello의 결과가 예측대로 출력된 것을 확인할 수 있다!

 

 

 


(+) 개념 & 코드 설명

상수는 보통 대문자로 이름을 지정한다는 것을 Step 1 & 2에서 눈치챌 수 있을 것이다. 

또한 상수는 프로그램 어디에서나 사용하기 위한 역할로 전역 범위를 갖는 다고 할 수 있다.

 

[ const.php code ]

<?php
const CONSTANT = "HELLO<br/>";
...
}

echo CONSTANT;
echo MyClass::MESSAGE;
echo MESSAGE;  #추가된 코드

MESSAGE 상수를 출력하기 위해 사용한 MyClass::MESSAGE는 

MyClass의 속성인 MESSAGE 값을 가리키는 형태로 

 

클래스에서 선언된 상수를 마지막 줄처럼 상수명만 작성하면 에러가 발생하게 된다.

 

 

 

[ magic_constant.php code ]

<?php
class A {
	public function __construct()
	{
		echo __CLASS__;
	}

	public function sayHello() {
		return __METHOD__;
	}
}

$say = new A();
echo $say->sayHello();

class keyword를 이용해 클래스를 만들고 나면 new keyword로 인스턴스를 생성할 수 있고

인스턴스가 갖는 함수는 인스턴스명->함수명 형태로 호출할 수 있다. 

 

따라서 마지막 줄의 의미는 "say 인스턴스의 sayHello함수를 실행한 결과를 출력하라"는 것이다. 

'PHP' 카테고리의 다른 글

php 연산자 다루기 (2)  (0) 2023.07.02
php 연산자 다루기 (1)  (1) 2023.07.01
php 데이터 타입  (0) 2023.06.30
php 변수 다루기 (2)  (0) 2023.06.29
php 변수 다루기 (1)  (0) 2023.06.29
Comments