PHP Carbon добавляет свойство динамического объекта внутри строки с двойными кавычками

Я пытаюсь создать дату Carbon из существующей даты Laravel, которая использует свойства динамического объекта:

private static function createEvent($booking, $service) {
    dd(Carbon::createFromFormat('Y-m-d H:i:s', "$booking->service_{$service}_date_end $booking->service_1_time_end"));
}

Это продолжает возвращаться:

Unexpected data found. Unexpected data found. Unexpected data found. Data missing

Есть идеи, как я могу заставить это работать? Кажется, я не могу передать переменные напрямую в Carbon, поскольку он ожидает строку в качестве второго параметра. Двойные кавычки немного усложняют задачу.

вы можете попробовать правильную интерполяцию переменной ... $booking->{"service_$service_date_end"}.' '.$booking->service_1_time_end

ArtisticPhoenix 24.03.2018 03:41

dd ("$ booking-> service _ {$ service} _date_end $ booking-> service_1‌ _time_end") и опубликовать результат

Dave Carruthers 24.03.2018 03:41

@ArtisticPhoenix, который возвращает Parse error: syntax error, unexpected '_date_end' (T_STRING), expecting ',' or ')'

user3574492 24.03.2018 03:45

@DaveCarruthers Это также возвращает Parse error: syntax error, unexpected '_date_end' (T_STRING), expecting ',' or ')'

user3574492 24.03.2018 03:46

Сложно сделать в одной строке, ИМО. Не стоит проблем с читабельностью.

ArtisticPhoenix 24.03.2018 03:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
338
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Итак, чтобы получить доступ к динамическому свойству, вы можете сделать это

 $prop = "service_{$service}_date_end";

 $booking->{$prop}

Тогда у нас есть просто стандартное свойство в виде пробела, так что затем собираем это вместе

     dd(Carbon::createFromFormat('Y-m-d H:i:s', $booking->{$prop}.' '.$booking->service_1_time_end"));

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

Для меня удобочитаемость - это все, пусть будет проще, и все будет работать.

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

Вы можете сделать это более надежно, используя простой оператор switch.

Но, не зная всего, как вы его используете или откуда взялся $service, я не могу этого сказать, это может быть хорошо в вашем случае использования. Я просто хотел вас предупредить.

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

user3574492 24.03.2018 03:52

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

ArtisticPhoenix 24.03.2018 03:53

Вы имеете в виду однострочный подход или весь этот подход в целом?

user3574492 24.03.2018 03:54

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

ArtisticPhoenix 24.03.2018 03:54

Нет, только тот факт, что свойство класса может не существовать, и на это нет никаких проверок. Так что, если бы $service был равен foo, это дало бы вам фатальную ошибку, и у вас нет возможности проверить это в настоящее время. Но, как я уже сказал, не зная в полной мере, как вы его используете, я тоже не могу сказать вам этого. В некоторых случаях использования это может быть нормально, если есть ограничения на то, что может быть переменная. IE, возможно, он никогда не ошибается из-за этих других "проверок", таких как цикл foreach на жестко закодированном массиве и т.

ArtisticPhoenix 24.03.2018 03:56

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

user3574492 24.03.2018 04:14

Другие вопросы по теме