2008-10-29 4 views
7

최근에는 상수에 정수 값을 할당하고 그 목적을 식별하는 수단으로 상수 이름을 사용하는 습관을 가졌습니다. 그러나 어떤 경우에는 문자열 표현이 필요할 때 typeToString ($ const)과 같은 함수를 작성할 필요가 있습니다. 분명히 이것은 비효율적이고 불필요한 것이지만, 때때로 문제 일뿐입니다.PHP 상수 : 장점/단점

제 질문은 고려해야 할 다른 단점이 있습니까? 어떤 경우가보다 깔끔하고 표준에 부합되는 것으로 간주됩니까? 또한 대부분의 경우 성능 차이가 무시 될 수 있습니까?

사례 1 : (빠른 문자열 버전이 필요하지?)

class Foo { 
    const USER_TYPE_ADMIN = 0; 
    const USER_TYPE_USER = 1; 
    const USER_TYPE_GUEST = 2; 

    public $userType = self::USER_TYPE_ADMIN; 

    public function __construct($type) { 
     $this->userType = $type; 
    } 

    public function typeToString() { 
     switch($this->userType) { 
      case self::USER_TYPE_ADMIN: 
       return 'admin'; 
       break; 

      case self::USER_TYPE_USER: 
       return 'user'; 
       break; 

      case self::USER_TYPE_GUEST: 
       return 'guest'; 
       break; 

      default: 
       return 'unknown'; 
       break; 
     } 
    } 
} 

$foo = new Foo(Foo::USER_TYPE_GUEST); 
echo $foo->typeToString(); 
// Displays "guest" 

사례 2 : (빠르게/쉽게 문자열 버전이 필요)

class Foo { 
    const USER_TYPE_ADMIN = 'admin'; 
    const USER_TYPE_USER = 'user'; 
    const USER_TYPE_GUEST = 'guest'; 

    public $userType = self::USER_TYPE_ADMIN; 

    public function __construct($type) { 
     $this->userType = $type; 
    } 
} 

$foo = new Foo(Foo::USER_TYPE_GUEST); 
echo $foo->userType(); 
// Displays "guest" 
+0

혼란 스러워요 - 케이스 2에서 0, 1, 2를 "admin", "user", "guest"로 변경 하시겠습니까? – Greg

+0

그래, 나는 확실히했다! :-) 잡아 주셔서 감사합니다. 지금 업데이트해야합니다. – Wilco

답변

8

많은 것을 저장하지 않으면 성능 차이가 미미합니다. 좀 더 간결하게 toString() 방법을 써서 :

$strings = array 
(
    self::USER_TYPE_ADMIN => 'admin', 
    self::USER_TYPE_USER => 'user', 
); 

if (!isset($strings[$type])) 
    return 'unknown'; 

return $strings[$type]; 

또한, 당신은 $strings 배열 static 만들 수 있습니다.

0

const 정수를 사용하는 대신 문자열을 인쇄해야하는 경우 일반적으로 문자열을 사용합니다. 그래서 나는 $foo = new Foo('guest');과 같은 것을 할 것입니다. 나는 여전히 생성자의 입력을 검증 할 수 있으며 필요할 때마다이를 표시 할 수 있습니다.

+0

이것은 내가하는 일이기도하지만 OP는보다 엄격한 배경에서 나온 것 같습니다 ...어쩌면 ex C++ 또는 Java 프로그래머 일 수도 있습니다 : p – Greg

+0

저는 현재 C++ 개발자이고 일반적으로 문자열을 사용합니다. –

4

솔직히 말해서, 상수를 네이티브 문자열로 정의 할 때 어떤 종류의 성능이든 "나"모르겠다.하지만 그 중 하나가 있다면 그걸로 내기를 할 의향이있다. 작 으면 측정하기 어려울 것입니다.

개인적으로 상수의 값이 리터럴로 의미가있는 경우 해당 값을 할당하십시오. 상수의 값이 옵션 선택기 (또는 다른 표시 값 표시)로만 의미가있는 경우 정수 또는 적절한 것을 선택하십시오.

+0

문자열 비교는 정수 비교보다 비용이 많이 듭니다. –

+2

그러나 10 개의 문자열 비교와 10 개의 정수 비교의 차이는 매우 작기 때문에 코딩을 쉽게하면 문자열을 사용하는 것이 더 낫습니다. – Greg

+2

문자열을 사용하여 각 요청에서 밀리 초 단위로 밀리 초 단위로 면도합니다. 사전 최적화에 대한 정보. –

1

이 경우 문자열 상수가 최선의 선택이라고 생각합니다. 코드가 더 좋아 보인다.

물론 마지막 성능 비트가 필요한 경우 정수를 사용하십시오. 그러나 프로파일 러를 사용하여 문자열 비교가 병목 현상임을 확인한 후에 만 ​​가능합니다. 어쨌든 대부분의 응용 프로그램에는 데이터베이스 액세스 등과 같이 훨씬 비싼 것이 많이 있습니다.

-3

예제에서 작성한 모든 메서드를 삭제하고 클래스를 정적으로 만들면 자신을 열거 자로 만들 수 있습니다. 이와 같이 :

 
class Enumeration{ 
    public static const One=1; 
    public static const Two=2; 
    public static const Three=3; 
} 

상수를 사용하는 다른 편리한 방법 중 하나는이를 응용 프로그램 구성으로 사용하는 것입니다. 그것들은 구성을 위해 xml 파일을 구문 분석하는 것보다 훨씬 빠른 성능을 제공합니다.

+1

Nikola, php는 상수에 대해 "public static"키워드를 허용하지 않습니다. 코드가 구문 오류를 생성합니다. –