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аерсию магазина. Может на восьмую версию. Но тут тоже надо пробовать.