cannot use temporary expression in write context php

Почему PHP не может иметь постоянный объект?

У меня есть таблица базы данных ключ-значение, где я храню некоторые настройки.

Я хотел бы иметь эти настройки в константном объекте PHP, так как они не должны быть редактируемыми.

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

И это прекрасно работает.

Но почему я не могу сделать:

Так что я мог бы назвать это так:

Есть ли причина, по которой это невозможно?

Решение

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

При использовании ключевого слова const используются только скалярные данные (булево, целое число,
float и string) могут содержаться в константах до PHP 5.6. От
Начиная с PHP 5.6, можно определить константу как скаляр
Выражение, и также возможно определить константу массива. это
можно определить константы как ресурс, но этого следует избегать,
как это может привести к неожиданным результатам.

Однако с массивами есть несоответствие, и не дается рационального объяснения, почему допускаются константы массива. (Я бы даже сказал, что это был плохой звонок.) Следует отметить, что array-constants являются неизменяемыми, следовательно, попытка изменить их приводит к фатальной ошибке, как показано этим кодом из php7:

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

Я рекомендую держаться подальше от массивов и объектов в качестве констант. Скорее создайте неизменные объекты или используйте неизменные коллекции вместо.

Также возможно определить их в интерфейсах.

Источник

Вопрос №30172 от пользователя Александр Лунев в уроке «DS», курс «PHP: Объектно-ориентированный дизайн»

Не дает подключить: Can’t use temporary expression in write context

А вы можете приложить ссылку на код ревью? Посмотрим что там.

Kirill Mokevnin, а как это сделать? Я не прошел задание. Поэтому нет код ревью.

P.S. Эти ошибки мне Storm выдает.

Зависимости подключил (composer.json)

То что настроен композер не значит что он подключен. Вспомните наш курс по настройке окружения в php или документацию композера. Как он подключается?

Kirill Mokevnin, локально и глобально.

В файле Comparator.php я вызываю функцию compare(‘ab#c’, ‘ab#c’); интерпретатор на меня ругается, что вызывается неопределенный класс Stack. Если я запускаю тесты, то все ОК. Я так понимаю, что это связанно с автозагрузкой.

Я хотел вызвать данную функцию, и распечатать промежуточные результаты, но так не работает.

Kirill Mokevnin, локально и глобально.

Это ответ на другой вопрос. Мой вопрос был в том как композер подключается внутри приложения. У вас он не подключен, поэтому и ругается. Ведь не важно как вы настроили композер если вы его не подключили) Попробуйте посмотреть в наш эталонный проект https://github.com/hexlet-boilerplates/php-package

Я выполняю из корня проекта composer install все зависимости подтягиваются, в папке vendor composer присутствует. Как его еще нужно подключать? Ведь если бы он был не подключен, как бы тогда скрипт работал после запуска команды make test, я так понимаю он бы ругался и в этом случае?

То что вы до этого описали, это не подключение. Подключать его надо так как описано в официальной документации, в нашем курсе и в нашем эталонном проекте. Я все же настаиваю на том чтобы вы посмотрели)

Ведь если бы он был не подключен, как бы тогда скрипт работал после запуска команды make test, я так понимаю он бы ругался и в этом случае?

Конкретно для тестов он подключается в файле phpunit.xml.

Kirill Mokevnin, похоже у меня затык, пните в нужном направлении.

Единственное предположение, Вы намекаете на Makefile строчку:

Я правильно понимаю, когда я скопировал структуру папок, и файлы, запустил composer install (получается запустилась установленная глобально в систему версия), подтянул все зависимости, одна из зависимостей подтягивает composer (в проект локально). Когда я пытаюсь запустить скрипт на выполнение, минуя PHPUnit, проект не видит composer установленный глобально и ругается на то что не находит некоторые классы/библиотеки и т.п. Почему я тогда не могу руками включить файл

Ваш код не может увидеть композера если вы явно не включили файлы композера внутрь кода.

Почему я тогда не могу руками включить файл

Вы именно так и должны делать, собственно об этом и пишет официальная документация.

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

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

Ваш код не может увидеть композера если вы явно не включили файлы композера внутрь кода.

Я думал, если composer лежит в папке vendor, то скрипт его видит.

P.S. Началось все с того, что я выкинул из composer.json строчки

т.к. при установке вываливалось сообщение, что система не может создать папку. Удалил, все заработало, в vendor увидел composer, подумал что он встал в проект.

Но мне кажется, что это не имеет отношения к composer.

Я не очень понимаю что от меня требуется. Можете пояснить?

Я думал, если composer лежит в папке vendor, то скрипт его видит.

Скрипт на PHP это просто код, который вы там написали. Он не делает ничего кроме того что ему сказали. Впрочем это относится к скриптам в любых языках программирования.

Началось все с того, что я выкинул из composer.json строчки

Именно поэтому я очень просил сравнивать ваш код с нашим эталонным пакетом https://github.com/hexlet-boilerplates/php-package, а не с тем что у нас в онлайн среде (она настраивается по особому)

Но мне кажется, что это не имеет отношения к composer.

Это имеет самое прямое отношение к композеру. Когда вы его включаете в скрипт, то композер сначала анализирует заданную конфигурацию и использует ее для своей работы.

Я не очень понимаю что от меня требуется. Можете пояснить?

Таки вам надо разобраться как работает комопозер основываясь на материалах что я скидывал выше. Вот прямо точная статья с официальной документации: https://getcomposer.org/doc/01-basic-usage.md

Kirill Mokevnin, можете пояснить в чем отличия эталонного пакета от того что в онлайн среде?

Ругается теперь на двойное объявление функции reduceStr()

В чем опять загвоздка?

P.S. Наверное можно сказать, что я понял в общих чертах как это работает.

можете пояснить в чем отличия эталонного пакета от того что в онлайн среде?

Чисто технически разницу видно в файлах composer.json и phpunit.xml. Надо просто открыть их и построчно сравнить.

Концептуально, наша практика запускается в специальной среде, где другие правила работы, они специфичны для нашей среды. Например все зависимости ставятся в глобальные каталоги (это нужно для кеширования слоев в докере). Поэтому конфигурация в практиках неприменима локально.

Источник

Ошибка инсталлера на PHP 7.2 Исправлено

При установке/обновлении появляются 2 ошибки (по очереди)

Deprecated: Function create_function() is deprecated in D:\Web\oceania\public_html\wa-installer\lib\classes\wainstaller.class.php on line 1498

Лечится заменой на анонимку.

И вторая в файле Tar.php в строке 657

Лечится установкой последней версии данной библиотеки.

И уже после установки вываливается следующая ошибка

24 комментария

Отсюда скачай новый Tar.php и замени по этому пути

А первую ошибку: в файле wa-installer\lib\classes\wainstaller.class.php замени строчку

У меня сработало простой заменой файла Tar.php, но не совсем простой: сначала начинаем ставить, ка только инсталлер проверил целостность файлов, меняем файл и потом ставим фремворк.

есть ненулевая вероятность, что с замененным файлом у вас не все обновления ставиться будут

ПРоверил ставиться все, НО: как только фремворк пытается обновиться, после этого опять надо менять это файл иначе опять пише про него нехорошие вещи. уверен, что просто забыл, кто-то там из разработчиков обновить это файло.

до этого понедельника будет жить клон моего сайта, http://vps15416.vps.host.ru он стоит на таком же VDS что и основной сайт http://d1350.com/, разница только в том, что на клоне версия магазина 7, 64битная ОС, по идеи она может использоваться все 6гигов оперативке на сервере, и PHP7.2 phpinfo с сайта

На рабочей 6 версии магазина, PHP5.6 и 32 бита, то есть по идеи она использует 4 гига оперативки, но вся система заточена на исполнения шопскрипта и сами скрипты для магазина прошли ручную оптимизацию (на этом сервере еще 3 сата крутятся 2 шоп скрипта версии 7 и ворпрес) и не смотря на это, пока он показывает более высокие показатели нежели «новый».

и то и другое стоит у одного хостера Зенон НСП на VPS5-SSD, тарифы и характеристики можно смотреть у них на сйате.

Кому интересно могут потестить.

у меня по тестам получилось что нет смысла трогать, то что работает не хуже.

для меня переход с 6 версии на седьмую бессмысленен.

вот этим сайтом тестил:

файл патчен разработчиками вебассиста, насколько помню. что-то с обработкой директорий в архиве. поэтому есть вариант, что архив какого-либо продукта не полностью распакуется или вместо названия директории будет Array.

Что вам 7.2 так упёрлась? Оно все еще официально фреймворком не поддерживается (но возможно к новому году или чуть позже ситуация улучшится). и увеличения производительности никакого по сравнению с 7.0/7.1 не даёт.

Всё может быть. Поэтому не вижу смысла переходить с 6 версии на 7аерсию магазина. Может на восьмую версию. Но тут тоже надо пробовать.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *