Я только что создал проект CloneExtensions
library . Он выполняет быстрый, глубокий клон, используя простые операции присваивания, сгенерированные компиляцией кода времени исполнения выражения.
Как его использовать?
Вместо того, чтобы писать свои собственные методы Clone
или Copy
с тоном назначений между полями и свойствами, сделайте программу для себя, используя дерево выражений. GetClone
метод, помеченный как метод расширения, позволяет просто вызвать его в вашем экземпляре:
var newInstance = source.GetClone();
Вы можете выбрать, что должно быть скопировано с source
на newInstance
, используя CloningFlags
перечисление:
var newInstance
= source.GetClone(CloningFlags.Properties | CloningFlags.CollectionItems);
Что можно клонировать?
Следующие члены класса / структуры клонируются внутри страны:
Насколько это быстро?
Решение быстрее, чем отражение, потому что информация членов должна быть собирается только один раз, прежде чем GetClone
будет использоваться впервые для заданного типа T
.
Он также быстрее, чем на основе сериализации
и более ...
Подробнее о сгенерированных выражениях в документации читайте больше.
Пример отладки образца выражения для List
:
.Lambda #Lambda1(
System.Collections.Generic.List`1[System.Int32] $source,
CloneExtensions.CloningFlags $flags,
System.Collections.Generic.IDictionary`2[System.Type,System.Func`2[System.Object,System.Object]] $initializers) {
.Block(System.Collections.Generic.List`1[System.Int32] $target) {
.If ($source == null) {
.Return #Label1 { null }
} .Else {
.Default(System.Void)
};
.If (
.Call $initializers.ContainsKey(.Constant(System.Collections.Generic.List`1[System.Int32]))
) {
$target = (System.Collections.Generic.List`1[System.Int32]).Call ($initializers.Item[.Constant(System.Collections.Generic.List`1[System.Int32])]
).Invoke((System.Object)$source)
} .Else {
$target = .New System.Collections.Generic.List`1[System.Int32]()
};
.If (
((System.Byte)$flags & (System.Byte).Constant(Fields)) == (System.Byte).Constant(Fields)
) {
.Default(System.Void)
} .Else {
.Default(System.Void)
};
.If (
((System.Byte)$flags & (System.Byte).Constant(Properties)) == (System.Byte).Constant(Properties)
) {
.Block() {
$target.Capacity = .Call CloneExtensions.CloneFactory.GetClone(
$source.Capacity,
$flags,
$initializers)
}
} .Else {
.Default(System.Void)
};
.If (
((System.Byte)$flags & (System.Byte).Constant(CollectionItems)) == (System.Byte).Constant(CollectionItems)
) {
.Block(
System.Collections.Generic.IEnumerator`1[System.Int32] $var1,
System.Collections.Generic.ICollection`1[System.Int32] $var2) {
$var1 = (System.Collections.Generic.IEnumerator`1[System.Int32]).Call $source.GetEnumerator();
$var2 = (System.Collections.Generic.ICollection`1[System.Int32])$target;
.Loop {
.If (.Call $var1.MoveNext() != False) {
.Call $var2.Add(.Call CloneExtensions.CloneFactory.GetClone(
$var1.Current,
$flags,
$initializers))
} .Else {
.Break #Label2 { }
}
}
.LabelTarget #Label2:
}
} .Else {
.Default(System.Void)
};
.Label
$target
.LabelTarget #Label1:
}
}
Что имеет такое же значение, как следующий код c #:
(source, flags, initializers) =>
{
if(source == null)
return null;
if(initializers.ContainsKey(typeof(List))
target = (List)initializers[typeof(List)].Invoke((object)source);
else
target = new List();
if((flags & CloningFlags.Properties) == CloningFlags.Properties)
{
target.Capacity = target.Capacity.GetClone(flags, initializers);
}
if((flags & CloningFlags.CollectionItems) == CloningFlags.CollectionItems)
{
var targetCollection = (ICollection)target;
foreach(var item in (ICollection)source)
{
targetCollection.Add(item.Clone(flags, initializers));
}
}
return target;
}
Разве не совсем так, как вы напишете свой собственный метод Clone
для List
?
Я действительно ненавижу его, когда люди говорят, утончаются, что PHP является ужасным языком, потому что можно записать код, который смешивает представление с логикой, или что это позволяет Вам позволить Внедрение SQL. Это - ничто вообще, чтобы сделать с языком, это - разработчик.
PHP оказался, чтобы быть хорошо масштабируемым: Википедия является одним из самых больших и самых популярных интернет-сайтов, и это выполняет PHP. Достаточно сказанный?
существует много инструментов/библиотек там, которые дают Вам платформу для работы в, делая его менее вероятно, что кто-то запишет плохой, менее - удобный в сопровождении код: посмотрите CakePHP, Symfony, PDO, Присяжного острослова, и т.д. и т.д. и т.д.
Это получило плохой рэп, потому что это - язык, который имеет очень низкие барьеры для доступа: это свободно, можно получить очень дешевый хостинг PHP, , документация является лучшей, чтобы было , существует много учебных руководств онлайн, плюс он делает много вещей очень легким (например: откройте URL и получите содержание файла: file('http://www.google.com');
). Это означает, что много новичков взяло его и сделало много очень сомнительных сайтов с ним, но это собирается произойти с любым языком, который Вы выбираете в качестве своего первого.
Работа с твердой платформой ORM (существует приблизительно 30 вопросов на ТАК, о которых является лучшим), и она будет рассматривать Вас хороший.
Много людей, которые говорят не, использует его, действительно говорят, не используют PHP 4. Это сводится к этому
, можно записать хороший код на любом языке
, и
можно записать плохой код на любом языке
, PHP может очень часто предоставлять себя становлению запутанными библиотеками запутанного кода и подавать 'заявку' действительно просто ряд сценариев (см. Moodle для хорошего примера этого...)
я думаю, что много из 'Не использует PHP для большого материала', прибывает из PHP, изрубленного от, он - исходная цель: язык шаблонной обработки. Который я могу понять, но существует много проектов, которые доказывают, что можно сделать это (Drupal, mediawiki, Facebook).
Theres никакая причина Вы не можете использовать PHP для крупных проектов. В конце концов, Facebook основан на PHP. Будут проблемы однако, но существуют проблемы с любым крупным проектом.
то, Что делает PHP настолько распространяющимся, является низким барьером для доступа и дешевым хостингом. Это работает как расширение Apache, и можно в значительной степени только начать кодировать. Если Вы переходите к большему количеству корпоративных платформ, таких как.Net или Java, у них есть намного более высокий барьер для доступа, но они также идут с большим количеством инфраструктуры, чтобы помочь Вам подать заявки тот масштаб.
, Например, абстракция базы данных в PHP является (по моему скромному мнению), горестной. Это - конкретный поставщик. С MySQL люди склонны делать вещи как:
function get_users($surname) {
mysql_query("select * from users where surname = '$surname'");
...
}
, который плох по нескольким причинам:
mysql_escape_string()
, но Вы будете удивлены, как часто люди не делают этого); и Лично я предпочитаю mysqli по всем вышеупомянутым причинам, но он имеет свои собственные проблемы: а именно, тот LONGTEXT использования поля разрушают mysql и сделали, с тех пор, по крайней мере, 2005 со все еще никакие не фиксируют (да, я и несколько других повысили ошибку).
Сравнивают это с Java (с которым я более знаком), и JPA, или Ibatis являются значительно лучшими решениями ORM с более высокими затратами на запуск, но они помогут Вам на масштабе предприятия.
, Таким образом, Вам не мешают делать крупные проекты на PHP. Это просто более твердо в этом, необходимо сделать все больше больше работы сами для тиражирования то, что другие платформы предоставляют Вам.
Однако PHP + memcached/APC + beanstalkd имеет большое значение.
, О, это - другая проблема: PHP действительно не поддерживает фоновую обработку или поточную обработку. Вам нужно что-то еще для того (или автономные сценарии). Если Вы используете что-то еще, почему бы не использовать это для веб-материала также (например, Java, Ruby.Net, и т.д.)?
Для меня худший грех PHP связывается представления с бизнес-логикой. Не то, чтобы Вы не можете записать его лучшим способом, но это не призывает Вас к, и если что-нибудь это призывает Вас не к.
большое количество А уязвимостей системы обеспечения безопасности связаны с сайтами PHP, также. Я не могу доказать, что это непропорционально (в конце концов, много сайтов записано в PHP), но я подозреваю, что это. Если я прав, то, так как уязвимости системы обеспечения безопасности являются классом ошибки, я подозреваю, что сайты PHP имеют тенденцию быть большим количеством багги в целом также.
(я не думаю, что, указывая на несколько больших сайтов и говоря им удалось сделать это в PHP, любой аргумент против этого, между прочим. Это немного похоже на высказывание, что сигареты не вызывают рак, потому что Ваш ближайший копченый сосед и жил, чтобы быть 100.)
Как вопрос я связался , был удален, я помещу часть его сюда:
я сделал издевательский комментарий в другом потоке вопроса, назвав PHP ужасным языком, и это спустилось - проголосовавший как сумасшедший. По-видимому, существует много людей здесь, которые любят PHP.
, Таким образом, мне по-настоящему любопытно. Что я пропускаю? Что делает PHP хорошим языком?
Вот мои причины неприязни его:
PHP имеет непоследовательное именование встроенных и библиотечных функций. Предсказуемые шаблоны именования важны в любом дизайне.
PHP имеет непоследовательное упорядочивание параметра встроенных функций, например, array_map по сравнению с array_filter, который является раздражающим в простых случаях и повышает все виды неожиданного поведения или хуже.
разработчики PHP постоянно удерживают от использования встроенные функции и функциональность низшего уровня. Хороший пример - когда они удержали от использования передачу ссылкой для функций. Это создало кошмар для любого делающего, скажем, функционируют обратные вызовы.
отсутствие А соображения в модернизации. Вышеупомянутая депрекация устранила способность к, во многих случаях, обеспечьте значения ключевого слова по умолчанию для функций. Они зафиксировали это в PHP 5, но они удержали от использования передачу ссылкой в PHP 4!
Плохое выполнение пространств имен (раньше никакие пространства имен вообще). Теперь, когда пространства имен существуют, что мы используем в качестве разыменовать символа? Обратная косая черта! Символ, используемый универсально для выхода, даже в PHP!
Чрезмерно широкое неявное преобразование типов приводит к ошибкам. У меня нет проблемы с неявными преобразованиями, скажем, плавания к целому числу или назад снова. Но PHP (длятся, я проверил), счастливо попытается волшебно преобразовать массив в целое число.
Плохая производительность рекурсии. Рекурсия является существенно важным инструментом для записи на любом языке; это может сделать сложные алгоритмы намного более простыми. Плохая поддержка непростительна.
Функции нечувствительны к регистру. Я понятия не имею, что они думали на этом. Язык программирования является способом определить поведение и к компьютеру и к средству чтения кода без неоднозначности. Нечувствительность к регистру представляет много неоднозначности.
PHP поощряет (практически требует), связь обработки с представлением. Да, можно записать PHP, который не делает так, но на самом деле легче записать код в неправильном (с точки зрения саунд-дизайна) способ.
производительность PHP плачевна без кэширования. Кто-либо продает коммерческий продукт кэширования за PHP? О, посмотрите, разработчики PHP делают.
Худший из всех, PHP убеждает людей, что разработка веб-приложений легка. И это действительно прилагает большую часть усилия, включенного намного легче. Но факт, разрабатывая веб-приложение, которое и безопасно и эффективное, очень трудная задача.
, убеждая так многих заняться программированием, PHP преподавала всю подгруппу дурных привычек программистов и плохого дизайна. Это предоставило им доступ к возможностям, которые они испытывают недостаток в понимании для использования безопасно. Это привело к репутации PHP, как являющейся небезопасным.
(Однако я с готовностью признаю, что PHP не более или менее безопасен, чем какой-либо другой язык веб-программирования.)
, Что я пропускаю о PHP? Я вижу органически выращенную, плохо управляемую путаницу языка, это порождает бедных программистов.
Так убеждают меня иначе!
<час>я попробую отвечать на каждый из Ваших пунктов маркированного списка
, PHP имеет непоследовательное именование встроенных и библиотечных функций. Предсказуемые шаблоны именования важны в любом дизайне.
я и любите и ненавидьте эту тему. Поскольку в ее ядре, эта проблема корректна. Почему некоторое разделение функции bi-слова с подчеркиванием, и некоторые не? Почему игла и параметры стога сена подкачивают положения в подписи аргумента иногда? Это смешно. Но в конце дня... это действительно имеет значение? Мой IDE с intellisense и php.net просто щелчок браузера далеко, это является просто не настолько большим из соглашения. Действительно ли это - отрицание против PHP как язык? Да. Это препятствует моей способности быть эффективным программистом? Нет.
разработчики PHP постоянно удерживают от использования встроенные функции и функциональность низшего уровня. Хороший пример - когда они удержали от использования передачу ссылкой для функций. Это создало кошмар для любого делающего, скажем, функционируют обратные вызовы.
Лично, я думаю, что это не положительная сторона. Депрекация необходима для эволюции языка, особенно тот, который имеет столько же хлама, сколько PHP делает. PHP получает много зенитного огня для "упрощения быть плохим программистом*", но в то же время группа PHP также входит в проблему, когда они пытаются удалить глупые конструкции из языка, такие как передача ссылкой времени вызова. Устранение передачи ссылкой времени вызова было одним из лучших перемещений, которые они когда-либо делали. Не было никакого более легкого способа для разработчика новичка выстрелить себе в ногу, чем с этой "функцией".
отсутствие А соображения в модернизации. Вышеупомянутая депрекация устранила способность к, во многих случаях, обеспечьте значения ключевого слова по умолчанию для функций. Они зафиксировали это в PHP 5, но они удержали от использования передачу ссылкой в PHP 4!
я не думаю, что существует общее отсутствие соображения вообще, я думаю, что Вы просто погорели этим конкретным изменением и были оставлены с кислым вкусом во рту. Изменения языка часто являются известными месяцами если не годы загодя. Руководство по миграции было предоставлено для перемещения от 4 до 5, и различия в версии документируются в руководство. Передача ссылкой времени вызова была ужасной "функцией" и не дает разработчику выразительного питания, которое они не могут получить другими средствами. Я рад, что этого не стало (наряду с другим дерьмом как волшебные кавычки)
Плохое выполнение пространств имен (раньше никакие пространства имен вообще). Теперь, когда пространства имен существуют, что мы используем в качестве разыменовать символа? Обратная косая черта! Символ, используемый универсально для выхода, даже в PHP!
я смешал чувства об этом. Часть меня думает, "кто заботится, символьный выход не имеет никакого значения за пределами строки так или иначе", и часть меня думает, "конечно, что они могли использовать что-то лучше". Но могли они? Я не знаю, я не разработчик для синтаксического анализатора Зенда. Действительно ли это - огромный контроль, что, пока 5.3 PHP никогда не имели пространства имен вообще? Да, абсолютно.
Чрезмерно широкое неявное преобразование типов приводит к ошибкам. У меня нет проблемы с неявными преобразованиями, скажем, плавания к целому числу или назад снова. Но PHP (длятся, я проверил), счастливо попытается волшебно преобразовать массив в целое число.
я думаю, что нормально не соглашаться с тем, как PHP делает это, но не соглашается, что это делает язык "плохо". Но спросите меня, сколько я хочу сидеть в этой теме и обсудить о слабом по сравнению со строгим контролем типов. (P.S. Я не делаю, во всем ) Для записи: PHP выпустит погрешность нивелировки E_WARNING, когда тип аргумента будет иметь значение, и не может решенным приведением.
Плохая производительность рекурсии. Рекурсия является существенно важным инструментом для записи на любом языке; это может сделать сложные алгоритмы намного более простыми. Плохая поддержка непростительна.
PHP является DSL для сети. Я делал его полный рабочий день в течение 8 лет и возможно использовал рекурсию 4 или 5 раз, обычно для некоторого типа раздражающего каталога или обхода XML. Просто не шаблон необходим для веб-разработки настолько часто. Я не извиняю медленную производительность, но это - академическая проблема намного больше, чем это - производственная проблема. При необходимости в действительно мощной рекурсивной производительности PHP уже является неправильным языком для Вас.
Функции нечувствительны к регистру. Я понятия не имею, что они думали на этом. Язык программирования является способом определить поведение и к компьютеру и к средству чтения кода без неоднозначности. Нечувствительность к регистру представляет много неоднозначности.
я полностью 100% соглашаются с этим.
PHP поощряет (практически требует), связь обработки с представлением. Да, можно записать PHP, который не делает так, но на самом деле легче записать код в неправильном (с точки зрения саунд-дизайна) способ.
*Hmmm, эта тема звучит отчаянно знакомой...
, Но серьезно, я нахожу его замечательным, что люди будут жаловаться на язык, который абсолютно 100% позволять Вам реализовывать любую выходную систему, которую Вы хочет (чистый объем и стиль PHP, который шаблонная обработка одних только систем говорила с этим) - ИЛИ - пропускать все эти издержки и просто производить непосредственно. Это делает PHP плохо вообще. Это быть часть того, что делает пользу PHP.
производительность PHP плачевная без кэширования. Кто-либо продает коммерческий продукт кэширования за PHP? О, смотрит, разработчики PHP делает.
Вы имеет в виду кэширование байт-кода (как акселератор), или кэширование вывода?
, Если первый, то я действительно знает, о каком количестве я заботящийся об этой теме. Акселераторы свободные и легкие работать. Мы спорил о том, почему это быть часть языка, но в конце, я думает, что это имеет значение очень.
, Если Вы говорящие о кэшировании вывода тогда, я знает, что говорит Вам. ЛЮБОЙ веб-проект со значительным транспортным кэшированием потребностей (отбирать подкаст № 27, например). Это PHP-конкретным-вопросом во всем .
, Таким образом, я думает, что Вы считает PHP "плохим" языком очень академическим способом. И в Вашем предыдущем сообщении Вы, вероятно, проваливаемые людьми как я, которые использует PHP, чтобы "добивающиеся цели".
<час>Все Ваши критические замечания (и еще немного) допустимые. Вам разрешил и даже, как ожидаемый, ненавидеть PHP.
, Но, с другой стороны, это обладает некоторыми преимуществами:
Наконец, Вы преодолевает многих, если бы не все оборотные стороны путем записи хорошего кода Вы пишет на каком-либо другом языке. Вы пишет тело, безопасный и хороший код обоняния в PHP, который много раз работает быстрее и был легче размещать и масштабировался, чем много альтернатив.
<час>, Что я пропустил о PHP? Я видя органически выращенную, плохо управляемую путаницу языка, это породило бедных программистов.
Простой. То, что бедные программисты существуют очень защитными о своем языке.;) PHP легко, намного легче, чем альтернативы, и как только Вы изучаете его, это точно очевидно 1) что случилось с PHP, 2) как альтернативы являются лучше и 3) как переключается на и - одна из альтернатив.
И возможно то, что, ну, в общем, что имели альтернативы люди? ASP? Это имеет много проблем самостоятельно, от неспособности работало на большинстве веб-серверов (Apache), к некоторым смешным и сверхспроектированным проектным решениям самостоятельно (веб-формы? Состояние отображения? Ajax, где Ваши асинхронные" запросы прервите и работайте последовательно ?) Ruby on Rails? Ну, возможно, кроме того, сколько веб-серверов поддерживало его снова? Это точно легко доступно в данный момент. И это не медленно. Таким образом, возможно, "сила" PHP состояла действительно в том, что никакой хороший альтернатива будет существовать. По крайней мере, это быть то, почему я избегаю всего веб-программирования когда вообще возможный. PHP является, и я слишком увлечен ни одной из альтернатив также.
PHP имеет столько фундаментальных проблем, что это даже не забавно. От отсутствия поддержки unicode, ко многим неявным преобразованиям типов, которые часто приводят к неожиданным дырам в системе безопасности к полному смешиванию представления и... всего остального, или к модулю базы данных по умолчанию, который не делал (в последний раз я являюсь) использование параметризовать запросы. Мы говорим о языке, сделанном для двух вещей, доступа к базе данных, и генерируем HTML, и который быть ужасен в обоих.
Это не просто противная путаница, язык, разработанный людьми, которые не являются или способные, для разработки языка.;)
<час>Проверьте этот подобный вопрос - , Может сайты уровня предприятия дескриптора PHP, а также Резюме Java
- Facebook, Википедия, Yahoo.com, Digg, Flickr и много других гигантских сайтов работают на PHP. Если Вы когда-нибудь близко подходите к чему-то вроде создания того калибра, можно все еще пребывать в уверенности, что можно добраться там с PHP.
то, Насколько удобный в сопровождении, растяжимый, надежный, безопасный и производительный Ваши приложения будут, полностью ваше дело и является агностиком языка. В пользу PHP, хотя, это имеет очень удобные инструменты для создания веб-приложений.
Для меня, и говорящий о больших или даже огромных проектах, это (прежде всего), сводится к одному слову: Зависимости .
проблема с языком сценариев похожа в каждой вещи в мире: самым большим преимуществом является самый большой недостаток одновременно.
самое большое преимущество должно кодировать свободный и быстрый. Просто запишите сценарий, и он будет сервер это быть целью. Никакое необходимое многословие, просто не кодируйте.
самый большой недостаток должен, в некотором смысле, проверить, не нарушает ли этот сценарий другие сценарии. Или лучше: Измените старый сценарий, на который полагаются другие. Вы уверены, что все зависимости действительно удаются, как Вы требовали?
Это не верно для "нормального" поколения веб-страницы, безотносительно нормальных средств здесь. Но у нас есть продукт, полагающийся на некоторые 500k строки исходного кода, с настройками для клиентов, состоящих из дополнительные 100k строки кода, также. И я смертельно рад, что компилятор проверяет все зависимости и предупреждает/ошибки меня в случае, если я сделал что-то не так (как, говоря самый низкий уровень здесь, введя переменный или вызов метода с опечаткой).
я думаю это и то, что другие языки обеспечивают более простые к использованию "enterprisy" функции по своему характеру (т.е. серверы приложений для "использований банка") излагает его кратко, почему многие не видят PHP в большом (или лучше: огромный) проекты.
Наша компания выполняет несколько веб-сайтов большого выхода с помощью PHP и не имела никаких проблем, которые были связаны с языком.
Это все хорошие ответы.
я был новичком. Я только кодировал в течение 5 лет, но я непосредственно поддерживаю и управляю 85 малыми и большими веб-сайтами, и я скажу Вам, что, потенциал, который будет преследуемым при наличии веб-сайта вниз в течение дня, внесет много в Ваше требование изучить, как к и делают лучший код.
хорошо услышать, что установленные разработчики совместно используют свои мысли об этом вопросе. Я не думаю, что PHP является лучшим, но кажется, что мои инвестиции в "лучшие практики" хорошо подаются.
Спасибо все!
Есть что-то в конструкции языка PHP, что мне не подходит. Например, название функции. Не рекомендуется использовать несколько способов называть функцию на одном языке. Смесь подчеркивания (имя_функции), слова слипаются (имя функции) и т. Д. Я имею в виду, что это действительно беспорядок. Слишком много функций, которые очень похожи или выполняют одни и те же действия, но их названия сбивают с толку. Это не характерно для хорошего языка программирования.
В больших развертываниях язык должен быть достаточно простым и специфичным для написания. То, что PHP опускает, например, объявление типов переменных, становится очень трудным для понимания и решения в дальнейшем.
Другой момент - это постоянное добавление функций и отмена других. Предполагается, что добавление ООП в PHP 5 упростит жизнь программистам, но как насчет соображений обратной совместимости?
Основная причина того, что этот язык программирования такой, каков он есть, связана с его происхождением: персональная домашняя страница. Он не был разработан для крупных развертываний.
Я знаю, что прилагаются большие усилия, чтобы сделать этот язык языком корпоративного уровня, и лично я жду достаточно хорошего серверного языка программирования с открытым исходным кодом; но до этого дня под мостом будет много воды.