2010-04-09 25 views
11

Tôi muốn có một biến chuỗi cho một lớp PHP, sẽ có sẵn cho tất cả các phương thức.Biến chuỗi liên tục lớp PHP trải rộng trên nhiều dòng

Tuy nhiên, biến này khá dài, vì vậy tôi muốn tách nó thành nhiều dòng.

Ví dụ,

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

Nhưng trên không hoạt động.

Tôi đã thử EOD, nhưng EOD không được phép trong lớp học. Và khi tôi tuyên bố nó bên ngoài lớp, tôi không thể truy cập biến từ bên trong lớp.

Cách tốt nhất là gì?

+1

Tôi không thấy bất kỳ lý do nào khiến những điều trên không hiệu quả. Bạn có thể đăng chính xác mã của mình không. Cảm ơn. –

+0

Bạn chắc chắn có thể mở rộng trên nhiều dòng, bạn có thể đăng mã và chính xác cách nó không hoạt động không? –

+0

Bạn có thể truy cập các biến bên ngoài lớp bằng cách sử dụng từ khóa 'global' hoặc' super GLloAL' superglobal array, nhân tiện. Tôi không khuyên bạn nên điều này, tất nhiên. – Zarel

Trả lời

10

Nếu bạn đang sử dụng PHP> = 5.3, bạn có thể sử dụng HEREDOC syntax để khai báo chuỗi của bạn:

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

} 

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

Nhưng điều này:

  • chỉ có thể với PHP> = 5.3
  • và chuỗi không được chứa bất kỳ biến nào
    • điều này là do giá trị của chuỗi phải được biết tại thời gian biên dịch
    • , btw, giải thích tại sao ghép nối với ., sẽ không hoạt động: giá trị được thực hiện tại thời điểm thực thi.

Và nhược điểm khác là điều này sẽ đưa dòng mới trong chuỗi - mà có thể, hay không, là một điều xấu.


Nếu bạn đang sử dụng PHP < = 5.2:

Bạn không thể làm điều đó; một giải pháp có thể để khởi tạo chuỗi trong lớp học của bạn constructor:

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

(cùng không phải với dòng mới)

Hoặc, ở đây, bạn có thể làm chuỗi concatenations:

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

(theo cách này, không có dòng mới)


khác, bạn có thể có một chuỗi được bao quanh bởi một trong hai đơn hay ngoặc kép, và đặt nó trên một vài dòng:

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

(Ở đây, một lần nữa, bạn sẽ có dòng mới trong chuỗi kết quả)

+1

_Đó là vì giá trị của chuỗi phải được biết tại thời gian biên dịch_ - sai. – user187291

+0

@stereofrog http://fr2.php.net/manual/en/language.oop5.properties.php nói * Tuyên bố này có thể bao gồm khởi tạo, nhưng khởi tạo này phải là một giá trị không đổi - nghĩa là, nó phải có khả năng để được đánh giá tại thời gian biên dịch * - vì vậy nó thực sự sai? –

+0

có, hướng dẫn là sai về điều này. – 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; 

Những kết quả đầu ra:

này là một biến thực sự dài và tôi muốn có nó trải rộng trên nhiều dòng cho dễ đọc vì lợi ích. Chúa ở đây nóng đến mức ai đó có thể bật A/C?

Điều bạn hiện đang làm việc bằng cách sử dụng string concatenation operator. Nếu bạn có thể đăng thêm thông tin về vấn đề của mình, một số mã hoặc có thể giải thích thêm về cách nó không hoạt động. Thêm thông tin sẽ dẫn bạn đến một câu trả lời tốt hơn.

+1

Điều này sẽ làm việc cho một biến bên trong một phương pháp; nhưng nó sẽ làm việc cho một tài sản lớp học? * (mà tôi tin là câu hỏi của) * –

+0

Xin chào, như Martin đã nói, tôi muốn khai báo biến OUTSIDE của lớp và sau đó truy cập nó trong một phương thức. $ var = "line1". "line2"; hoạt động nếu tôi khai báo nó bên trong một hàm, nhưng không nếu tôi làm điều đó bên ngoài. Nó thậm chí sẽ không cho tôi. – ericbae

+0

Ah, mà tôi chưa thử, tôi có thể kiểm tra nó khi tôi trở lại làm việc, nếu cần thiết. Nhưng có vẻ như bạn đã tìm ra một giải pháp. –

0

Tôi đang sử dụng PHP 5.5.9 và gặp phải sự cố tương tự chỉ với các hằng số class. Tôi muốn sử dụng một chuỗi hơi dài như một hằng số nhưng tôi không muốn:

  • đường rất dài của mã
  • dòng mới hiển thị trong văn bản ở điểm break
  • tài sản để có thể thay đổi
  • tài sản để có thể tiếp cận bên ngoài lớp

tôi nghĩ rằng giải pháp ở đây là cái gì đó được thực hiện rất nhiều trong các Laravel 5 giàn giáo và tại sao họ giữ làm điều này đã cho tôi bối rối đến bây giờ. Những gì họ làm là một cái gì đó như:

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.'; 
} 

Phương pháp này cung cấp một bất biến chuỗi. Bạn không hiểu rõ điều đó bằng cách tạo biến số protected/private với getters vì nó vẫn có thể thay đổi nội bộ. Chỉ thay đổi mã hoặc ghi đè mới có thể thay đổi chuỗi này. Một chuyên gia khác là làm cho nó tĩnh cho phép một "cá thể" duy nhất cho mỗi lớp.

Thật không may, bây giờ mã của bạn sẽ là Class::getProperty() thay vì chỉ Class::property. Một nhược điểm nữa là việc ghép nối sẽ được thực hiện mỗi lần bạn gọi hàm nhưng tùy thuộc vào cách bạn sử dụng hàm này, chi phí đó thường không đáng kể.Sẽ rất tuyệt nếu trình biên dịch PHP có thể nhận ra rằng thao tác nối trên chỉ các giá trị đã biết tại thời gian biên dịch có thể được chạy vào thời gian biên dịch và kết quả được thay thế (chúng ta hiểu biết nhiều hơn bản thân mình biết tại sao lại như vậy) .

+0

Nếu bạn không thêm một setter và không có phương thức nào thay đổi nó, một biến private cũng không thay đổi trừ khi bạn thay đổi mã. Nhưng trả về chuỗi từ phương thức _might_ đưa ra một ý định rõ ràng hơn về những gì bạn đang làm. –

+0

Tôi đồng ý. Tôi chỉ đề xuất biểu mẫu này vì không có cách nào để thay đổi chuỗi mà không cố ý ghi đè phương thức hoặc thay đổi văn bản bên trong tức là cách duy nhất để thay đổi chuỗi là ghi đè phương thức hoặc thay đổi mã bên trong. Về vấn đề này _closer_ của nó là không thay đổi kể từ khi chúng tôi đã loại bỏ các phương tiện không cố ý sửa đổi nó. – jeteon

Các vấn đề liên quan