Вы можете добиться того, чего хотите, используя пользовательскую функцию :
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\SqlWalker;
use Doctrine\ORM\Query\Parser;
class DateFunction extends FunctionNode
{
private $arg;
public function getSql(SqlWalker $sqlWalker)
{
return sprintf('DATE(%s)', $this->arg->dispatch($sqlWalker));
}
public function parse(Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->arg = $parser->ArithmeticPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}
Затем зарегистрируйте эту функцию в своем коде:
$em->getConfiguration()->addCustomDatetimeFunction('DATE', 'DateFunction');
И ваш DQL-запрос будет работать!
Пять вещей я ненавижу о Java:
я знаю, я должен проверить Scala.
Ruby
Я могу добавить другой для Python:
, Учитывая список l = [l1, l2, ..., ln]
, тогда repr(l) = [repr(l1), repr(l2), ..., repr(ln)]
, но str(l) != [str(l1), str(l2), ..., str(ln)] (str(l) = repr(l))
. Это было решено, потому что там мог быть неясными записями в списке как l = ["foo], [bar,", "],["]
, и str(l)
возвратится "[foo], [bar, ], []"
, который "мог смутить пользователей". Однако это делает str
невозможный использовать для того, чтобы просто вывести данные, так как список уничтожает "просто данные дампа в читаемом формате". Augh!
Perl 5:
Python:
rand()
выше). Я don' t знают, как можно обоснованно ожидать O(n lg n)
на практике. В идеальном мире, возможно...
– AnT
22 October 2009 в 17:58
C++
Python:
Python: выбор детали Массива не дает Вам, что Вы попросили.
[1] дает Вам, один элемент
[1:2] дает Вам, один элемент, не [[1], [2]]
[1:3] дает 2 элемента
, я ненавижу это, но возможно это просто, потому что я главным образом работаю в Verilog.
Другое голосование за C++ здесь... все еще мой фаворит у нескольких близких подписчиков - C и Python. Вот мой текущий список ненависти без определенного порядка:
Ruby:
Я чувствую, что любимый язык невозможно выбрать. Динамический контроль типов и статический контроль типов не могут вполне быть сравнены, таким образом, я просто перечислю который, из которых я использую
C++:
::value
сделало бы его намного более кратким ->.
, Почему компилятор не может выяснить, что я делаю ptr.thing
и просто делаю ->
для меня? vector<vector<int>>
должно быть vector<vector<int> >
, заставляет меня дрожать, и затем я не могу сфокусироваться каждый раз, когда я вижу, что строка кода и заканчиваю тем, что пытался выяснить способ использовать int[][]
или что-то ;
Python:
$('#ui-datepicker-div').removeClass('ui-helper-hidden-accessible');
для того же эффекта.
– Milo LaMar
31 August 2012 в 18:16
Дельфи:
Язык Common LISP:
числа JavaScript
Python:
__init__
) __getattr__
, который не является) print
луг в файл (но они фиксируют это в Python 3) PHP:
, Тем не менее, PHP (сценарии) язык.;-)
PHP
C (хорошо, это не мой фаворит, но это еще не было сделано.)
РЕДАКТИРОВАНИЕ: Я мог, вероятно, придумать больше, если бы я обратился к большему количеству кода библиотеки (как, я сделал с сокетами, но те особенно плохи), но я уже чувствовал, что обманывал для того, чтобы выбрать C. Столько языков существует только, чтобы взять хорошие части C и заменить плохое, что он отчасти похож на избиение мертвой лошади.
Ruby является моим любимым языком, вот то, что я не люблю:
Ошибки/Исключения Python
И всем тем программистам языка C-выхода, сам имеет больше смысла мне, чем это, потому что объект относится к сам
C++
Строки.
Они не совместимы со строками платформы, таким образом, Вы заканчиваете тем, что использовали станд.:: векторная половина времени. Политика копии (копия на записи или глубоко копируют) не определяется, таким образом, гарантии исполнения не могут быть даны для простого синтаксиса. Иногда они полагаются на алгоритмы STL, которые не очень интуитивны для использования. Слишком много библиотек прокручивают свои собственные, которые, к сожалению, намного более удобны для использования. Если Вы не должны комбинировать их.
Множество строковых представлений
Теперь, это - что-то вроде проблемы платформы - но я все еще надеюсь, что было бы лучше, когда менее упрямый стандартный строковый класс будет доступен ранее. Следующие строковые представления я часто использую:
модель Build.
я болен к смерти от все время потраченного запутывания вокруг с who-includes-what, предописаниями, оптимизация предварительно скомпилированных заголовков и включаю для хранения, по крайней мере, возрастающего времени изготовления терпимым и т.д. Это было большим в восьмидесятых, но теперь? Существует столько препятствий к собиранию части кода, таким образом, это может быть снова использовано, что даже собака мам скучает, слушая меня.
Трудно для парсинга
Это делает внешние инструменты особенно трудно, чтобы записать, и разобраться. И сегодня, мы парням C++ недостает главным образом набора инструментальных средств. Я люблю свое отражение C# и делегатов, но я могу жить без них. Без большого рефакторинга я не могу.
Поточная обработка слишком трудна
, Язык даже не распознает его (к настоящему времени), и свободы компилятора - в то время как большой - к болезненному.
Статическая и инициализация по запросу Технически, я обманываю здесь: это - другая часть загадки в, "оборачивают код для повторного использования": это - кошмар для получения чего-то, инициализировал только, когда это необходимо. Лучшее решение всех других redist проблем бросает все в заголовки, эта проблема говорит "neeener - Вы не можете".
Предоставленный, многое из этого вне строгого объема языка, но IMO весь набор инструментальных средств должен быть оценен и должен развиться.
JavaScript:
Object
прототип может быть изменен. Каждый объект в Вашей программе получает новые свойства, и что-то, вероятно, повреждается.
Все объекты являются картами хеша, но трудно безопасно использовать их как таковой. В частности, если один из Ваших ключей, оказывается, __proto__
, Вы в беде.
Никакое объектное закрытие во время ссылки на функцию. На самом деле никакое объектное закрытие вообще - вместо этого, this
не установлено каждый раз, когда функция вызвана с объектной нотацией или new
оператор. Результаты в большом количестве беспорядка, особенно при создании обратных вызовов события, потому что this
не установлен на то, что ожидает программист.
new
оператор приводит к this
устанавливаемый равный глобальному объекту, приводящему к большой поломке. Оператор сложения, перегруженный, чтобы также выполнить конкатенацию строк, несмотря на эти две операции, являющиеся существенно отличающимся. Результатами в боли, когда значение Вы ожидаете быть числом, является на самом деле строка.
==
и !=
операторы выполняют приведение типа. Сравнения между различными типами включают список правил, что никакой смертный не может помнить полностью. Это смягчено существованием ===
и !==
операторы.
И null
и undefined
существуют, с тонко различными, все же избыточными значениями. Почему?
Странный синтаксис для установки цепочек прототипа.
parseInt(s)
ожидает число C-стиля, таким образом, значения обработок с продвижением обнуляют как восьмеричные и т.д. Вы можете [по крайней мере 1 114], но поведение по умолчанию сбивает с толку.
Никакая область действия блока.
Может объявить ту же переменную несколько раз.
Может использовать переменную, не объявляя его, в этом случае это глобально и вероятно повреждает Вашу программу.
with { }
.
Действительно трудный к документу с JavaDoc как инструменты.
C++
Objective C
1) Никакие пространства имен, просто ручные соглашения о присвоении имен - я не возражаю, что с точки зрения разделения класса, но я действительно пропускаю способность импортировать все определения классов в пространстве имен в одной строке (как импорт com.me.somelibrary.*).
2) Библиотеки все еще имеют некоторые дыры в важных областях как поддержка RegEx.
3) синтаксис Свойства немного неуклюж, требуя, чтобы три строки (в двух отдельных файлах) объявили свойство.
4) мне нравится сохранить/выпустить модель, но это легче, чем это должно быть должно выпустить ссылку и затем случайно использовать его позже.
5), Хотя не действительно функция языка, XCode так переплетен с использованием Objective C, я не могу сдержать взгляды о том аспекте... в основном автозавершение, очень сомнительно. Это больше похоже на систему, которая вознаграждает Вас за нахождение чего-то, что Вы хотите, существует, и затем представляет его как выбор впоследствии. Но тогда я предполагаю, что мне никогда не нравились механизмы автоматического заполнения.
Вот некоторые вещи, которые я не люблю о Java (который не является моим любимым языком):
Я сделаю PHP, поскольку мне время от времени нравится он, и Python будет сделан слишком очень.
Никакое пространство имен; все находится в своего рода очень большом пространстве имен, которое является адом в больших средах
Отсутствие стандартов когда дело доходит до функций: функции массива берут иглу в качестве первого аргумента, стог сена как вторую (см. array_search). Строковые функции часто берут стог сена сначала, вторая игла (см. ремни для правки бритв ). Другие функции просто используют различные схемы именования: bin2hex, strtolower, cal_to_jd
Некоторые функции имеют странные возвращаемые значения, из того, что нормально: Это вызывает, Вы для имения третьей переменной объявили откуда ни возьмись, в то время как PHP мог эффективно интерпретировать пустой массив как ложь с ее манипулированием типа. Нет близость никаких других функций, делающих то же.
$var = preg_match_all('/regexp/', $str, $ret);
echo $var; //outputs the number of matches
print_r($ret); //outputs the matches as an array
язык (до PHP6) прилагает все усилия для уважения почти отсталой обратной совместимости, заставляя его нести плохие методы и функции вокруг если не необходимого (см. mysql_escape_string по сравнению с mysql_real_escape_string).
язык, развитый от языка шаблонной обработки до полного бэкенда один. Это означает, что кто-либо может произвести что-либо, когда они хотят, и этим злоупотребляют. Вы заканчиваете с движками шаблонов для языка шаблонной обработки...
Это сосет при импорте файлов. У Вас есть 4 различных способа сделать это (включайте, include_once, потребуйте, require_once), они являются все медленными, очень медленными. На самом деле целый язык является медленным. По крайней мере, довольно медленнее, чем Python (даже с платформой) и RoR от того, что я собираю.
я все еще как PHP, все же. Это - цепная пила веб-разработки: Вы хотите малый и средний сайт, сделанный очень быстро и быть уверенными, что кто-либо может разместить его (хотя конфигурации могут отличаться)? PHP тут же, и это настолько повсеместно, требуется только 5 минут для установки полного стека LAMP или WAMP. Ну, я возвращаюсь к работе с Python теперь...
Смешанное использование символов
my @array = ( 1, 2, 3 );
my $array = [ 4, 5, 6 ];
my $one = $array[0]; # not @array[0], you would get the length instead
my $four = $array->[0]; # definitely not $array[0]
my( $two, $three ) = @array[1,2];
my( $five, $six ) = @$array[1,2]; # coerce to array first
my $length_a = @array;
my $length_s = @$array;
my $ref_a = \@array;
my $ref_s = $array;
Например, ни один из них не то же:
$array[0] # First element of @array
@array[0] # Slice of only the First element of @array
%array[0] # Syntax error
$array->[0] # First element of an array referenced by $array
@array->[0] # Deprecated first element of @array
%array->[0] # Invalid reference
$array{0} # Element of %array referenced by string '0'
@array{0} # Slice of only one element of %array referenced by string '0'
%array{0} # Syntax error
$array->{0} # Element of a hash referenced by $array
@array->{0} # Invalid reference
%array->{0} # Deprecated Element of %array referenced by string '0'
В Perl6
это записано:
my @array = ( 1, 2, 3 );
my $array = [ 4, 5, 6 ];
my $one = @array[0];
my $four = $array[0]; # $array.[0]
my( $two, $three ) = @array[1,2];
my( $five, $six ) = $array[1,2];
my $length_a = @array.length;
my $length_s = $array.length;
my $ref_a = @array;
my $ref_s = $array;
Отсутствие истинного OO
package my_object;
# fake constructor
sub new{ bless {}, $_[0] }
# fake properties/attributes
sub var_a{
my $self = shift @_;
$self->{'var_a'} = $_[0] if @_;
$self->{'var_a'}
}
В Perl6
это записано:
class Dog is Mammal {
has $.name = "fido";
has $.tail is rw;
has @.legs;
has $!brain;
method doit ($a, $b, $c) { ... }
...
}
Плохо разработанные regex функции
/(?=regexp)/; # look ahead
/(?<=fixed-regexp)/; # look behind
/(?!regexp)/; # negative look ahead
/(?<!fixed-regexp)/; # negative look behind
/(?>regexp)/; # independent sub expression
/(capture)/; # simple capture
/(?:don't capture)/; # non-capturing group
/(?<name>regexp)/; # named capture
/[A-Z]/; # character class
/[^A-Z]/; # inverted character class
# '-' would have to be the first or last element in
# the character class to include it in the match
# without escaping it
/(?(condition)yes-regexp)/;
/(?(condition)yes-regexp|no-regexp)/;
/\b\s*\b/; # almost matches Perl6's <ws>
/(?{ print "hi\n" })/; # run perl code
В Perl6
это записано:
/ <?before pattern> /; # lookahead
/ <?after pattern> /; # lookbehind
/ regexp :: pattern /; # backtracking control
/ ( capture ) /; # simple capture
/ $<name>=[ regexp ] /; # named capture
/ [ don't capture ] /; # non-capturing group
/ <[A..Z]> /; # character class
/ <-[A..Z]> /; # inverted character class
# you don't generally use '.' in a character class anyway
/ <ws> /; # Smart whitespace match
/ { say 'hi' } /; # run perl code
Отсутствие нескольких диспетчеризирует
sub f( int $i ){ ... } # err
sub f( float $i ){ ... } # err
sub f($){ ... } # occasionally useful
В Perl6
это записано:
multi sub f( int $i ){ ... }
multi sub f( num $i ){ ... }
multi sub f( $i where $i == 0 ){ ... }
multi sub f( $i ){ ... } # everything else
Плохая перегрузка Оператора
package my_object;
use overload
'+' => \&add,
...
;
В Perl6
это записано:
multi sub infix:<+> (Us $us, Them $them) |
(Them $them, Us $us) { ... }
Обработка строк C
Необходимость иметь дело вручную со строковыми буферами является подверженной ошибкам болью. Так как такое вычисление действительно перемещает и изменяет строки (компьютеры не используются вполне так же для большого материала перемалывания чисел, как люди думали, что они будут путем назад, когда), будет действительно хорошо быть в состоянии использовать управляемые языки, или строка C++ возражает для контакта с ними. Когда я должен выполнить в нем прямо C, как плавать в плывуне.
Ruby имеет много дефектов, связанных с его скоростью, но я не ненавижу тех. Это также имеет дефекты с евангелизмом сообщества, идущим за борт, но это действительно не беспокоит меня. Это то, что я ненавижу:
способ, которым сделана передача блока функциям, глуп. Нет никакой причины, блоки должны быть переданы вне списка параметров или иметь нечетный специальный синтаксис для доступа (уступают). Я имею мнение, что блокам нужно было дать менее неоднозначный синтаксис (или хеши, возможно, использовали различные разделители; возможно, <>, а не {}), и передающий как параметры методам должен был быть точно так же, как все другие параметры.
object.method(1, {|a| a.bar}, "blah")
Эти причуды, как блок должны быть последним переданным параметром, и передача больше чем одного блока отличается с более длинным синтаксисом, действительно раздражайте меня.
C#/.NET:
lock
оператор - вместо этого, у Вас должны быть определенные объекты блокировки, и должны быть методы такой как Acquire
, которые возвращают доступные маркеры блокировки. Заключение: не должно быть монитора для каждого объекта. GetHashCode()
и Equals()
не должен быть в System.Object
- не все подходит для хеширования. Вместо этого имейте IdentityComparer
, который делает то же самое и сохраняет IComparer<T>
, IComparable<T>
, IEqualityComparer<T>
и IEquatable<T>
интерфейсы для пользовательских сравнений. Те были первое, что пришло на ум - спрашивают меня завтра, и я придумаю различные 5:)