Преобразуйте объект в другой объект с наследованием доктрины и сохраните данные [duplicate]

Мне кажется, что мне проще:

>>> import numpy as np
>>> l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
>>> print (np.concatenate(l))
[1 2 3 4 5 6 7 8 9]
14
задан Nate 26 September 2012 в 22:07
поделиться

1 ответ

Это не хороший знак, когда тип экземпляра объекта должен меняться со временем. Я не говорю о понижении / повышении рейтинга здесь, а о необходимости изменить реальный тип объекта.

Прежде всего, позвольте мне сказать вам, почему это плохая идея:

  1. Подкласс может определять больше атрибутов и выполнять некоторую дополнительную работу в его конструкторе. Должен ли мы снова запустить новый конструктор? Что, если он перезаписывает некоторые атрибуты нашего старого объекта?
  2. Что делать, если вы работаете над экземпляром этого Лица в некоторой части вашего кода, а затем он внезапно превращается в Employee (который может иметь какое-то переопределенное поведение, которого вы не ожидаете) ?!

Это связано с тем, что большинство языков не позволит вам изменить тип реального класса объекта во время выполнения (и, конечно, память, но я не хочу получать в детали). Некоторые из них позволяют вам это делать (иногда в скрученном виде, например, JVM), но это действительно не очень хорошая практика!

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

По этим причинам Doctrine не позволит вам изменить тип объекта объекта. Конечно, вы могли бы написать простой SQL (в конце этого сообщения, но, пожалуйста, прочитайте!), Чтобы сделать изменение в любом случае, но вот два «чистых» варианта, которые я бы предложил:

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

  1. Когда вам нужно «изменить тип» с Person до Employee, создайте новый экземпляр Employee и скопируйте данные, которые вы хотите скопировать из старого объекта Person, в объект Employee. Не забудьте удалить старый объект и сохранить новый.
  2. Использовать композицию вместо наследования (см. Статью wiki для деталей и ссылок на другие статьи). EDIT: Для этого, , вот часть приятного разговора с Эрихом Гамма о «Композиции над наследством»!

См. Связанные обсуждения здесь и здесь .


Теперь, вот простой метод SQL, о котором я говорил раньше, надеюсь, вам не понадобится его использовать!

Убедитесь, что ваш запрос очищен (так как запрос будет выполнен без какой-либо проверки).

$query = "UPDATE TABLE_NAME_HERE SET discr = 'employee' WHERE id = ".$entity->getId();
$entity_manager->getConnection()->exec( $query );

Вот документация и код метода exec, который находится в DBAL\Connection (для вашей информации):

/**
 * Execute an SQL statement and return the number of affected rows.
 *
 * @param string $statement
 * @return integer The number of affected rows.
 */
public function exec($statement)
{
    $this->connect();
    return $this->_conn->exec($statement);
}
33
ответ дан Community 23 August 2018 в 17:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: