문제

최근에 나는 정수 값을 상수에 할당하고 단순히 그 목적을 식별하는 수단으로 상수 이름을 사용하는 습관을 들였습니다.그러나 어떤 경우에는 문자열 표현이 필요할 때 typeToString($const)과 같은 함수를 작성해야 하는 경우도 있습니다.분명히 이것은 비효율적이고 불필요하지만 가끔씩만 문제가 됩니다.

그래서 제 질문은 제가 고려해야 할 다른 절충안이 있습니까?입니다.어떤 경우가 더 깨끗하고 표준을 더 잘 준수하는 것으로 간주됩니까?또한 대부분의 경우 성능 차이가 무시할 수 있습니까?

사례 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"
도움이 되었습니까?

해결책

성능 차이는 많은 것을 저장하지 않는 한 무시할 수 있습니다. 나는 쓸 것이다 toString() 더 간결하게 방법 :

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

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

return $strings[$type];

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

다른 팁

솔직히 말해서, 나는 당신의 상수를 기본적으로 현으로 정의 할 때 어떤 종류의 공연 "히트"가 있는지 모르겠습니다. 측정하기 어렵습니다.

개인적으로, 상수의 가치가 문자 그대로 의미가 있다면, 그 값을 할당하십시오. 상수의 가치가 옵션 선택기 (또는 다른 사람 표시 가치), 그 다음 정수 또는 적절한 선택을 사용하십시오.

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

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

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

당신이 쓴 예에서 당신은 모든 방법을 삭제하고 클래스를 정적으로 만들 수 있으며 자신을 열거 자로 만들었을 것입니다. 이와 같이:

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

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top