Для параметра class
или struct
, такого как ваш example
, правильный ответ использует new
не malloc()
для размещения экземпляра. Только operator new
знает, как вызвать конструкторы для struct
и его членов. Ваша проблема вызвана тем, что элемент строки не был сконструирован.
Однако есть редкие случаи, когда важно, чтобы определенный патч памяти действовал так, как если бы он содержал экземпляр класса. Если у вас действительно есть такой случай, существует вариант operator new
, который позволяет указать местоположение объекта. Это «размещение нового» и должно использоваться с большой осторожностью.
void *rawex = malloc(sizeof(example)); // allocate space
example ex = new(rawex) example(); // construct an example in it
ex->data = "hello world"; // use the data field, not no crash
// time passes
ex->~example(); // call the destructor
free(rawex); // free the allocation
Используя новое место размещения, вы обязаны предоставить область памяти правильного размер и выравнивание. Не предоставление правильного размера или выравнивания приведет к таинственным вещам. Неправильное выравнивание обычно быстрее вызывает проблему, но также может быть загадочным.
Кроме того, с новым местом размещения вы берете на себя ответственность за вызов деструктора вручную и в зависимости от происхождения блока памяти, выпуская его своему владельцу.
В общем, если вы уже не знаете, что вам нужно место нового, вам почти наверняка не нужно. Он имеет законное использование, но есть неясные углы каркасов, а не повседневные события.
Правильный синтаксис для этой ситуации будет следующим: "!this.getParent().get('activeTestData')->getData() == null"
Вы можете увидеть больше примеров и подробностей в документации Symfony .
Я обновил свой ответ. В этом контексте «this» является объектом Form поля «activeTestDataUnit». Поэтому, чтобы проверить значение «activeTestData», нужно перейти к родителю, а затем получить правильного потомка.
Начиная с Symfony 4.1 вы можете передавать свои пользовательские значения в аргумент «values» и избегать всего этого беспорядка, передавая $builder->getData()
. Смотрите здесь для получения дополнительной информации о документации Symfony