LINUX.ORG.RU

Почему один и тот же PHP код вызывает синтаксическую ошибку?

 ,


0

1

Пишу вот такой кусочек кода:

<?php
 $fontFile = 'fonts/'.array('caveman.gdf', 'automatic.gdf', 'bubblebath.gdf', 'crass.gdf')[rand(0,3)];
 echo $fontFile;
?>

Он работает, и выводит рандомные имена файлов.

Оформляю его же в виде класса:
<?php

class Sample
{
  var $fontFile = 'fonts/'.array('caveman.gdf', 'automatic.gdf', 'bubblebath.gdf', 'crass.gdf')[rand(0,3)];

  function printFont()
  {
    echo $this->fontFile;
  }
}

s=new Sample;
s.printFont();

?>

И получаю ошибку:
PHP Parse error:  syntax error, unexpected '(' in sample_02.php on line 5

Ошибка в строке инициализации var $fontFile.

Почему так? Как исправить?

★★★★★

Ответ на: комментарий от goingUp

Но оно же вычисляется до того, как будет инициализирована константа. Вычисляется выражение, и полученным значением инициализируется константа. В чем проблема?

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

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

goingUp ★★★★★ ()
Ответ на: комментарий от goingUp

Вот это дельное замечание.

Конструктор бы трогать не хотелось.

Может быть, можно вычислить значение до определения класса и воспользоваться им в инициализации переменной? Что-то не получается у меня это сделать.

Xintrea ★★★★★ ()
<?php

class Sample
{
  public $fontFile = 'fonts/'.array('caveman.gdf', 'automatic.gdf', 'bubblebath.gdf', 'crass.gdf')[rand(0,3)];

  function printFont()
  {
    echo $this->fontFile;
  }
}

s=new Sample;
s.printFont();

?>

только хз работает или нет

gssomi ★★ ()
Ответ на: комментарий от NeOlip

не очень понятно чего он хочет в итоге добиться.

gssomi ★★ ()
Ответ на: комментарий от Xintrea

не многим, там тоже не правильно. Но примерно должно быть так,наверное.

<?php

class Sample
{
  public $fontFile = 'fonts/'.array('caveman.gdf', 'automatic.gdf', 'bubblebath.gdf', 'crass.gdf')[rand(0,3)];

  public function printFont()
  {
    echo $this->fontFile;
  }
}

$s=new Sample;
$s->printFont();

?>

gssomi ★★ ()
Ответ на: комментарий от Xintrea

Для начала http://php.net/manual/en/language.oop5.properties.php Там написано чем и почему нельзя инициализировать свойства класса. Да и про синтаксис почитать будет не лишним.

Без конструктора можно, но тогда будет совсем непонятно нафига тут класс. Например:

function printFont() {
    static $fontFile = 'fonts/'.array('caveman.gdf', 'automatic.gdf', 'bubblebath.gdf', 'crass.gdf')[rand(0,3)];
    echo $fontFile;
}

Или можно побороть первобытный страх перед конструкторами и написать так:

<?php

class Sample
{
  protected $fontFile;

  public function __construct() {
  $this->fontFile = 'fonts/'.array('caveman.gdf', 'automatic.gdf', 'bubblebath.gdf', 'crass.gdf')[rand(0,3)];
  }
  public function printFont() {
    echo $this->fontFile;
  }
}

$s=new Sample();
$s->printFont();

NeOlip ★★ ()
Ответ на: комментарий от Xintrea

С каких пор PHP стал компилируемым языком?

Боюсь ошибиться, но вроде бы с 4 версии, когда появился Zend Engine.

no-such-file ★★★★★ ()
Ответ на: комментарий от gssomi

Я похож на твою маму, которая бегает тебе готовить чай когда ты противным голоском этого требуешь? Ты явно меня с кем-то перепутал.

ThisNameWasFree ()
Последнее исправление: ThisNameWasFree (всего исправлений: 3 )

Комменты не читал но сразу скажу. Нельзя выполнять любые операции помимо присваивания вне конструктора или методов.

kachan ★★ ()
Ответ на: комментарий от gssomi

Я бесполезный потому что не метнулся выполнять твои хотелки или я бесполезный потому что ты глупый и пишешь невалидный код на языке, которого не знаешь?

ThisNameWasFree ()
Последнее исправление: ThisNameWasFree (всего исправлений: 1 )
Ответ на: комментарий от NeOlip

Просто вынеси из своего выражения rand(0,3) во внешнюю констану (хоть через тот же define

 public $fontFile = 'fonts/'.array('caveman.gdf', 'automatic.gdf', 'bubblebath.gdf', 'crass.gdf')[RAND_CONSTANT];
int64 ()
Ответ на: комментарий от ThisNameWasFree

ну так написал бы валидный код, на своем уровне чем сраться как сам и написал с таким «глупым школьником».

gssomi ★★ ()

То есть мой ответ выше был тебе.

int64 ()
Ответ на: комментарий от ThisNameWasFree

Хотела и написала, так же как и ты по неведомой причине решил оскорбить меня.

gssomi ★★ ()
Ответ на: комментарий от ThisNameWasFree

Может быть причина в том, что это не он, а она? Ну хочется ей быть полезной, да не умеет она, что поделаешь.

znenyegvkby ()
Ответ на: комментарий от int64

Это тоже не сработает. Если выносить во внешнюю константу, то всё выражение array('caveman.gdf', 'automatic.gdf', 'bubblebath.gdf', 'crass.gdf')[rand(0,3)])

Но это дурь, ИМХО.

NeOlip ★★ ()
Ответ на: комментарий от Xintrea

Конструктор бы трогать не хотелось.

Фобия? ;)

<?php

class Sample
{
  public static $fontFile;

  function printFont()
  {
    echo self::$fontFile;
  }
}

Sample::$fontFile = 'fonts/'.array('caveman.gdf', 'automatic.gdf', 'bubblebath.gdf', 'crass.gdf')[rand(0,3)];
$s=new Sample;
$s->printFont();

?>

код не проверял

goingUp ★★★★★ ()
Последнее исправление: goingUp (всего исправлений: 2 )
Ответ на: комментарий от NeOlip

Спорим сработает?

<?php
define('RAND', rand(0,3));

class Sample
{
  public $fontFile = 'fonts/'.array('caveman.gdf', 'automatic.gdf', 'bubblebath.gdf', 'crass.gdf')[RAND];

  function printFont()
  {
    echo $this->fontFile;
  }
}

$s = new Sample;
$s->printFont();
int64 ()

Дельный совет уже дали. Выносить все это во внешние константы – бред какой-то. Делай все внутри конструктора, да и если ты захочешь использовать этот список шрифтов в другом месте или изменить – один фиг будешь доставать его из внешних конфиг приложения. Так что забей.

znenyegvkby ()
Ответ на: комментарий от znenyegvkby

Разумеется, выносить константные выражения в константы - это бред. Надо же, чтобы они генерировались для каждого инстанса класса! А исходя из ТЗ ОП-посте, они должны генерироваться лишь единожды, при инициализации скрипта.

int64 ()

PHP Parse error: syntax error, unexpected '(' in sample_02.php on line 5

А почему это говно выплюнуло такую неочевидную ошибку? Выплюнуло бы что-то вроде: «non-static data member initializers isn't available».

EXL ★★★★★ ()
Ответ на: комментарий от int64

Надо же, чтобы они генерировались для каждого инстанса класса!

Нет, я вижу где конфигурируемый список и думаю, что как и для любого конфигуриремого списка ему место в конфиге приложения. Но я не байтодрочер, и понимаю, что здесь тег ООП и это PHP, а не С. И поэтому, думаю что даже мерзкие конфиги, а-ля

return array(
    'value' => array(
        'value' => array(
            ...
        )
    )
)
будут куда лучше чем эти твои
define('THINK_ANOTHER_NAME', rand(0,3));
define('AND_MORE', rand(0,3));
define('AND_MORE', rand(0,3));
...
define('KILL_ME', rand(0,3));
Просто кому-то нужно думать сразу об архитектуре приложения – кому-то о байтодрочестве. И это если учесть, что мы говорим о (sic!) PHP.

znenyegvkby ()
Ответ на: комментарий от EXL

Потому что автор интерпретатора хотя бы знает английский, в отличие от дурака из России, который не способен ни в пых, ни в английский. English motherfucker! Do you speak it?

ThisNameWasFree ()
Ответ на: комментарий от EXL

Потому что так универсальнее. Еще какие-то кучи типов ошибок придумывать, тьфу.

znenyegvkby ()
Ответ на: комментарий от znenyegvkby

Ты поехавший. У тебя СПГС. Был вопрос конкретный. Без всяких потребнойстей к какой-либо архитектуре. Предложенное тобою решение генерировало бы случайный элемент из списка для каждого инстанса класса, в то время как исходя из исходного описания, этот случайный элемент списка должен быть одним для всех инстансов.

Если ты не понимаешь отличия переменной от константы, то мне страшно представить какой из тебя ахритектор.

int64 ()
Ответ на: комментарий от EXL

Потому что у него версия php ниже седьмой. В седьмой все нормально описывается

FATAL ERROR Constant expression contains invalid operations on line number 5

int64 ()
Ответ на: комментарий от ThisNameWasFree

Да, лан, даже perl иногда получше сообщает, где косяк:

$ perl -e '/\d+(a|b/'
Unmatched ( in regex; marked by <-- HERE in m/\d+( <-- HERE a|b/ at -e line 1.

А в остальном согласен.

anonymous ()
Ответ на: комментарий от int64

для каждого инстанса класса
Если ты не понимаешь отличия переменной от константы, то мне страшно представить какой из тебя ахритектор.

О каких «каждых инстансах» ты говоришь? Если для тебя не очевидно, что для конфигурации приложения потребуется один единственный инстанс, то мне страшно представить какой из тебя программист.
А устанавливать константу RAND(0,3) только ради того, чтобы получить псевдорендомное значение из массива – это просто верх мысли, ага.

znenyegvkby ()
Ответ на: комментарий от ThisNameWasFree

Ты какой-то агрессивный и унылый. Это всё из-за PHP, наверное. Программирование должно доставлять радость и лулзы.

EXL ★★★★★ ()
Ответ на: комментарий от znenyegvkby

Тебя когда спрашивают как инициализировать переменную, ты начинаешь рассказывать о масштабируемости и хай-лоаде? Ты здоров? Ты читать умеешь? В оп-посте где-то был вопрос о том, что это конфиг? Илио том, как ему хранить конфиг? Там вообще про конфиг и архитектурные решения какие-либо вопросы задавались?

Лечись.

int64 ()
Ответ на: комментарий от deep-purple

Ваш helloworld.lang плохо поддается поддержке, надо срочно все переписать на %LanguageName% на основе %FrameworkName% с применением %TechnologyName%

int64 ()
Ответ на: комментарий от int64

В оп-посте где-то был вопрос о том, что это конфиг?

$fontFile = 'fonts/'.array('caveman.gdf', 'automatic.gdf', 'bubblebath.gdf', 'crass.gdf')[rand(0,3)];

Т.е. ты считаешь, что (независимо от «задумки» разраба) в будущем конфигурировать этот список не понадобится? Ок.

Лечись.

И тебе того же.

znenyegvkby ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.