Подтвердить что ты не робот

Постоянная строковая переменная класса PHP, охватывающая несколько строк

Я хочу иметь строковую переменную для класса PHP, которая будет доступна для всех методов.

Однако эта переменная довольно длинная, поэтому я хочу разделить ее на несколько строк.

Например,

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

Но выше не работает.

Я попробовал EOD, но EOD не допускается в классе. И когда я объявляю его вне класса, я не могу получить доступ к переменной из класса.

Каков наилучший способ?

4b9b3361

Ответ 1

Если вы используете PHP >= 5.3, вы можете использовать синтаксис HEREDOC для объявления своей строки:

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

}

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

Но это:

  • возможно только с PHP >= 5.3
  • и строка не должна содержать никакой переменной
    • это потому, что строковое значение должно быть известно во время компиляции
    • который, кстати, объясняет, почему конкатенация с . не будет работать: она выполняется во время выполнения.

И еще один недостаток заключается в том, что в строке будут помещены символы новой строки, которые могут или нет быть плохими.


Если вы используете 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";
}

(Здесь, опять же, в результирующей строке будут новые строки)

Ответ 2

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

Какие выходы:

это действительно длинная переменная, и я предпочел бы, чтобы она охватывала несколько строк для удобства чтения. Боже, так горячо здесь, может кто-нибудь включить A/C?

Что вы теперь используете, используя оператор конкатенации строк. Если вы можете опубликовать дополнительную информацию о своей проблеме, некоторый код или, возможно, еще одно объяснение того, как это не работает. Дополнительная информация даст вам лучший ответ.

Ответ 3

Я использую 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.';
}

Этот метод предоставляет строку неизменной. Вы не строго это понимаете, создавая переменную protected/private с геттерами, поскольку она все еще изменена внутри. Только изменение кода или переопределение может изменить эту строку. Еще один профессионал в том, что статичность позволяет использовать один экземпляр для каждого класса.

К сожалению, теперь ваш код будет Class::getProperty(), а не только Class::property. Еще один недостаток заключается в том, что конкатенация будет выполняться каждый раз, когда вы вызываете функцию, но в зависимости от того, как вы ее используете, эта стоимость обычно незначительна.

Было бы здорово, если бы компилятор PHP смог распознать, что операция конкатенации только значений, уже известных во время компиляции, может быть запущена во время компиляции, а результат заменен (существа, более осведомленные, чем я, знают, почему это так).