2010-05-07 6 views
43

은 당신이 서로를 사용하여 문자열 연결의 측면에서 전역 상수를 만들 수 있다는 사실을 알고 :나는 PHP에서 클래스 CONST를 정의하는 문자열 연결을 사용할 수 있습니까?

define('FOO', 'foo'); 
define('BAR', FOO.'bar'); 
echo BAR; 

이 '는 foobar'를 인쇄합니다.

그러나, 나는 같은 사용하는 클래스 상수를 할 때 오류가납니다.

class foobar { 
    const foo = 'foo'; 
    const foo2 = self::foo; 
    const bar = self::foo.'bar'; 
} 

에서는 foo2는 문제없이 정의되어 있지만, 선언 const를 줄이 나는 또한 sprintf와 같은 기능을 사용하려고했습니다

Parse error: syntax error, unexpected '.', expecting ',' or ';'

을 오류가 발생하지()하지만 더 이상 왼쪽의 괄호를 좋아하지 않는다 캐릭터 라인 연결자 '.'

그래서에서는 foo2 같은 사소한 설정의 경우보다 더 많은 것을 서로의 관점에서 클래스 상수를 만들 수있는 방법은 무엇입니까?

답변

15

IMHO,이 질문은 감사 PHP 5.6 이후는 상수에 대한 정적 스칼라 표현식을 정의 할 수 있습니다 comment

@jammin하는 에 대한 답변 PHP 5.6+을받을 권리 :

문제의 일부는 아니지만 구현의 한계를 알아야합니다.다음은 정적 컨텐츠가 있지만, 작동하지 않습니다 (하지만 런타임에 조작 할 수 있음) : 나는에 대한 이론적 근거를 이해하지 못하는 https://wiki.php.net/rfc/const_scalar_exprshttp://php.net/manual/en/language.oop5.constants.php

0

없음.

(내가 거기에 생각하지 않습니다)

14

항상 이런 것들에 대해 다시 믿을 설명서 가을. constants에 관한

:

The value must be a constant expression, not (for example) a variable, a property, a result of a mathematical operation, or a function call.

그래서 ... "더"해답이 될 것이다 : 클래스 상수를 들어 D

2

것은, 당신이 상수 표현 이외 할당 할 수 없습니다. 없습니다 PHP manual 인용 :

. "값 것은 일정한 표현하지 있어야 변수, 특성, 수학적 연산의 결과 또는 함수 호출 (예를 들어)"

34

유일한 방법이다() 식을 정의한 다음

define('foobar', 'foo' . 'bar'); 

class Foo 
{ 
    const blah = foobar; 
} 

echo Foo::blah; 

또 다른 옵션은 bugs.php.net 친절이 문제를 해결하도록 요청 이동하는 것입니다 클래스에서이 상수를 사용합니다.

+0

: 자세한 정보를 살펴

class Foo { public static $bar = "baz"; const HAZ = self::$bar . " boo\n"; } // PHP Parse error: syntax error, unexpected '$bar' (T_VARIABLE), expecting identifier (T_STRING) or class (T_CLASS) class Foo { public static function bar() { return "baz";} const HAZ = self::bar() . " boo\n"; } // PHP Parse error: syntax error, unexpected '(', expecting ',' or ';' 

들어 전역 상수와 클래스 상수 간의 다른 setter 동작. 나는 곧 bugs.php.net을 방문 할 것이라고 생각한다. :) 그러나 단기적으로 나는 상수를 클래스에서 옮긴 다음 클래스로 복사 할 것이다. 그래서 kludgy! – selfsimilar

+8

bug.php.net은 기본적으로 수정하지 않을 것이라고 말했습니다. "이것은 구현의 한계입니다. 클래스 상수의 경우 컴파일 타임에 상수 값이 필요하고 표현식을 평가할 수 없습니다 .define()은 런타임에 평가되는 정규 함수이므로 모든 형식의 값을 포함 할 수 있습니다 이렇게 변경하면 컴파일러에 실행 단계가 추가됩니다. " 다음 코드가 작동하므로 실제로 BS입니다. define ('BAR', ThisWorks :: foo. 'bar'); 클래스 ThisWorks { const foo = 'foo'; const bar = BAR; } echo ThisWorks :: bar; 그러면 'foobar'가 오류없이 출력됩니다. – selfsimilar

+2

다른 사람이 찾고있는 경우 버그는 [# 42355] (https://bugs.php.net/bug.php?id=42355)입니다. –

1

이 직접 당신이 찾고있는 무엇을하지 않을 수 있습니다,하지만 난 그래서 여기,이 스레드를 건너 왔어요 나는 내가 가진 된 문제에 사용되는 솔루션입니다 (@ user187291의 대답 오프 기준) :

define('app_path', __DIR__ . '/../../'); 
const APPLICATION_PATH = app_path; 
. 
. 
. 
require_once(APPLICATION_PATH . "some_directory/some_file.php"); 
. 
. 
. 

큰 작동하는 것 같다!

관련 문제