Как вопрос я связался , был удален, я помещу часть его сюда:
я сделал издевательский комментарий в другом потоке вопроса, назвав 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, и который быть ужасен в обоих.
Это не просто противная путаница, язык, разработанный людьми, которые не являются или способные, для разработки языка.;)
This snippet will retrieve information about installed printers:
using System.Drawing.Printing;
//...
foreach (string printerName in PrinterSettings.InstalledPrinters)
{
// Display the printer name.
Console.WriteLine("Printer: {0}", printerName);
// Retrieve the printer settings.
PrinterSettings printer = new PrinterSettings();
printer.PrinterName = printerName;
// Check that this is a valid printer.
// (This step might be required if you read the printer name
// from a user-supplied value or a registry or configuration file
// setting.)
if (printer.IsValid)
{
// Display the list of valid resolutions.
Console.WriteLine("Supported Resolutions:");
foreach (PrinterResolution resolution in
printer.PrinterResolutions)
{
Console.WriteLine(" {0}", resolution);
}
Console.WriteLine();
// Display the list of valid paper sizes.
Console.WriteLine("Supported Paper Sizes:");
foreach (PaperSize size in printer.PaperSizes)
{
if (Enum.IsDefined(size.Kind.GetType(), size.Kind))
{
Console.WriteLine(" {0}", size);
}
}
Console.WriteLine();
}
}
The other option is to use WMI. Right Click Project > Add Reference > Select .NET Tab > System.Management
using System.Management;
// ...
private List<string> GetPrinters()
{
List<string> printerNames = new List<string>();
// Use the ObjectQuery to get the list of configured printers
System.Management.ObjectQuery oquery =
new System.Management.ObjectQuery("SELECT * FROM Win32_Printer");
System.Management.ManagementObjectSearcher mosearcher =
new System.Management.ManagementObjectSearcher(oquery);
System.Management.ManagementObjectCollection moc = mosearcher.Get();
foreach (ManagementObject mo in moc)
{
System.Management.PropertyDataCollection pdc = mo.Properties;
foreach (System.Management.PropertyData pd in pdc)
{
if ((bool)mo["Network"])
{
printerNames.Add(mo[pd.Name]);
}
}
}
return printerNames;
}
Here's another snippet which shows more properties:
static void PrintProps(ManagementObject o, string prop)
{
try { Console.WriteLine(prop + "|" + o[prop]); }
catch (Exception e) { Console.Write(e.ToString()); }
}
static void Main(string[] args)
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Printer");
foreach (ManagementObject printer in searcher.Get())
{
string printerName = printer["Name"].ToString().ToLower();
Console.WriteLine("Printer :" + printerName);
PrintProps(printer, "Caption");
PrintProps(printer, "ExtendedPrinterStatus");
PrintProps(printer, "Availability");
PrintProps(printer, "Default");
PrintProps(printer, "DetectedErrorState");
PrintProps(printer, "ExtendedDetectedErrorState");
PrintProps(printer, "ExtendedPrinterStatus");
PrintProps(printer, "LastErrorCode");
PrintProps(printer, "PrinterState");
PrintProps(printer, "PrinterStatus");
PrintProps(printer, "Status");
PrintProps(printer, "WorkOffline");
PrintProps(printer, "Local");
}
}