2010-04-09 5 views
11

모든 메서드에서 사용할 수있는 PHP 클래스의 문자열 변수가 필요합니다.여러 줄에 걸친 PHP 클래스 상수 문자열 변수

그러나이 변수는 꽤 길기 때문에 여러 줄로 구분하고 싶습니다. 예를 들어

,

$variable = "line 1" . 
      "line 2" . 
      "line 3"; 

그러나 위가 작동하지 않습니다.

EOD를 시도했지만 수업 중에 EOD를 사용할 수 없습니다. 클래스 외부에서 선언하면 클래스 내에서 변수에 액세스 할 수 없습니다.

가장 좋은 방법은 무엇입니까?

+1

본인은 위의 작동하지 않습니다 어떤 이유가 표시되지 않습니다. 코드를 정확하게 게시 할 수 있습니까? 감사. –

+0

변수를 여러 줄로 확장 할 수 있으며 코드를 게시하고 작동하지 않는 방법을 정확히 기재 할 수 있습니까? –

+0

그런데'global' 키워드 나'$ GLOBALS' 슈퍼 전역 배열을 사용하여 클래스 외부의 변수에 접근 할 수 있습니다. 나는 이것을 권장하지 않는다. – Zarel

답변

10

당신이 PHP> = 5.3를 사용하는 경우, 당신은 당신의 문자열 선언 HEREDOC syntax을 사용할 수

class MyClass { 
    public $str = <<<STR 
this is 
a long 
string 
STR; 

} 

$a = new MyClass(); 
var_dump($a->str); 

을하지만이 :

  • 은 PHP> = 5.3
  • 으로 만 가능합니다
  • 문자열에 변수가 없어야합니다.
    • 이것은 문자열의 값이 컴파일시에 알려 져야하기 때문입니다.
    • btw는 연결이 . 인 이유가 작동하지 않는 이유를 설명합니다. 실행시 완료됩니다. 수도, 여부, 나쁜 일이 될 수있는 -

는 그리고 또 다른 단점은이 문자열에 줄 바꿈을 넣어 것입니다.


PHP < = 5 인 경우.2 :

당신은 그렇게 할 수 없습니다. 해결책은 클래스의 문자열을 초기화 할 수있는 '생성자 :

class MyClass { 
    public $str; 
    public function __construct() { 
     $this->str = <<<STR 
this is 
a long 
string 
STR; 
    } 
} 

(안 줄 바꿈과 동일) 여기

또는, 당신이 할 수있는 문자열 회씩 연결 :

class MyClass { 
    public $str; 
    public function __construct() { 
     $this->str = 'this is' . 
        'a long' . 
        'string'; 
    } 
} 

(이쪽, 줄 바꿈 없음)


그 밖에, 당신은 하나 또는 작은 따옴표로 둘러싸여 문자열을 가지고 있고, 여러 줄에 넣어 수 있습니다

class MyClass { 
    public $str = "this is 
a long 
string"; 
} 

(여기서 다시, 당신은 결과 문자열에서 줄 바꿈을해야합니다)

출력
+1

_this는 문자열 값이 컴파일시 _에 틀림 없기 때문에 틀린 것입니다. - 틀린 것입니다. – user187291

+0

@stereofrog http://fr2.php.net/manual/en/language.oop5.properties.php *이 선언은 초기화를 포함 할 수있다라고하지만,이 초기화는 상수 값이어야합니다 - 즉, 그것은 할 수 있어야합니다 컴파일 타임에 평가할 * * -이게 정말 틀린거야? –

+0

예, 설명서가 잘못되었습니다. – user187291

2
$var = "this is a really long variable and I'd rather have it " . 
"span over multiple lines for readability sake. God it's so hot in here " . 
"can someone turn on the A/C?"; 
echo $var; 

는 :

이 정말로 긴 변수이고 나는 오히려 가독성을 위해서 여러 줄 이상에 걸쳐있는 것입니다. 하느님. 그것은 매우 뜨겁습니다. 누군가 A/C를 켤 수 있습니까?

이제는 string concatenation operator을 사용하여 작동합니다. 문제에 관한 자세한 정보를 게시 할 수 있다면 의 코드 또는 자세한 설명은에 해당하지 않습니다. 더 많은 정보는 당신을 더 나은 대답으로 이끌 것입니다.

+1

이것은 메소드 내부의 변수에서 작동합니다. 클래스 속성에서 작동할까요? * (I 질문이있어 무엇을 믿는에 대한) * –

+0

마틴 말했듯 안녕하세요, 저는 클래스의 변수 바깥 선언 한 다음 메서드 내에서 액세스하고 싶었다. $ var = "line1" "line2"; 은 함수 안에 선언하면 작동하지만 외부에서는 수행하지 않습니다. 그것은 심지어 나를시키지 않을 것입니다. – ericbae

+0

아, 시도하지 않았으므로 필요할 경우 다시 일할 때 테스트 해 볼 수 있습니다. 하지만 이미 해결책을 찾은 것 같습니다. –

0

PHP 5.5.9를 사용 중이며 class 상수와 관련된 문제 만 발생했습니다. 나는 상수로 다소 긴 문자열을 사용하고 싶지만 내가 원하지 않는 : 코드의

  • 정말 긴 줄
  • 줄 바꿈은
  • 재산 것은 변경 가능 휴식 지점에서 텍스트에 표시
  • 재산
  • 클래스

내가 여기 솔루션이 Laravel 5 발판에 많은 일을 뭔가 생각 밖에 액세스 할 수 없게하고 그들이 무엇을 유지하는 이유는 지금까지 나를 당황했다.

public static function getLongPropertyString() 
{ 
    return 'A a string that can be arbitrarily long and contain as ' . 
     'many breaks in the code as you want without line breaks ' . 
     'appearing in the resulting string.'; 
} 

이 방법은 불변 문자열을 제공합니다 그들이하는 일은 무엇인가 같다. getter를 사용하여 변수를 내부적으로 여전히 변경할 수 있기 때문에 protected/private 변수를 생성하여 엄격하게 얻지는 않습니다. 코드 또는 우선 적용 만 변경하면이 문자열을 변경할 수 있습니다. 또 다른 전문가는 클래스를 정적으로 만들면 클래스 당 하나의 "인스턴스"가 허용된다는 것입니다.

불행히도 코드가 Class::property이 아닌 Class::getProperty()이되었습니다. 또 다른 단점은 연결을 호출 할 때마다 연결이 수행되지만 사용 방법에 따라 비용이 일반적으로 무시할 수 있다는 것입니다.

PHP 컴파일러가 컴파일 시간에 이미 알려진 값에 대한 연결 연산을 컴파일 타임에 실행할 수 있고 결과가 대체됨을 인식 할 수 있다면 멋지다. .

+0

setter를 추가하지 않고 메소드를 변경하지 않으면 코드를 변경하지 않는 한 private 변수도 변경되지 않습니다. 그러나 메서드 _might_에서 문자열을 반환하면 수행중인 작업에 대한 명확한 의도를 얻을 수 있습니다. –

+0

동의합니다. 방금 메서드를 재정의하거나 텍스트를 변경하지 않고 문자열을 변경하는 암시 적 방법이 없으므로이 양식을 제안했습니다. 즉 문자열을 변경하는 유일한 방법은 메서드를 재정의하거나 내부의 코드를 변경하는 것입니다. 이와 관련하여 _closer_는 의도하지 않은 수정 방법을 제거했기 때문에 변경 될 수 없습니다. – jeteon