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.

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

★★★★★

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

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

Я ведь там не о RAND конкретного говорил, а о списке шрифтов. Как он будет обрабатываться и где – уже другой вопрос. Так что твой шланг вообще не в тему.

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

Я тоже так считаю, но это не отнимает у меня права пословоблудить в web-dev. Причем на околоуместные темы. Не нравится – добавь уже в игнор.

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

Василий!

Очень приятно, Вениамин.

Я обеими руками за конструктор для Sample!

Если он будет непосредственно в Sample – тогда уж лучше define, так хоть байтодрочерством можно будет оправдаться. Ведь если включить логику, понятно что Sample у ТС-а всего-навсего неумелый прототип Application. Иначе зачем здесь вообще тег ООП? Хотел бы байтиков сэкономить – не спорил бы с int64.

znenyegvkby
()
class Sample
{
  public function printFont()
  {
    $arr = array('caveman.gdf', 'automatic.gdf', 'bubblebath.gdf', 'crass.gdf');
    $random = rand(0,3);
    
    return 'fonts/' . $arr["$random"];
  }
}

$s = new Sample();
echo $s->printFont();
Noob_Linux ★★★★
()
Ответ на: комментарий от Xintrea

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

Вроде бы, с 3-й версии. Точно не знаю, т.к. когда с ним познакомился на рубеже веков, он уже был компилируемый :)

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

Наличие интерпретатора не означает отсутствие этапа компиляции.

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

А то в рамках одной категории — либо интерпретатор, либо компилятор :)

KRoN73 ★★★★★
()

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

Плохая, негодная константа. Чинить саму логику надо. Так как это очень левое дублирование информации. Храни список фонтов и логику выбора рандомной записи из списка отдельно - а то сейчас при добавлении/удалении фонта тебе и максимальное значение в функции rand приходится менять.

Кстати, объявлять неоднозначный результат вызова функции константой - довольно плохая затея. Даже не с позиции программирования, а так, чисто логический.

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

Если в языке есть eval, то как его компилировать? Точно так же можно и выражения на лету высчитывать/компилировать.

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

Слушайте, это всего лишь навсего кусок punbb по генерации капчи. Там прям в коде прописан путь к шрифту. По факту оказалось, что в каталоге есть еще шрифты. А коль это капча, лучше чтобы шрифты выбирались рандомно. Мне логичнее по-быстрому исправить строку с присвоением на рандомное присвоение и не парить мозго. А вы тут про приложение и структуру стали писать. Задача выеденного яйца не стоит.

Я просто удивляюсь, что в PHP до сих пор есть такеи странные ограничения на вычисление выражений в разных контекстах.

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

Если в языке есть eval, то как его компилировать?

Компилятором. CL вон компилирует, в самом исконном смысле - в машкод, и ничего, мир не перевернулся.

Точно так же можно и выражения на лету высчитывать/компилировать

Именно.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 2)
Ответ на: комментарий от int64

А исходя из ТЗ ОП-посте, они должны генерироваться лишь единожды, при инициализации скрипта.

Если инстансов будет несколько, то логично, что каждый инстанс должен иметь свой рандом. А если инстанс будет только один, то никакой разницы нет.

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

Там прям в коде прописан путь к шрифту. По факту оказалось, что в каталоге есть еще шрифты.

Осилить работу с файлами/каталогами не пробовал?

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

С помощью var можно инициализировать только константные значения.

это из php4 и лучше не использовать больше никогда
для констант есть служебное слово CONST variable

class Sample
{
    // лучше делать через protected переменную и добавлять методы addFont, deleteFont
    const FONT_COLLECTION = ['caveman.gdf', 'automatic.gdf', 'bubblebath.gdf', 'crass.gdf'];

    // если нужно лишь первый раз выбрать, значит меняем на static и проверяем условие на if (null !== $this->fontFile) $this->pickUp..
    protected $fontFile;

    public function __construct()
    {
        $this->pickUpRandomFont();
    }

    public function pickUpRandomFont()
    {
        $this->fontFile = 'fonts/' . self::FONT_COLLECTION[rand(0, count(self::FONT_COLLECTION) - 1)];
        return $this;
    }

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

$o = new Sample();
$o->printFont();
$o->pickUpRandomFont()->printFont();

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

return 'fonts/' . $arr[«$random»];

зачем брать «$random» в строку, чтобы потом сработали двойные кавычки, достали переменную и конвертировать в инт, если сразу можно передать $arr[$random] ?

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

Если в языке есть eval, то как его компилировать?

Так и компилировать just-in-time.

Точно так же можно и выражения на лету высчитывать/компилировать.

ЯП это формальные языки, подчиняющиеся правилам синтаксиса и семантики. Нельзя делать то. что можно в теории. Надо делать то, что в рамках определенных правил. У каждого языка они свои. Динамическое вычисление констант в php при объявлении - define. Все остальное, нет. Есть маны, там все прекрасно описано, какие константы верны, а какие нет.

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

С каких пор изменение константных выражений в рантайме - это логично?

С тех пор как стало можно создавать несколько объектов в одной программе.

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

Точне не как, а почему она должна менять это поведение? Вы тоже не знаете, что такое константа?

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

Как эта возможность, внезапно, должна менять поведение и назначение КОНСТАНТ?

Если поведение объекта зависит от константы, причём это основная функция объекта, то очевидно, что такая константа должна задаваться при создании объекта. Иначе объект просто не нужен - достаточно свободной функции.

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

То есть, в классе у нас объявляются только свойства\методы\константы и прочее, для объектов в отдельности? Принцип разделения, а так же статические свойства\методы\константы - этого, оказывается, в нашем мире не существует. Вы с ООП то вообще знакомы?

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

То есть, в классе у нас объявляются только свойства\методы\константы и прочее, для объектов в отдельности?

Если от этого зависит суть поведения объекта, то да. В данном примере у объекта только 1 метод, результат которого прямо зависит от заданной константы. Так ты либо выкинь вообще класс и определи константу шрифта для всей программы одну, либо, если делаешь класс, то определяй константу при инициализации.

PS: Я считаю, что ты дурачок и ничего тебе доказывать не собираюсь. Оставайся при своём мнении.

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

Был упопрот, почему-то был уверен что массив ассоциативный.

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

Что мешает откомпилировать выражение перед инициализацией свойства?

Ничего, кроме идеологических ограничений разработчиков.

В PHP ты можешь инициировать на этапе компиляции вычисляемые переменные, но только когда они базируются на константах же. rand() константой не является. Да и компиляция случайного числа... Чем-то оно напоминает http://imgs.xkcd.com/comics/random_number.png

KRoN73 ★★★★★
()

Во-первых, есть чисто синтаксические ошибки -

s=new Sample;

Должно быть $s

$s.printFont();

$s->print...

var $fontFile

var устарело и больше не используется (https://stackoverflow.com/a/1206120)

Во-вторых, php не допускает, насколько я знаю, присваиваний с неопределённым на этапе компиляции значением, то есть нельзя присваивать свойству вызов какой-либо функции. Можно только базовые операции, арифметические или со строками. И не забудьте определение области видимости для свойств (public например). Если необходимо, чтобы после создания экземпляра класса значение присвоилось свойству лишь один раз, это можно сделать через конструктор. Если конструктор делать не хочется, сделайте простую проверку.

class Sample {
	$fontFile = null;
	function printFont(){
		if(empty($this->fontFile)) $this->fontFile = 'fonts/'.array('caveman.gdf', 'automatic.gdf', 'bubblebath.gdf', 'crass.gdf')[rand(0,3)];;
		echo $this->fontFile;
	}
}
$s=new Sample;
$s->printFont();
Kensei
()
Ответ на: комментарий от Kensei

..сам же и забыл про видимость -

$fontFile = null;

public $fontFile = null;

Рассеянный слоуфикс

Kensei
()

var $fontFile
19.01.2017

мать моя женщина...

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