2015-01-23 5 views
0

Почему это ошибка компиляции:строковые массивы внутри строк

<?php 
class Bean 
{ 
    public $text = array("123", "456"); 
    public $more = array("000 {$this->text[0]} 000", "--- {$this->text[1]} ---"); 

} 

?> 

Компилятор говорит PHP Parse error: syntax error, unexpected '"'

Как я могу использовать текстовый массив в моих других массивов?

+0

LIne 5 должен быть ' public $ more = array ("000 {". $ this-> text [0]. "} 000", "--- {". $ this-> text [1]. "} ---"); ' – Hussain

+0

Это не работает. Я проверил ideone – penu

+0

Я не думаю, что вы можете заставить это работать с текущими версиями php. Несмотря на то, что некоторые ограничения в отношении «должно быть значением const» -уровня были сброшены в последние версии php ... как это? ... Я так не думаю. см. http://php.net/manual/migration56.new-features.php «Константные выражения» – VolkerK

ответ

3

Как уже упоминалось ранее, вы не можете сделать это (напрямую) с текущими версиями php. Даже новые функции php 5.6 этого не позволят, см. http://php.net/manual/en/migration56.new-features.php
Но предположим, что у вас есть действующий интервал, например, хранение/группирование что-то в более декларативной части класса, чем скрывать это где-то в куче кода, вы могли бы сделать что-то (возможно, «немного» более изощренными ;-)) как

<?php 
class Bean 
{ 
    public $text = array("123", "456"); 
    public $more = array('000 %1$s 000', '--- %2$s ---'); 

    public function Bean() { 
     foreach($this->more as $k=>&$v) { 
      $v = vsprintf($v, $this->text); 
     } 
    } 
} 

$b = new Bean; 
print_r($b->more); 
+0

Этот «бит более изощренный» ответ довольно интересен. Где я могу найти документы о том, что делает heck% 1 $ s? – penu

+0

будет работать 'vsprintf' с двойными кавычками[email protected]: поиск 'vsprintf' или' sprintf' в документации PHP. – Tikkes

+0

Формат задокументирован по адресу http://docs.php.net/sprintf at/after. «Строка формата поддерживает аргумент нумерации/подкачки [...]» – VolkerK

1

Что вы будете делать в этой строке:

public $more = array("000 {$this->text[0]} 000", "--- {$this->text[1]} ---"); 

не работает в PHP.

http://php.net/manual/en/language.oop5.properties.php

здесь вы можете увидеть действительные и недействительные значения для свойств в данном примере. Поэтому, если вы используете двойные кавычки, PHP пытается разрешить строку.

http://php.net/manual/en/language.types.string.php#language.types.string.syntax.double

Таким образом, вы должны заменить ваш " с ', то он должен работать

public $more = array('000 {$this->text[0]} 000)', '(--- {$this->text[1]} ---)'); 

, что вы можете сделать, это установить заполнитель в этой переменной и заменить их, прежде чем вы нуждаетесь в них с vsprintf например.

+0

Так что в основном я не могу использовать переменные в этих строках? – penu

+0

'Вы можете устанавливать только скалярные значения.', Это неверно. Массив не является скалярным, но вы можете его использовать. –

+0

Да, жаль, что это было неправильное слово. Я пытаюсь найти часть в документации, которая ее описывает, но я не могу ее найти. – Stony

0

Вы можете сделать это:

class Bean 
{ 
public $text = array("123", "456"); 

public function fillMore() { 
    $more = array(); 
    $more[0] = "000 ".$this->text[0]." 000"; 
    $more[1] = "000 ".$this->text[1]." 000"; 

    var_dump($more); 
} 
} 

$bean = new Bean(); 
$bean->fillMore(); 

В качестве альтернативы вы можете попробовать и заполнить $more в конструкторе тоже. При инициализации класса вы получите $more.

Смежные вопросы