Я знаю, что это звучит как назойливый вопрос, но позвольте мне объяснить, откуда я.
После колледжа я устроился на работу в магазин PHP. Я проработал там полтора года и подумал, что узнал все, что нужно, о программировании.
Затем я устроился на работу в отдел внутренней разработки с одним человеком в крупную корпорацию, где вся работа была на C#. Придерживаясь этой должности, я начал читать кучу блогов и книг и быстро понял, насколько я был неправ, думая, что знаю все. Я узнал о модульном тестировании, паттернах внедрения зависимостей и декораторах, принципах проектирования слабой связи, спорах о компоновке над наследованием и т. д. И т. Д. - я все еще очень сильно поглощаю все это. Излишне говорить, что мой стиль программирования полностью изменился за последний год.
Теперь я обнаружил, что беру php-проект, пишу код для стартапа друга, и чувствую себя полностью ограниченным, в отличие от программирования на C#. Меня действительно беспокоит, что ко всем переменным в области класса нужно ссылаться, добавляя «$ this->». Меня раздражает, что ни одна из IDE, которые я пробовал, не имеет очень хорошего intellisense и что мои методы модульных тестов SimpleTest должны начинаться со слова «test». Меня сводит с ума тот факт, что динамическая типизация не позволяет мне неявно указывать, какой тип параметра ожидает метод, и что вам нужно написать оператор switch для перегрузки метода. Я терпеть не могу, что у вас не может быть вложенных пространств имен и вам нужно использовать оператор :: для вызова конструктора базового класса.
Сейчас у меня нет намерения начинать дискуссию о PHP и C#, скорее я хочу сказать, что я уверен, что есть некоторые функции PHP, о которых я либо не знаю, либо о которых я не знаю, но которые не используются должным образом. Я нахожусь в своей вселенной C#, и мне трудно видеть что-то за стеклянной чашей.
Итак, я спрашиваю, какие ваши любимые особенности PHP? Что вы можете сделать в нем, чего не можете или что сделать в языках .Net является более сложным?
Эти темы довольно забавные ... Потому что для команды, в которой я работаю, «скрытая функция» - это кодовая фраза, означающая «ошибка». И знаете что ... Иногда обнаружение скрытой функции не всегда хорошо ...
@Ganesh ошибка одного человека - скрытая особенность другого человека ...






Вот один, мне нравится, что установка значений по умолчанию для параметров функции, которые не поставляются, намного проще:
function MyMethod($VarICareAbout, $VarIDontCareAbout = 'yippie') { }
Как ни странно, на прошлой неделе я увидел эту «скрытую функцию» в Google Reader. Я не понимаю, что в этом скрыто - это базовый синтаксис. Например, попробуйте if ($ var = true).
Легче чего? Эта функция есть в большинстве языков.
Проще, чем C# (и я думаю, C++ и Java)
C++ поддерживает значения параметров по умолчанию.
Реальные объектно-ориентированные языки поддерживают перегрузку имен методов, благодаря чему эта функция работает одинаково.
C# вообще не поддерживает значения по умолчанию. вам нужно написать перегруженную функцию и всегда объявлять значение, которое просто громоздко
C# будет поддерживать значения по умолчанию в версии 4.0. Хотя предположительно в основном для поддержки COM-взаимодействия
Это то, к чему я привык в C++ и Python. Аргументы по умолчанию - это одна из вещей, которые я считаю упущениями в некоторых языках, а не просто интересными функциями на других языках.
Магические методы - это сквозные методы, которые, помимо прочего, вызываются всякий раз, когда вы вызываете метод, который не существует, или назначаете или читаете свойство, которое не существует.
interface AllMagicMethods {
// accessing undefined or invisible (e.g. private) properties
public function __get($fieldName);
public function __set($fieldName, $value);
public function __isset($fieldName);
public function __unset($fieldName);
// calling undefined or invisible (e.g. private) methods
public function __call($funcName, $args);
public static function __callStatic($funcName, $args); // as of PHP 5.3
// on serialize() / unserialize()
public function __sleep();
public function __wakeup();
// conversion to string (e.g. with (string) $obj, echo $obj, strlen($obj), ...)
public function __toString();
// calling the object like a function (e.g. $obj($arg, $arg2))
public function __invoke($arguments, $...);
// called on var_export()
public static function __set_state($array);
}
Здесь разработчик C++ может заметить, что PHP допускает перегрузку некоторых операторов, например. () или (string). На самом деле PHP допускает еще большую перегрузку, например, оператор [] (ArrayAccess), языковая конструкция foreach (Итератор и Итератор) и функция count (Счетный).
В качестве полезного примера того, что можно достичь с помощью магических методов, goto phpcodetips.blogspot.com/2008/07/domain-model-validation.htm l
Не согласен. Это намного слабее, чем аналогичные возможности в Smalltalk, Ruby и Python (и предположительно он был скопирован с одного из них).
Тот факт, что реализация этой функции в PHP слабее, чем в других языках, не делает ее менее полезной в PHP.
__call() отлично подходит для фреймворков с картой domain.com/controller/method/
Магические методы также чертовски медленны. Используйте их осторожно.
Медленно по сравнению с чем: garfieldtech.com/blog/magic-benchmarks да, медленнее, но не заметно. Конвейер будет играть большую роль, чем магические методы, если вы не работаете с очень большими нагрузками.
Полезно, например, для логики уровня представления и реализации миксинов, известных в Ruby.
Кто-нибудь еще думает, что магические методы фантастически опасны? Они не заполняются автоматически в выбранной вами IDE, если вы не знаете, что есть какая-то магия, тогда выполнение кода на глаз невозможно, вы можете в конечном итоге использовать их случайно вместо одноименного немагического метода ...
По сути, это похоже на прямой вызов в Objective-C.
А начиная с php 5.3 в список магических функций добавлен «__invoke».
Я обновил список, включив в него все магические методы, и добавил параграф о других методах функциональности перегрузки.
На каком языке разрешена перегрузка операторов, а нет допускает перегрузку этих операторов?
Обработчики потоков позволяет вам расширить «файловую систему» логикой, которую, насколько я знаю, довольно сложно реализовать на большинстве других языков.
Например, с помощью Обработчик потока MS-Excel вы можете создать файл MS Excel следующим образом:
$fp = fopen("xlsfile://tmp/test.xls", "wb");
if (!is_resource($fp)) {
die("Cannot open excel file");
}
$data= array(
array("Name" => "Bob Loblaw", "Age" => 50),
array("Name" => "Popo Jijo", "Age" => 75),
array("Name" => "Tiny Tim", "Age" => 90)
);
fwrite($fp, serialize($data));
fclose($fp);
Я считаю, что среда KIO также позволяет это делать, но это доступно только для настольных приложений на основе KDE.
ИМХО, наличие правильного объектно-ориентированного подхода было бы намного разумнее, чем этот беспорядок с обработчиками потоков. Да, это мило - иметь возможность читать / писать файлы Excel, но должно ли это так работать?
Может быть, и так, но этот подход инкапсулирует сложность в интерфейсе, который является общим для большинства разработчиков PHP ... не требуя от них изучения объектно-ориентированных концепций, которые могут быть им недоступны.
Если вы работаете с Amazon S3, обратите внимание на Zend_Amazon_S3, который предоставляет потоковый интерфейс для URL-адресов, таких как 's3: // {bucket-name} / path'.
Я использовал это, чтобы создать простой DSL для моего уровня представления, просто прочитав файл PHP, сделав некоторую замену строки и передав ее через eval (). Например, я сделал так, что могу использовать короткие теги всякий раз, когда захочу, и делаю @ -> someVar, чтобы иметь доступ к данным на уровне представления.
не php-кодировщик, но разве в этом фрагменте кода отсутствуют закрывающие скобки для трех средних строк array(?
Некоторые потоки также доступны для pop и imap. Действительно убийца!
@Allain Lalonde: Я не думаю, что тот, кто не понимает концепции ООП, должен писать код такой сложности. Кроме того, как этот метод сочетается с другими обработчиками потоков? Что, если я захочу загрузить этот файл XLS через ftp: //?
Документация. документация получает мой голос. Я не встречал более подробной онлайн-документации по языку программирования - все остальное мне нужно собрать воедино с различных веб-сайтов и страниц руководства.
Я согласен. Возможность набрать www.php.net/function_name и в большинстве случаев получать ссылку - это здорово.
эх, мне нравится руководство и все такое, но было бы лучше, если бы все было не просто глобальным. Не говоря уже о том, что названия некоторых функций настолько произвольны, что иногда бывает сложно найти то, что вам нужно.
В большинстве IDE есть функция поиска вручную. В моей IDE (PhpDesigner), если вы вводите имя функции и набираете (), она показывает вам ожидаемые аргументы во всплывающей подсказке. Если вы выберете функцию и нажмете f1, отобразится страница руководства для этой функции в файле .chm.
Это отличная функция PHP, но я бы не стал называть ее скрытой ... Если вы когда-либо искали в Google параметры метода и т. д., Вы оказались бы на php.net.
Истинный; Однако вопрос, на который я ответил, был озаглавлен «Какие особенности языка PHP вам нравятся больше всего?» и документация, безусловно, относится к этим критериям.
Я тоже согласен. Самое замечательное в руководстве - это комментарии пользователей. Я редко видел, чтобы они были в других документах. Они могут содержать настоящие драгоценные камни. Единственным недостатком является то, что ИМХО они слишком рано подрезают.
Я был бы признателен, если бы они организовали ссылку на функцию немного лучше и разделили ее на темы. Особенно следует разделять классы, связанные с конкретными базами данных и другими внешними технологиями, потому что они используются редко, а их много.
MSDN - обширный и в значительной степени превосходный справочник (включая HOWTO и руководства). Меня шокирует тот факт, что, несмотря на это, разработчики php считают документацию самой лучшей особенностью php.
@Phoexo "немного менее читабельный" ??? Я никогда не понимал и никогда не пойму MSDN, а документация PHP проста и понятна.
Без сомнения, PHP прост и понятен, но MSDN также является хорошим источником информации и ответит на большинство ваших вопросов.
Система комментариев потрясающая; Я бы хотел, чтобы у Sun было это для их онлайн-документации Javadoc, хотя есть Docjar (но было бы лучше на веб-сайте Sun из-за большего количества посетителей).
@wallacoloo вопрос, на который я ответил, был озаглавлен "Какие особенности языка PHP вам больше всего нравятся?" и документация, безусловно, относится к этому
Не согласен. Единственная причина, по которой документация "хороша", заключается в том, что некоторые комментарии пользователей закрывают все дыры в официальных примечаниях.
Да, документация PHP хороша, потому что она охватывает большинство из 9000 граничных случаев каждой функции, и даже больше описано в комментариях.
Манипуляции с массивами.
Тонны инструментов для работы с массивами и управления ими. Возможно, он не является уникальным для PHP, но я никогда не работал с языком, который упростил бы его.
что например? Мне кажется, что все функции неудобно названы и расположены в глобальном пространстве имен. Кроме того, я не могу придумать ничего, что было бы так просто на другом языке, кроме, может быть, $ arr [] = $ newvalue для добавления значений - это круто
Что ж, массив PHP - это структура данных, которую можно легко использовать как стек, очередь, двухстороннюю очередь, список, хеш-таблицу и т. д. Он действительно довольно гибкий для большинства общих нужд, не прибегая ни к чему другому, кроме функций array_ *.
Python делает массивы (в виде списков и кортежей) намного лучше, чем PHP.
На самом деле вы не совсем правы в том, что не можете указать, какие типы ожидает метод, он действительно работает так, как вы ожидаете.
function foo ( array $param0, stdClass $param1 );
Примечание: Работает только для имен «массив» и объектов.
И так далее, и вы даже можете передавать свои собственные классы в качестве ожидаемых параметров. Вызов методов / функций с чем-то другим приведет к фатальной ошибке.
Еще один намек на хороший intellisense в PHP. Мы используем ZendStudio, и на самом деле он будет работать намного лучше, если вы напишете хорошие PHPDocs для своих методов, он будет учитывать их при намеках.
Согласно ch2.php.net/language.oop5.typehinting, «строка» не поддерживается для подсказки типов. "массив" поддерживается начиная с PHP 5.1, а определенные типы объектов поддерживаются начиная с 5.0.
Чтобы усилить JW, скалярные типы не поддерживаются при указании типов (за исключением массивов), однако все типы поддерживаются при приведении типов.
Я был с вами до тех пор, пока вы не предположили, что ZendStudio - это даже удаленно проходимая IDE.
Подбор текста для скаляров будет доступен с PHP 5.4.
Кроме того, в примечании говорится: «Это работает только для имен массивов и объектов». но чтобы быть полностью педантичным, он должен читать: «Это работает только для« массивов »и имен классов».
Веб-пространство с поддержкой PHP обычно дешевле, чем что-то с (asp) .net. Вы мог бы называете это функцией ;-)
Кроме того, гораздо дешевле установить несколько серверов, если вам не нужно платить за Windows Server на каждом из них.
Единственное место, где я знаю, где Windows является рентабельной, - это университет, который получает скидки STEEEEP на серверное программное обеспечение, поскольку для моего отдела дешевле купить 100 копий Windows, чем обучать наших администраторов работе с Linux (что частично мне грустно, но их настройки Windows чистые и хорошо настроены).
Пока, но переключиться нужно только один раз, а новые лицензии рано или поздно придется покупать ...
Переменные переменные и функции без сомнения!
$foo = 'bar';
$bar = 'foobar';
echo $$foo; //This outputs foobar
function bar() {
echo 'Hello world!';
}
function foobar() {
echo 'What a wonderful world!';
}
$foo(); //This outputs Hello world!
$$foo(); //This outputs What a wonderful world!
Та же концепция применяется к параметрам объекта ($ some_object -> $ some_variable);
Очень очень хорошо. Сделать кодирование с помощью циклов и шаблонов очень простым, и это быстрее и лучше под контролем, чем eval (спасибо @Ross и @Joshi Spawnbrood!).
Обожаю эти! Потребовались минуты, чтобы сбить меня с толку, годы, чтобы научиться справляться.
Неустранимая ошибка PHP: вызов неопределенной функции foobar! (); Поместите $$ перед foo ();
Также скажите больше под контролем, чем "eval ()" !!
переменные переменные фактически делают код менее читаемым и более подверженным ошибкам.
Хорошо ... хорошо ... это больно. Как сказал Эльзо, менее читабельный, беспорядочный, а значит, и плохой. Это НЕ Perl.
Чем больше гибкости, тем сложнее. Но также больше гибкости :)
И люди реально этим пользуются? Человек, я бы не хотел читать эти источники.
Переменные переменные - одна из худших возможностей PHP.
часто беспорядок, но в очень немногих случаях действительно хорошая помощь
9 Из 10 случаев переменные переменные лучше заменять массивами, чтобы у вас были все данные в одном месте, вы могли перебирать их и так далее. Только в некоторых очень специфических обстоятельствах они могут быть полезны.
Пожалуйста, не заставляйте новичков использовать эту «функцию».
Переменные переменные - это, по сути, двойные указатели. Функции переменных - это просто указатели на функции. Эти концепции существуют уже много лет с тех пор, как C.
@Alex - Да, за исключением PHP, новички могут использовать его и принимать пользовательский ввод, что, в свою очередь, заставляет меня помогать этим людям.
call_user_func () - еще один возможный заменитель некоторых функций переменных.
Пожалуйста, как минимум напишите ${$a}. Просто чтобы остальные из нас знали, что что-то происходит, и два $$ не просто свернуты в один.
Я мало что знаю о PHP, но реализация ссылок (или их использование, если они уже существуют) было бы лучше путь, чем делать это таким образом.
Для чего, черт возьми, это можно использовать? Может кто-нибудь объяснить это?
@Emil, одним из примеров может быть вызов шаблона, имя которого хранится в базе данных.
ХОРОШИЙ:
ПЛОХО:
Согласитесь, что Плохой №1, но, конечно, Плохой №2 - это не ошибка языка, а ошибка программиста? является можно написать красивый PHP ... честно!
Я думаю, что меня больше, чем непоследовательное именование, раздражает непоследовательный порядок аргументов. Например, функции поиска по строкам - сначала идет стог сена или иголка? В некоторых функциях порядок изменился довольно давно - также некоторые функции принимают их в любом порядке для совместимости.
Не уверен, что это скрытые возможности PHP ...
specifying implicitly which parameter type a method expects
На самом деле, это частично возможно (по крайней мере, в PHP5) - вы можете указать тип для массива и параметры объекта для функций и методов, хотя вам не повезло в случае скалярных типов.
class Bar
{
public function __construct(array $Parameters, Bar $AnotherBar){}
}
Помимо этого и магических методов, упомянутых Алленом, я также считаю незаменимыми интерфейсы, предоставляемые SPL (стандартной библиотекой PHP) - вы можете реализовать необходимые методы в своем классе, например, я особенно люблю интерфейсы ArrayAccess и Iterator, которые позволяют используя такой объект, как ассоциативный массив, или перебирая его, как любой простой массив.
"хотя тебе не повезло со скалярными типами" << Да, тоже отстой. Я работаю в основном в магазине PHP, и мы хотели начать писать все наши параметры методов / функций PHP с типами в качестве хорошей практики кодирования. Мы закончили тем, что не сделали этого, когда поняли, что не сможем делать такие вещи, как function foo (int a, int b, Bar c) {}
Ваш пример вводит в заблуждение. Предоставленный вами код выполняет приведение типов, которое поддерживает скалярные типы. (int)$i вернет int (а не строковое представление), а (Bar)$i вернет Bar или отказ. Подсказка типов выполняется на уровне определения функции (function foo($a, array $b, Bar $c)) и поддерживает только подсказки для массивов и объектов.
Функции Приведение типов и ctype_ * становятся важными для обеспечения чистых данных. В последнее время я широко использую исключения, что значительно упростило мой код обработки ошибок.
Я бы не сказал, что у этого языка много убийственных функций. (По крайней мере, я не нахожу особых поводов искать их.) Мне нравится, что язык ненавязчивый.
Почему я раньше не узнал о функциях Ctype? Очень полезный!
Массивы. Судя по ответам на этот вопрос, я не думаю, что люди полностью понимают, насколько простые и полезные массивы в PHP. Массивы PHP одновременно действуют как списки, карты, стеки и общие структуры данных. Массивы реализованы в ядре языка и используются повсеместно, что приводит к хорошей локализации кэша ЦП. И Perl, и Python используют отдельные языковые конструкции для списков и карт, что приводит к большему копированию и потенциально запутанным преобразованиям.
Преимущество подхода Perl состоит в том, что мы можем заявить о своем намерении иметь упорядоченный контейнер.
Элементы массива PHP упорядочены.
Мой первоначальный переход с PHP на C# чуть не убил меня. В C# массивы представляют собой простую структуру со статическим размером и числовым индексом. В PHP массивы - это клейкая лента вселенной!
Действительно, гибкость массивов PHP, а также интерфейсов ArrayAccess, Iterator и Countable (для создания класса, который можно использовать точно так же, как массив), делают мою жизнь настолько легкой, хотя выполнение некоторых задач без нее труднее.
Трудно недооценить универсальность массивов. Как только вы разовьете мышление использовать их в своих интересах, вы сможете делать удивительные вещи.
Я тоже согласен. Когда я играл с Java для задания Uni, я был поражен их жесткостью и отсутствием гибкости. Действительно заставил меня оценить, насколько хороши массивы PHP.
Вы даже можете легко конвертировать между массивами и объектами, выполняя (array) $ object и (object) $ array. Это не рекурсивно, но написать такую функцию несложно.
Сравнение массива php с массивами java похоже на сравнение яблок с бананами. Если вам нужны быстрые коллекции фиксированного размера, используйте массив. Если вам нужны растущие и простые в использовании коллекции, используйте List.
Я уверен, что массивы php - это здорово, но 40 голосов за комментарий, сбивающий с толку массивы C#? Если массив C# не подходит, есть много вариантов. ArrayList и общие коллекции очень эффективны. Существует множество типов коллекций для конкретных нужд. Единственный фактический преимущество php в этом отношении состоит в том, что он не предоставляет никаких опций, из которых программист должен решить. Вы либо используете массив, либо у вас нет индексируемой переменной.
С другой стороны, синтаксис массивов - отстой. Во многих языках сценариев вы можете создать простой 2D-массив, например [[1, 2], [3, 4]], сравните его с версией PHP: array(array(1, 2), array(3, 4)).
@gWiz: согласен. Непонятно, почему массив C# не является также ArrayList, Dict или HashTable. То, что это работает на одном языке, не означает, что так должно быть везде. Тем не менее, я проклинал ASP каждый раз, когда мне приходилось возвращаться с PHP по той же причине.
Массивы @Tom C# тускнеют, потому что нужно думать. Вы только что сказали, что существует 4 типа данных, которые необходимы для охвата большинства возможностей простых массивов PHP. Массивы PHP просто работают.
Вы сравниваете статические и динамические языки и жалуетесь, что не получаете преимуществ динамического языка со статическим языком, не принимая во внимание недостатки динамических языков. Я попадаю в лагерь динамических языков и предпочитаю подход PHP, но он не делает его единственным истинным путем.
Я не уверен, что люди выбивают массивы C#. У меня была та же проблема (до сих пор), когда я перешел с PHP на C#, я был уверен, что массивы действительно используются для всего. Но в C# массив - это просто массив. Это был просто культурный шок, а не ненависть к C#.
… Это не о том, чтобы разбить массивы C#, но я проголосовал за «В PHP массивы - это клейкая лента вселенной!»
Насколько легко найти связанные с PHP примеры, приложения, классы, документацию, фреймворки и т. д.
Во всем Интернете это самый простой язык для изучения, когда вы станете коммандос (в одиночку), а также тот, который больше ценит ваше время.
После изучения PHP можно поставить CMS с joomla, блог с wordpress и т. д.
После изучения PHP нажмите CodeIgniter или Symfony для улучшения разработки. Они должны помочь упростить переход на Ruby или Python в будущем. Если это твоя цель, конечно.
Я иногда добавляю также «Как легко найти примеры PHP Плохо». люди учатся писать "привет, мир", и они думают, что они бог-программист, и распространяют предложения, которые ... иногда не совсем хорошие
а) руководство - чрезвычайно всеобъемлющий, актуальный и просто огромный источник вдохновения при решении проблем - застрял? просмотрите / найдите руководство, оно придет к вам
б) массивы - они пластичны, они ассоциативно проиндексированы, их можно легко вложить (!) для создания каких-то диких структур данных, и есть множество функций только для операций с массивами. О, и я уже упоминал, что нужно рассматривать отдельные переменные как массив значений?
c) eval () и подобные конструкции (например, имена динамических переменных и функций), которые обеспечивают гораздо большую гибкость (и по-прежнему относительно безопасны, если вы знаете, что делаете) - ничто не сравнится с программой, которая в основном определяет свой собственный поток процесса (или даже конкретное исполнение) на лету
г) наиболее вероятно, что проще всего упустить из виду: поскольку почти все в движке ZEND - это zVal (который, по сути, представляет собой набор ссылок на указатели), возможность возвращать что-либо в качестве возвращаемого значения функции
Кроме того, я хотел бы отметить одну замечательную функцию, но она больше связана с исходным кодом PHP, чем с языком (и поэтому - указана отдельно):
д) простота написания Расширения C (в основном интерфейсы для других объектов, таких как OpenAL или SDL) - отличная структура исходного кода и примерно столько же мощных инструментов внутри, сколько и снаружи - если вам когда-нибудь понадобится расширить функциональность чуть больше.
Я пишу PHP полный рабочий день в течение 5 лет и не встречал ни одной ситуации, в которой мне законно нужно было бы использовать eval () или переменные переменные.
Читаемость eval () - использование программ ... нехорошо. Хуже, чем "goto" imho, но, как и "goto", может иметь законное использование.
@Frank: чрезвычайно полезно при кодировании с кем-то, кто выполняет экстремальные операции GET (около предела длины URI). Объявите таблицу и пройдите по ней с автоматической очисткой входных данных. В этом не было особой необходимости, но это сделало мою жизнь намного проще. @ Иван: Согласен, это ужасно. С другой стороны, бывают случаи, когда аналогичные - и в то же время разные - функции должны быть сосредоточены вокруг общего ядра. В какой-то момент мне было намного проще просто сгенерировать их во время выполнения, поскольку принятый стандарт заключался в объявлении функций PHP как внешних команд, используемых интерфейсом. Сэкономлено много времени.
Легкость. Самая большая особенность заключается в том, насколько легко новым разработчикам сесть и написать «рабочие» сценарии и понять код.
Худшая особенность заключается в том, насколько легко новым разработчикам сесть и написать «рабочие» сценарии, думая, что они понимают код.
открытость сообщества, окружающий PHP, и огромное количество проектов PHP, доступных в виде открытого исходного кода, намного менее пугает тех, кто входит в мир разработки, и, как и вы, может стать ступенькой к более зрелым языкам.
Я не буду обсуждать технические вопросы, как это делали многие до меня, но если вы посмотрите на PHP как на сообщество, а не как на веб-язык, сообщество, которое явно приняло вас, когда вы начали разработку, преимущества действительно говорят сами за себя.
Определенно хороший комментарий. Python был моим первым языком, и это было здорово, но отсутствие проектов, которые я чувствовал способным понять, действительно создавало препятствия. С помощью PHP я могу найти в документации практически все, что угодно, и разобраться в этом ... ресурсы, доступные в Интернете, потрясающие.
Одна не очень известная функция PHP - это extract(), функция, распаковывающая ассоциативный массив в локальное пространство имен. Это, вероятно, существует для автоглобального прерывания, но очень полезно для создания шаблонов:
function render_template($template_name, $context, $as_string=false)
{
extract($context);
if ($as_string)
ob_start();
include TEMPLATE_DIR . '/' . $template_name;
if ($as_string)
return ob_get_clean();
}
Теперь вы можете использовать render_template('index.html', array('foo' => 'bar')), и в шаблоне отображается только $foo со значением "bar".
а с EXTR_IF_EXISTS вы можете установить значения по умолчанию перед извлечением
Я собирался рассердиться на вас за то, что вы предположили, что extract () в любом случае является хорошей функцией. Но я думаю, что пользоваться им довольно удобно. Полагаю, это единственный раз, когда я видел, как он используется там, где это хорошая идея!
extract () упрощает создание вашей собственной чрезвычайно легкой системы шаблонов. +1
Его обратный, compact (), тоже хорош: $ a = 1; $ b = 2; компактный ('а', 'б'); // == массив ('a' => $ a, 'b' => $ b)
Да, это, вероятно, единственное действительно хорошее использование extract ().
Zend Framework часто использует extract () в своих помощниках просмотра.
Я бы посоветовал в этом случае не использовать общие слова в качестве имен аргументов функций, поскольку $ context, из которого вы извлекаете (), может содержать значения в индексах as_string или template_name. Использование EXTR_SKIP допустимо, но только перемещает проблему в другое место (т.е. если шаблон ожидает $ as_string, он получит для него неверное значение).
extract() - это зло! Практически такое же зло, как и eval(). Нет ничего хуже, чем пытаться понять и отладить код, используя extract() и compact() почти во всех функциях. Никогда не знаешь, откуда взялась переменная.
Я думаю, что extract () и compact () имеют свое применение и могут быть очень мощными при использовании в правильном контексте. extract () отлично подходит для создания систем шаблонов, а compact отлично подходит для быстрого создания хэш-массивов.
За исключением $as_string, это почти то же самое, что моя маленькая функция renderView!
Я немного похож на вас, я кодировал PHP более 8 лет. Мне пришлось пройти курс .NET / C# около года назад, и мне очень понравился язык C# (ненавидел ASP.NET), но он сделал меня лучшим разработчиком PHP.
PHP как язык довольно плохой, но я очень быстро с ним разбираюсь, и стек LAMP великолепен. Конечный продукт намного превышает сумму частей.
Тем не менее, в ответ на ваш вопрос:
Мне нравится SPL, класс коллекции в C# мне понравился, как только я начал с ним работать. Теперь я могу съесть свой торт и съесть его.
Андрей
Встроенные фильтры для анализа переменных по определенным предопределенным типам, а также охват основ (int / float и т. д.), Распространяется на электронные письма, URL-адреса и даже если переменная является действительным регулярным выражением.
Файлы __autoload() (class-), поддерживаемые set_include_path().
В PHP5 теперь нет необходимости указывать длинные списки операторов include_once при выполнении достойного ООП.
Просто определите небольшой набор каталогов, в которых файлы библиотеки классов будут разумно структурированы, и установите путь автоматического включения:
set_include_path(get_include_path() . PATH_SEPARATOR . '../libs/');`
Теперь процедура __autoload():
function __autoload($classname) {
// every class is stored in a file "libs/classname.class.php"
// note: temporary alter error_reporting to prevent WARNINGS
// Do not suppress errors with a @ - syntax errors will fail silently!
include_once($classname . '.class.php');
}
Теперь PHP автоматически включает необходимые файлы по запросу, экономя время синтаксического анализа и память.
spl_autoload_register () лучше использовать?
Конечно! __autoload () - это PHP4, но spl_autoload_register () - это неразрушающее «шлейфовое соединение» методов автозагрузки.
Удобная функция, но с одной оговоркой, когда вы находите экземпляр данного класса, становится немного сложнее выследить местоположение файла класса. Явное определение включений вверху дает вам конечный список задействованных классов и их точное расположение.
Это хорошая функция, но только для того, чтобы обойти ситуацию, когда код не скомпилирован заранее, поэтому он не знает, где будет находиться класс. Большим недостатком этого является то, что у вас не может быть 2 классов с одинаковым именем, даже если они находятся в разных пространствах имен.
@Cory: Просто пусть __autoload хранит список загруженных классов и файлов, из которых он их загрузил.
@Jasper и @Cory: Вы также можете использовать php.net/get_included_files.
Пожалуйста, ознакомьтесь с пропсалом PSR-0 от рабочей группы по стандартам PHP (с участием разработчиков ZF, Symfony, Doctrine, CakePHP, Solar и т. д.) При реализации автозагрузки: groups.google.com/group/php-standards/web/psr-0-final-propos al
Затем трюк "и печать"
<?php $flag and print "Blah" ?>
Будет эхо Blah, если $ flag истинно. НЕ РАБОТАЕТ С ECHO.
Это очень удобно в шаблоне и заменяет? : это не очень легко читать.
Я лично считаю, что тернарный оператор намного более очевиден, чем использование короткого замыкания вычисления логического и.
На самом деле это то же количество символов, что и <? Php if ($ flag) print "Blah"
Скобки напечатать не так просто, как "и", особенно на моей чертовой французской клавиатуре ;-)
Это короче, если у вас включены короткие теги: <?=$flag?'blah':''?>. Собственно без коротких тегов все равно короче.
@ все комментарии - Дело не в том, насколько коротким вы можете его получить! Речь идет о удобочитаемости и простоте использования для разработчиков шаблонов, которые иногда даже не являются программистами.
Я бы сказал, что оператор if () проще и читабельнее. Для меня, конечно, легче разобраться, чем использовать по существу побочный эффект оператора 'and' в PHP, где легко сделать ошибку (или выглядеть так, как будто это ошибка, когда вы позже прочитаете код). Например, как уже говорилось, это не будет работать так, как вы хотите, с «эхо». С if () таких ошибок не бывает.
print - это функция, echo - это инструкция, поэтому echo не работает.
Версия if... не заставляет задуматься.
стандартный класс - аккуратный контейнер. Я узнал об этом только недавно.
Вместо использования массива для хранения нескольких атрибутов
$person = array();
$person['name'] = 'bob';
$person['age'] = 5;
Вы можете использовать стандартный класс
$person = new stdClass();
$person->name = 'bob';
$person->age = 5;
Это особенно полезно при доступе к этим переменным в строке
$string = $person['name'] . ' is ' . $person['age'] . ' years old.';
// vs
$string = "$person->name is $person->age years old.";
"{$ person ['name']} - {$ person ['age']} лет") работает.
Вы должны опубликовать это как скрытую функцию, я бы проголосовал за это :)
"person [name] is $ person [age] years" тоже подойдет ... Без кавычек и скобок :)
Я этого не знал. Он не жалуется, что должен предполагать, что вы не используете неопределенные константы?
Делает это очень Javascript-у :)
@Dean, если вы не используете фигурные скобки, нет, он не жалуется. [Должен следовать сразу за именем переменной, тогда его содержимое интерпретируется как строка.
$ string = sprintf ("% s% d лет.", $ person ['name'], $ person ['age']);
Пока мы говорим о теме: (объект) array ("name" => 'bob', 'age' => 5)
@majelbstoat: удаление кавычек замедлит работу скрипта, потому что интерпретатор PHP будет проверять, установлены ли 'name' и 'age' с помощью define (...). Это также плохая практика, учитывая, что можно было бы полностью перевернуть ключи, к которым осуществляется доступ в каждом случае: define ('age', 'name'); define ('имя', 'возраст');
Не заботьтесь о производительности, читаемость (кстати!) Важнее.
Оба с использованием массивов стандартного класса И полезны для разных вещей.
@Willi Schönborn: конечно, аспект производительности может не иметь большого значения, но, учитывая тот факт, что E_NOTICE выдается каждый раз, когда PHP сталкивается с одним из них, это просто небрежно.
@Adam Backstrom, это объектный литерал в PHP! Ты просто взорвал мне голову.
@brianreavis и @Frank Farmer, дело не в этом. Без фигурных скобок внутри строки PHP рассматривает то, что в фигурных скобках, как литерал. например: «$ person [name]» эквивалентно «{$ person ['name']}» - PHP не будет рассматривать имя как ссылку на константу в любом случае. См. Типы -> Строки в разделе «Анализ переменных» в руководстве по PHP.
не используйте $ person [name] ... если вы установите error_reporting на E_ALL, вы увидите, что компилятор выдает уведомление. Всегда заключайте в кавычки ключи массива строк: $ person ['name']
Я не могу понять, почему комментарий @brianreavis получил 23 голоса за, хотя он принципиально неправильно понял интерполяцию переменных в строках ...
Одна приятная особенность PHP - это CLI. В документации это не так «продвигается», но если вам нужны обычные скрипты / консольные приложения, использование cron + php cli действительно быстро!
Я действительно должен изучить это, у меня есть несколько заданий cron, которые извлекают PHP-скрипт через wget http://example.com....
Интерфейс командной строки также является отличным способом выборочной отладки, поскольку предупреждения и ошибки отображаются без необходимости изменения настроек отчетов об ошибках.
Вы можете воспользоваться тем фактом, что оператор or имеет более низкий приоритет, чем =, для этого:
$page = (int) @$_GET['page']
or $page = 1;
Если значение первого присвоения оценивается как true, второе присвоение игнорируется. Другой пример:
$record = get_record($id)
or throw new Exception("...");
Думаю, я не совсем уверен в этом; хотя кажется, что он не подвержен ошибкам, он противоречит интуиции и сам по себе может способствовать ошибкам.
Опять же, кто я такой, чтобы говорить? Я довольно часто использую тернарный оператор, и все же некоторые люди считают это мерзостью!
@thomasrutter: Как бы вы написали первый пример без использования «или»?
@Pies: один из способов - это следующий, довольно запутанный код, если честно: $ page = isset ($ _ GET ['page'])? (int) $ _ GET ['страница']: 1; // Преимущество этого в том, что не требуется подавление ошибок.
обдумывая, поскольку вы ищете целое число, которое вы могли бы использовать вместо этого: $ page = is_int ($ _ GET ['page'])? $ _GET ['страница']: 1;
Я делаю это по-своему, потому что он короче и может быть легче читается. Очевидно, вы можете сделать то же самое в коде более. В основном я хотел избежать двойного написания $ _GET ['page'].
Стоит отметить, что код после or будет выполняться, если код до or приведет к числовому значению 0. Таким образом, семантически это может быть менее вероятно с чем-то вроде $_GET['page'], но, очевидно, могут возникнуть обстоятельства, и их следует остерегаться.
Также стоит отметить, что оператор or является более ранней версией оператора ||. Кроме того, +1, потому что это очень выразительно, и я часто забываю, что это возможно. Его нужно использовать чаще, и совершенно понятно, что он делает. Я не знаю, как кодируют «настоящие мужчины», поэтому не могу это комментировать.
Лично я не решаюсь использовать or, потому что не верю, что все, с кем я работаю, всегда будут осознавать разницу между or и ||.
Он должен был называться then
@DisgruntledGoat, $_GET['page'] никогда не может быть int, если вы не измените $_GET в своем PHP-коде.
@ Ionuț: Да, наверное, я имел в виду is_numeric, поскольку он проверяет, является ли это числовой строкой.
использование 'or throw' не работает, вы получите ошибку T_THROW без исключения.
$page = getPage($_POST["page"]) or GTFO();
Я чувствую, что что-то добавляется в мой мозговой багаж каждый раз, когда используется подавитель ... + Лучше 404 для URL ...&page=<something_not_valid>, чем молча проглатывать его.
@ HalilÖzgür Я думаю, что чтение из $ _GET - одно из законных применений подавления ошибок, но каждому свое. Вы могли бы просто создать для него функцию.
Кажется, здесь все забыли эту жемчужину: mysql_connect(*) or die().
Быстро и грязно - значение по умолчанию. Язык наполнен полезными ярлыками, что делает PHP идеальным кандидатом для (небольших) проектов, у которых короткий срок вывода на рынок. Не то чтобы чистый PHP-код невозможен, это просто требует дополнительных усилий и опыта.
Но мне нравится PHP, потому что он позволяет мне выразить то, что я хочу, не печатая эссе.
PHP:
if (preg_match("/cat/","one cat")) {
// do something
}
ЯВА:
import java.util.regex.*;
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat")
if (m.find()) {
// do something
}
И да, это включает в себя отказ от ввода Int.
вместо этого вам следует использовать strpos: if (false! == strpos ("one cat", "cat")) {
@OIS целью его примера было проиллюстрировать и сравнить выполнение быстрого совпадения с регулярным выражением, а не как найти строку «кошка» в «одной кошке».
Хороший звонок @eyelidlessness. Я использовал ereg () несколько лет, пошел по пути preg, начиная с php 5.3. Мне не нравятся устаревшие сообщения ;-)
Java: if (Pattern.matches ("кошка", "один кот")) {// что-то делать} Прекратите жаловаться на java, если вы этого не знаете.
+1 Вилли, как вы делаете preg_replace ('/ ([<[]! - \ s *) (\ S *?) (\ S * - [>]]?) / Se', "\ $ this- > Выберите ('\\ 1', '\\ 2', '\\ 3', \ $ data) ", $ text); в Яве? Это находит комментарий во входном тексте, а затем вызывает функцию с совпадающими элементами, которая в этом случае $ this-> choose (...) решает, чем заменить совпадение, и возвращает результаты.
Regex - это PHP довольно дрянный ... Я бы предпочел Regex в стиле Perl или JavaScript, где // встроен в язык.
Это очень быстро, настолько, что вы удивитесь. Внутри он, вероятно, использует какую-то сумасшедшую структуру типа b-tree, чтобы упорядочить ваши совпадения по их общим префиксам. Я использую его с более чем 200 строками поиска и замены, и он все равно проходит 1 МБ менее чем за 100 мс. Для всех строк, кроме тривиально маленьких, strtr () даже значительно быстрее, чем strtolower (), при выполнении того же самого, даже с учетом набора символов. Вероятно, вы могли бы написать целый синтаксический анализатор, используя последовательные вызовы strtr, и это было бы быстрее, чем обычное сопоставление регулярного выражения, выяснение типа токена, вывод того или иного, следующего типа регулярного выражения.
Я писал нормализатор текста для разделения текста на слова, строчные буквы, удаления знаков препинания и т.д., а strtr был моим швейцарским армейским ножом, он превосходил регулярные выражения или даже str_replace ().
Вероятно, это быстрее, потому что он выполняет замену одного символа.
strtr () выполняет не только односимвольные замены. Он может заменять подстроки произвольной длины на другие подстроки произвольной длины, и при этом кажется очень быстрым.
Вы упомянули, что в некоторых случаях это было быстрее, чем strtolower, можете ли вы это доказать? Я провел небольшой тест и обнаружил, что это неверно.
Я обнаружил, что на небольших строках, скажем, 80 символов, он был медленнее, чем strtolower, а на больших строках, скажем, 1 МБ, он был быстрее. Вероятно, каждый раз, когда он вызывается, возникают некоторые накладные расходы типа фиксированной стоимости. Я просто использовал strtr ($ this-> string, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); Строка, над которой я работал, представляла собой типичный английский текст («Быстрая коричневая лиса» и тому подобное).
Я только что прочитал этот пост, а затем поискал в Google и нашел: simplemachines.org/community/index.php?topic=175031.0 Есть идеи, какой из них правильный?
Когда я проводил тестирование, я обнаружил, что strtr работает / намного / быстрее для более сложных наборов замены на длинных строках, скажем, длиной 100 КБ или более. Я обнаружил, что для коротких строк размером, скажем, 80 байт или меньше, str_replace работает намного быстрее. Однако я провел свое тестирование около двух лет назад, и я не уверен, правда ли это до сих пор. Я был бы удивлен, если бы производительность strtr снизилась для длинных струн. Я считаю, что его производительность связана с индексированием префикса перед каждым вызовом, что замедляет его на коротких строках.
Функции даты. Мне приходится обрабатывать много информации о времени и строках даты в течение всего дня, поэтому такие функции, как strftime () и strtotime (), просто потрясающие.
Убедитесь, что вы проверили DateTime. php.net/datetime
На самом деле strtotime - отстой, потому что магия нигде не документирована, и вы не можете использовать собственный формат для синтаксического анализа. -1
Согласен с приведенными выше комментариями; strtotime () ужасен, но DateTime 5.3 намного лучше (поскольку вы можете точно указать формат ввода).
Полностью не согласен. Делать свидания на PHP было ужасно до появления DateTime.
Наверное, не многие знают, что можно указать постоянные «переменные» в качестве значений по умолчанию для параметров функции:
function myFunc($param1, $param2 = MY_CONST)
{
//code...
}
Струны можно использовать в качестве, если они были массивы:
$str = 'hell o World';
echo $str; //outputs: "hell o World"
$str[0] = 'H';
echo $str; //outputs: "Hell o World"
$str[4] = null;
echo $str; //outputs: "Hello World"
Последний отличный. Хотя я понятия не имею, когда это будет лучше, чем какой-либо другой метод удаления персонажа. +1 тем не менее
Вероятно, это более эффективно, чем вызов функции для этого. Обычно строки хранятся в памяти непрерывно, поэтому добраться до $ str [4] несложно. Хранение строк в виде массивов символов характерно для большинства языков, унаследованных от C.
Вам не обязательно использовать определенную константу в качестве значения по умолчанию. Следующее также совершенно верно: function foot ($ param1, $ default = array ('key' => 'value'), $ default_s = 'String', $ default_i = 10, $ default_b = false). Однако вы правильно заметили, что нельзя использовать переменную в качестве аргумента по умолчанию.
@dcousineau Ваш пример совершенно верен, поскольку array () - это не функция, а языковая конструкция. Вызов функций не допускается в качестве значений по умолчанию для аргументов.
вы также можете получить доступ к строковому символу следующим образом: $ a_char = $ a_string {2}
Будьте осторожны с обработкой строк как массивов, если у вас есть многобайтовые строки (иностранные языки и т. д.).
Что ж, сообщество для меня на первом месте. Какой бы ни была ваша проблема, вы всегда найдете кого-то, у кого она была раньше, и почти каждый раз находит решение ... и иногда я видел совершенно бесплатную долю идей, способов решения одной проблемы.
Я пытаюсь выучить Python сейчас (чтобы вырасти ... ну ... программистом, не так ли?), И самая полезная вещь в Python - это отступы. Мне нравятся отступы PHP, знак $ для обозначения переменных, фигурные скобки для циклов и циклов, ну, эти умные вещи делают мой код очень простым для понимания (даже если тот, кто написал код, был маленьким ... беспорядочным .. 'спагетти-код', а?)
Массивы в PHP довольно просты и мощны.
Базы данных: MySQL, Postrgee, sql; вы можете использовать почти все типы баз данных .. легко.
Быстро: логически зависит от того, как написан код, но обычно PHP довольно быстро для малых / средних приложений (поскольку он теряет колесо в более крупном приложении).
Вы можете легко добавить элемент в массив.
$my_array = array();
$my_array[] = 'first element';
$my_array[] = 'second element';
Элементом может быть что угодно: объект, массив, скаляр ...
Он спросил: «... какие особенности PHP вам нравятся больше всего?»
Первая строка не нужна.
Наоборот; отсутствие этой строки является источником многих проблем и ошибок.
«Первая строка в ненужном» <- совершенно неверно! если вы не инициализируете массив, вы можете получить довольно много проблем на разных серверах. Вы должны ВСЕГДА инициализировать все перед использованием.
Не говоря уже о том, что простое объявление массива как такового делает код более читаемым.
Вы можете использовать минус в именах переменных так:
class style
{
....
function set_bg_colour($c)
{
$this->{'background-color'} = $c;
}
}
Зачем это нужно? Понятия не имею: может быть, для модели CSS? Или какой-нибудь странный JSON, который нужно вывести. Странная особенность :)
Это работает с именами методов? Может быть полезно для фреймворков, которые используют маршрутизатор, и мне нужен domain.com/something-with-minuses/view/
Фигурные скобки позволяют получить доступ к свойствам объектов, которые содержат тире, точки и другие не буквенно-цифровые объекты. Одна из причин его использования - при работе с xml, где имена сущностей могут быть разделены точками, как в NITF / NewsML <body.content>. Если вы используете SimpleXML, вы получите доступ к нему как $item->DataContent->body->{'body.content'}.
При таком использовании переменные PHP могут принимать любые символы, даже пробелы и символы новой строки.
Это было бы очень полезно при использовании в SimpleXML ... здорово. Спасибо, что поделился.
Я неравнодушен к другим пользователям PHP. При необходимости легко получить ответы и указания.
Обожаю удаленные файлы. Для веб-разработки такая функция исключительно полезна.
Нужно работать с содержимым веб-страницы? Простой
$fp = fopen('http://example.com');
и у вас есть дескриптор файла, готовый к работе, как и любой другой обычный файл.
Или как насчет чтения удаленного файла или веб-страницы непосредственно в строку?
$str = file_get_contents('http://example.com/file');
Полезность этого метода трудно переоценить.
Хотите проанализировать удаленное изображение? Как насчет того, чтобы сделать это через FTP?
$imageInfo = getimagesize('ftp://user:[email protected]/image/name.jpg');
Практически любая функция PHP, которая работает с файлами, может работать с удаленным файлом. Таким образом вы даже можете удаленно кодировать файлы include() или require().
Это так приятно! Чтобы сделать это, например, на Java, вам нужно включить миллиард файлов jar и затем написать много шаблонного кода.
«Таким образом вы даже можете удаленно включать () или требовать () файлы кода». Конечно, include () файл на сервере, который вы не контролируете, - ужасная, ужасная идея.
@Frank - да, можно предположить, что вы будете включать код с сервера, которым вы управляете сделал.
Дело в том, что включение удаленного файла является распространенной проблемой безопасности PHP: en.wikipedia.org/wiki/Remote_File_Inclusion#PHP.
/*
die('You shall not pass!');
//*/
//*
die('You shall not pass!');
//*/
Эти комментарии позволяют переключаться, если блок кода комментируется одним символом.
На самом деле это не относится к PHP. Это работает на любом языке, который поддерживает строковые комментарии // ... и блочные комментарии /* ... */.
любые утилиты для очистки кода в конечном итоге возненавидят вас за это ...;)
Я также использовал /** / до и /**/ после. Вы можете переключать блок, удаляя и добавляя пробел в первом. Это дает дополнительное преимущество работы с CSS (и другими языками, которые не поддерживают комментарии // ... ).
FWIW, ссылка на оригинальную статью aleembawany.com/2009/01/27/lazy-block-comment-trick
@aleemb, воздержитесь от дальнейших правок в этом вопросе.
Давайте посмотрим...
Тернарные операторы. Они творит чудеса, обрабатывая флажки в результатах формы.
$ var = ($ _POST ['my_checkbox'] == 'проверено')? ИСТИНА: ЛОЖЬ;
Стоит изучить все замечательные функции обработки строк и массивов. strtotime (), strlen () и strpos () - некоторые из моих любимых.
Класс SimpleXML и функция json_decode (). Вызовите REST API или RSS-канал с помощью file_get_contents (), без труда проанализируйте его с помощью одного из этих инструментов, и все готово.
Я знаю, что это был просто пример, но ваш код мог быть таким: $ var = ($ _POST ['my_checkbox'] == 'checked');
Подавление ошибок с помощью оператор контроля ошибок, @ почти никогда не должно использоваться. Он продвигает ленивые и небезопасные методы кодирования, просто игнорируя ошибки, создает кошмары отладки, поскольку ошибки всех типов - даже фатальные - будут подавлены, а в некоторых случаях могут привести к снижению производительности (особенно при подавлении больших количество ошибок).
Я рад, что ты сказал «почти никогда». Функция fopen () печально известна тем, что выдает предупреждение и, возвращающее проверяемое значение ошибки, когда она не может открыть файл. К сожалению, единственное решение - использовать @fopen ().
Я стараюсь избегать чрезмерно рьяных заявлений по поводу всего, что связано с программированием. Я считаю, что он всегда возвращается, чтобы преследовать нас. Но да, parse_url тоже хлопотно;)
Да, это так. "Скрытая" часть в том, что вы обычно не должны его использовать;)
Множество заметок в журнале для неопределенных индексов могут раздражать. Я обычно @ any isset ($ something ['something']), чтобы избежать такого количества уведомлений.
Хорошее защитное программирование - это не просто игнорирование проблемы. Кроме того, вы не должны получать никаких уведомлений при использовании isset или empty.
Тень: если вы получаете много-много уведомлений, это признак плохой практики кодирования. Подавление ошибки - это решительный шаг в сторону песка. Он может вернуться и укусить вас. если значение должно быть там, а его нет, то это ошибка. если значение может быть неопределенным, вам следует проверить его. В противном случае могут возникнуть проблемы с безопасностью.
в некоторых особых случаях вы действительно ДОЛЖНЫ использовать этот оператор, чтобы сделать код совместимым с другими системами / версиями.
Вот почему я сказал «почти никогда», а не «никогда».
@staticsan: Это неправда. Используйте file_exists перед попыткой выполнения файловых операций.
Проблема в том, что file_exists(), за которым следует fopen(), не является атомарным. Иногда это не проблема; иногда бывает.
@staticsan: Да, но это не только fopen (). Большинство функций, которые работают с внешними источниками данных, особенно. в сети есть этот недостаток. Подключение за пределами прив. окружающая среда всегда рискованна, и примерно в 99% случаев есть способ проверить на отказ тем или иным способом. А еще есть функции, которые НИКОГДА не выдают ошибку, И НЕ возвращают проверяемый результат сбоя, но я не могу назвать ни одного из них (хотя я помню, что видел по крайней мере одну), так что это не все плохо. Тем не менее, всегда лучше иметь больше предупреждений, чем меньше, и использовать @ как GOTO - с уважением, которого он заслуживает.
@Lotus Примечания: я бы хотел увидеть, как вы выполняете file_exists () на удаленном HTTP-сервере. : D Знаю, встречается не часто, но есть. Подключение и проверка - это, как правило, огромная боль, но зачастую лучший план. Если, конечно, не допускается безопасный отказ, и, таким образом, @ оправдан.
Да, есть несколько виновников. Я упомянул только fopen(), потому что именно с ним я сталкиваюсь чаще всего. Я использую тот же подход с поясом и подтяжками для mysql_connect().
preg_split (), array_intersect () и array_intersect_key ().
Ключевое слово static полезно вне точки зрения ООП. Вы можете быстро и легко реализовать «мемоизацию» или кеширование функций с помощью чего-нибудь столь же простого, как:
<?php
function foo($arg1)
{
static $cache;
if ( !isset($cache[md5($arg1)]) )
{
// Do the work here
$cache[md5($arg1)] = $results;
}
return $cache[md5($arg1)];
}
?>
Ключевое слово static создает переменную, которая сохраняется только в рамках этой функции после выполнения. Этот метод отлично подходит для функций, которые обращаются к базе данных, таких как get_all_books_by_id(...) или get_all_categories(...), которые вы вызываете более одного раза во время загрузки страницы.
Предостережение: Убедитесь, что вы нашли лучший способ сделать ключ для своего хэша, практически в любых обстоятельствах приведенный выше md5(...) НЕ является хорошим решением (проблемы со скоростью и длиной вывода), я использовал его в иллюстративных целях. sprintf('%u', crc32(...)) или spl_object_hash(...) могут быть намного лучше в зависимости от контекста.
Просто скопированная функция из C / C++
@GetFree Не думаю, что кто-то станет отрицать, что почти весь PHP скопирован с C, C++, Perl и т. д.
Копирование - лучшее, что можно сделать.
Плохой PHP. Он всегда копирует черты других. Вместо этого он должен писать все с нуля! (В случае малейшей возможности восприятия этого всерьез: шучу)
Мой список ... большинство из них больше относится к "скрытым функциям", чем к "избранным функциям" (я надеюсь!), И не все они полезны, но ... да.
// swap values. any number of vars works, obviously
list($a, $b) = array($b, $a);
// nested list() calls "fill" variables from multidim arrays:
$arr = array(
array('aaaa', 'bbb'),
array('cc', 'd')
);
list(list($a, $b), list($c, $d)) = $arr;
echo "$a $b $c $d"; // -> aaaa bbb cc d
// list() values to arrays
while (list($arr1[], $arr2[], $arr3[]) = mysql_fetch_row($res)) { .. }
// or get columns from a matrix
foreach($data as $row) list($col_1[], $col_2[], $col_3[]) = $row;
// abusing the ternary operator to set other variables as a side effect:
$foo = $condition ? 'Yes' . (($bar = 'right') && false) : 'No' . (($bar = 'left') && false);
// boolean False cast to string for concatenation becomes an empty string ''.
// you can also use list() but that's so boring ;-)
list($foo, $bar) = $condition ? array('Yes', 'right') : array('No', 'left');
Вы также можете вкладывать тернарные операторы, что иногда бывает полезно.
// the strings' "Complex syntax" allows for *weird* stuff.
// given $i = 3, if $custom is true, set $foo to $P['size3'], else to $C['size3']:
$foo = ${$custom?'P':'C'}['size'.$i];
$foo = $custom?$P['size'.$i]:$C['size'.$i]; // does the same, but it's too long ;-)
// similarly, splitting an array $all_rows into two arrays $data0 and $data1 based
// on some field 'active' in the sub-arrays:
foreach ($all_rows as $row) ${'data'.($row['active']?1:0)}[] = $row;
// slight adaption from another answer here, I had to try out what else you could
// abuse as variable names.. turns out, way too much...
$string = 'f.> <!-? o+';
${$string} = 'asdfasf';
echo ${$string}; // -> 'asdfasf'
echo $GLOBALS['f.> <!-? o+']; // -> 'asdfasf'
// (don't do this. srsly.)
${''} = 456;
echo ${''}; // -> 456
echo $GLOBALS['']; // -> 456
// I have no idea.
Хорошо, я пока остановлюсь :-)
Хм, это было давно ..
// just discovered you can comment the hell out of php:
$q/* snarf */=/* quux */$_GET/* foo */[/* bar */'q'/* bazz */]/* yadda */;
Итак, только что обнаружил, что вы можете передать любую строку в качестве имени метода, ЕСЛИ вы заключите ее в фигурные скобки. Увы, вы не можете определить какую-либо строку как метод, но вы можете поймать их с помощью __call () и обработать их по мере необходимости. Хм....
class foo {
function __call($func, $args) {
eval ($func);
}
}
$x = new foo;
$x->{'foreach(range(1, 10) as $i) {echo $i."\n";}'}();
Нашел эту маленькую жемчужину в комментариях Reddit:
$foo = 'abcde';
$strlen = 'strlen';
echo "$foo is {$strlen($foo)} characters long."; // "abcde is 5 characters long."
Вы не можете напрямую вызывать функции внутри {}, но вы может используете переменные-содержащие-имя-функции и вызываете их! (* и * вы также можете использовать в нем переменные переменные)
Пожалуйста, не злоупотребляйте тернарным оператором сравнения; это приводит к запутыванию кода.
Вау. Это может полностью накрыть ваш список $ GLOBALS. Плохая практика. Серьезно.
Есть ли еще конкурс запутанных PHP?
Что ж, прикол со свопом - впечатляюще и полезно, спасибо.
${''} = 456; хахаха .... довольно ругательство.
+1 для ${''} = 456;. Наконец-то полностью анонимная переменная.
«Оскорбления» правильно употреблены в вашем посте во всех смыслах.
Единственная самая полезная вещь в PHP-коде заключается в том, что если я не совсем понимаю функцию, которую вижу, я могу найти ее, используя браузер и набрав:
В прошлом месяце я видел функцию "диапазон" в каком-то коде. Это одна из сотен функций, которые мне никогда не удавалось использовать, но которые оказались действительно полезными:
Этот URL-адрес является псевдонимом для http://us2.php.net/manual/en/function.range.php. Эта простая идея, сопоставление функций и ключевых слов с URL-адресами, потрясающая.
Я бы хотел, чтобы у других языков, фреймворков, баз данных и операционных систем был такой же простой механизм поиска документации.
range() может быть полезен для foreach( range(1, 10) as $i) { };
Если у вас FireFox; просто введите PHP function в адресной строке, он выполнит поиск в Google «Мне повезет», и вы почти всегда окажетесь на нужной странице документации php.
Я немного удивлен, что никто еще не упомянул об этом, но один из моих любимых приемов с массивами - это использование оператора плюс. Он немного похож на array_merge(), но немного проще. Я обнаружил, что обычно это то, что я хочу. Фактически, он берет все записи в RHS и заставляет их появиться в копии LHS, при необходимости перезаписывая (т. Е. Некоммутативно). Очень полезно для начала с массива "по умолчанию" и добавления некоторых реальных значений за один прием, оставляя значения по умолчанию на месте для значений, которые не указаны.
Запрошен образец кода:
// Set the normal defaults.
$control_defaults = array( 'type' => 'text', 'size' => 30 );
// ... many lines later ...
$control_5 = $control_defaults + array( 'name' => 'surname', 'size' => 40 );
// This is the same as:
// $control_5 = array( 'type' => 'text', 'name' => 'surname', 'size' => 40 );
$defaults должен быть $control_defaults
Я думаю, что это не так ясно, как array_merge, когда вам нужно поддерживать много кода. По крайней мере, когда вы используете функцию array_merge, очевидно, что вы имеете дело с массивами.
И того факта, что вы делаете ... + array( ..., недостаточно, чтобы указать на это? :-)
Какая версия PHP вам нужна для этого?
Это отличная функция, и следует отметить, что массив с «правой» стороны от «+» не будет перезаписывать существующие ключи массива с «левой» стороны от «+».
На самом деле @wilmmore, так и будет. Это та самая функция, которая делает его таким полезным.
Я думаю, что элементы, найденные в левом массиве, - это те, которые остались, то есть не перезаписываются теми, которые находятся справа. Так что я думаю, что size все равно будет 30.
Если вы используете это, как будто это array_merge, вы делаете это неправильно: «Оператор + возвращает правый массив, добавленный к левому массиву; для ключей, которые существуют в обоих массивах, элементы из левого будет использоваться массив, а соответствующие элементы из правого массива будут проигнорированы. " php.net/manual/en/language.operators.array.php против php.net/manual/en/function.array-merge.php
Это здорово:
//file page_specific_funcs.inc
function doOtherThing(){
}
class MyClass{
}
//end file
//file.php
function doSomething(){
include("page_specific_funcs.inc");
$var = new MyClass();
}
//end of file.php
"page_specific_funcs.inc" file is only included if doSomething gets called. The declaration of classes, funcs, etc., inside methods works perfectly.
это -1 для PHP, потому что ленивая загрузка должна выполняться контейнером / средой.
Я ненавижу такой код. Изменяться или расширяться - кошмар, поскольку совершенно невозможно выяснить зависимости. (По крайней мере, для крупных проектов).
Логическое приведение, которое особенно полезно для первого примера redwall_hp, приведенного выше.
Вместо:
$var = ($_POST['my_checkbox']=='checked') ? TRUE : FALSE;
Вы можете ввести:
$var = !!($_POST['my_checkbox']=='checked');
Почему не работает $var = ($_POST['my_checkbox'] == 'checked')?
Я думаю, что отправитель хотел сказать что-то вроде: $ var = !! ($ othervar - 1); - проверка того, что $ othervar равно 1, и установка bool. Есть и другие законные применения, когда вы хотите принудительно сохранить логическое значение и где это самый простой способ получить его.
вы понимаете, что используя !! это то же самое, что не использовать! оператор у всех, да? Это как сказать «неправда» вместо того, чтобы просто сказать «правда».
Классифицировать() сам по себе не скрыт, но я все еще вижу много людей, которые повторяют:
for ($i=0; $i < $x; $i++) {
// code...
}
когда они могли использовать:
foreach (range(0, 12) as $number) {
// ...
}
И вы можете делать такие простые вещи, как
foreach (range(date("Y"), date("Y")+20) as $i)
{
print "\t<option value=\"{$i}\">{$i}</option>\n";
}
вы можете выполнить foreach ($ array as $ key => $ value) {}, что еще проще.
Это может быть микрооптимизация, но стоит отметить, что for и while намного быстрее и потребляют меньше памяти, чем foreach.
это НЕ то, как нужно использовать range ()!
Вам следует попробовать Python. Это так же просто, как «for i in range (12)», или вы можете использовать более эффективный xrange.
Я был, вот откуда мне пришла идея. Я начал использовать Python для решения вопросов Project Euler, и это было хорошо.
@SilentGhost: вам все равно понадобится массив для начала, что не всегда так. @ Новичок: поясните, пожалуйста?
К вашему сведению, foreach может быть таким же быстрым, если не быстрее, чем при определенных обстоятельствах в PHP 5.3.
@SilentGhost это то, что я использую. Всякий раз, когда я перехожу на java, мне всегда приходится искать, как там использовать foreach. Это похоже на foreach в 10 раз лучше, чем на цикл for. Ибо петли - это так 1970-е.
@flexxy, по-видимому, это НЕ. Рассмотрим это: phpbench.com прокрутите вниз до Read Loop.
@Buddy А затем ознакомьтесь с примером изменения, в котором говорится: «Доказательство в этом примере показывает, насколько функционально убийственным может быть цикл foreach ()».
Насколько я знаю, вы можете указать неявный тип параметра в вызове функции:
function getInt(int $v)
{
echo $v;
}
getInt(5); // will work
getInt('hello'); // will fail
Вы должны проверить руководство перед тем, как публиковать: «Типовые подсказки могут быть только объектами и массивами (начиная с PHP 5.1). Традиционные типы подсказок с int и string не поддерживаются». (php.net/manual/en/language.oop5.typehinting.php)
Определенно методы магии и перегрузки. Аллен процитировал __get (), __set (), __call () и __toString (), но мне также нравятся __wakeup () и __sleep ().
Эти магические методы вызываются, когда объект сериализуется (спит) и десериализуется (пробуждение). Эта функция позволяет создавать такие вещи, как сериализуемые оболочки базы данных, которые я использую в приложении:
Class Connection {
private $dsn;
private $connection;
...
public __wakeup() {
$this->connection = ADONewConnection();
}
}
Таким образом я могу «сохранять» соединения в $ _SESSION и т. д.
Функции json_encode / decode в php довольно полезны, хотя и не очень скрыты.
Помимо мгновенного доступа, чтобы начать кодировать все, что вам нужно для веб-сайта?
Помимо магических методов и отражений, есть несколько интересных функций:
serialize / unserialize - состояние сохранения добродетели через sql, куки, процессы, плоский файл. хорошая вещь.json_encode / json_decode - мгновенное развлечение AJAXget_class - полезно в моменты утомления, связанного с небрежным набором текстаcall_user_func_array - мощный инструмент, когда вы можете работать со своим кодом как со строками (думайте динамически)method_exists - отражениеfunc_num_args / func_get_arg - неизвестные аргументы ftwset_error_handler / set_exception_handler - очень хорошие возможности отладки для языка сценариевПобочным эффектом этого является сильно загрязненное глобальное пространство имен.
Синтаксис ИРЕДОК - моя любимая скрытая функция. Всегда трудно найти, так как вы не можете использовать Google для <<<, но это избавляет вас от необходимости избегать больших фрагментов HTML и по-прежнему позволяет добавлять переменные в поток.
echo <<<EOM
<div id = "someblock">
<img src = "{$file}" />
</div>
EOM;
HEREDOC - мой любимый способ создания и использования операторов SQL.
Примечание: закрывающая МНВ; не может иметь отступ.
Хорошо, но бессмысленно, если вы используете шаблоны. К тому же это мешает правильному отступу.
Боже мой, это самый уродливый фрагмент кода, который я когда-либо видел. Если вы используете HEREDOC, значит, вы не отделили представление от логики.
@Byron: вам не обязательно использовать его для презентации, его можно использовать для любой строки. См. Комментарий от bdl.
@bdl: Я использовал heredocs для операторов SQL, но, на мой взгляд, хранимые процедуры более удобны в обслуживании.
Было бы намного лучше отделить HTML, Javascript от PHP с помощью шаблона MVC. )
Мне также нравится разница между 'и ".
$foo = 'Bob';
echo 'My name is {$foo}'; // Doesn't swap the variable
echo "My name is {$foo}"; // Swaps the variable
Поэтому, если ваша строка не требует замены переменных, не используйте ", это пустая трата времени. Я вижу, как многие люди объявляют строки с" все время ".
Примечание. Я использую {}, так как это делает мои переменные более заметными.
Также используйте {} для массивов: echo "Вот {$ array ['bob'] ['name']}!"
Интерполяция +1 строки - это то, чего не хватает многим другим языкам. При переходе с perl на php я вздохнул с облегчением, когда это сработало. Единственное, чего ему не хватает, это то, что вы не можете интерполировать константы. define ('FOO', 'bar'); эхо "фу {ФУ}"; не работает :(
Объединение строк в PHP так же быстро, как и интерполяция переменных, и его легче читать и поддерживать.
@staticsan: Я полностью не согласен, я считаю, что встраивание переменных в строку легче читать и намного проще в обслуживании.
Отлично подходит для написания HTML без каких-либо экранирований.
В стандартной библиотеке PHP спрятано множество жемчужин. Доступ к массиву позволяет вам создать объект, который работает с интерфейсом массива, но добавляет свои собственные функции поверх.
Также, когда вы создаете объект ArrayAccess, устанавливая флаг в конструкторе, вы можете читать и записывать объект либо как массив, либо как объект. Вот пример:
$obj = new ArrayObject(array("name"=>"bob", "email"=>"[email protected]"),2);
$obj->fullname = "Bob Example";
echo $obj["fullname"];
$obj["fullname"] = "Bobby Example";
echo $obj->fullname;
скрытые функции, которые мне нравятся в php: 1. Легко выучить (его также легко использовать неправильно ... то есть: плохие привычки программирования. Например, вы можете ввести $ something = "1"; а затем вы сделали $ something + = 3; и внезапно $ something становится целым числом ... без сообщение об ошибке / странные исключения, как в java)
Буферизация вывода через ob_start () гораздо полезнее, чем многие думают. Первая скрытая функция здесь заключается в том, что ob_start принимает обратный вызов:
function twiterize($text) {
// Replace @somename with the full twitter handle
return preg_replace("(\s+)@(\w)+(\s+)", "http://www.twitter.com/", $text);
}
ob_start(twiterize);
Во-вторых, вы можете вкладывать выходные буферы ... Используя предыдущий пример:
ob_start(parseTemplate);
// ...
ob_start(twiterize);
// ...
ob_end_flush();
// ...
ob_end_flush();
Содержимое справки, текстовые объявления, функции словаря / индекса, связывание, перенаправление ссылок для отслеживания, механизм создания шаблонов - все это очень просто, если использовать различные комбинации этих двух вещей.
Я знаю, что это лениво, но я использую буферизацию вывода настолько глубоко в своем коде, что могу добавлять заголовки и полностью избегать ошибок, которые уже были отправлены. Это наиболее заметно в шаблонах: если где-то глубоко во вложенном шаблоне возникает ошибка, достаточно просто добавить заголовок для перенаправления пользователя на страницу с ошибкой.
Чтобы расширить сообщение DeveloperChris, мне кажется странным, что большинство людей не осознают, что это ВЕЛИКИЙ способ конвертировать символы на лету, не беспокоясь о том, откуда они пришли. Я печатаю в основном польские страницы, и они должны быть в формате ISO-8859-2. Однако большинство простых редакторов работают только с Windows-1250. Я видел исходные файлы, скажем, с таблицами перевода, закодированными непосредственно в 8859-2, но поддерживать это БОЛЬНО. Добавьте к этому хороший буфер преобразования и вуаля! - огромная боль ушла, и код внезапно стал более читаемым.
Что ж, недавно я доставил свое первое приложение с графическим интерфейсом платежеспособному покупателю, написанное на PHP! Он собирает данные со сканера штрих-кода или кнопок графического интерфейса, флажков, переключателей или текстовых полей, сохраняет в SQLite или удаленном MySQL, запускает другие приложения Windows, отправляет заархивированные XML-отчеты в виде вложений электронной почты, шифрует и дешифрует сохраненные данные и даже воспроизводит звук. когда закончите.
Сделал это с miniPHP и Винбиндер. Это достаточно спрятано? Думаю, не многие разработчики PHP действительно пробовали это.
Я предполагаю, что не многие разработчики PHP пробовали это, потому что PHP-соединения с API ОС практически не связаны.
-1, есть причина не пробовать
+1 за это. Я также использую Winbinder, PHP-GTK и множество других вещей. Что касается подключений к ОС, вот почему существуют некоторые изящные библиотеки, такие как php-opengl или php-openal. Я знаю, что большую часть этого ДОЛЖНО быть написано на C++, но, тем не менее, это интересная задача. И, что наиболее важно, он работает НАВСЕГДА, и большая часть беспорядка встречается в «правильных приложениях для Windows» - мне не нужны тяжелые функциональные возможности и все виды хитрости, которые развивались за многие годы и теперь являются «стандартными» - это просто загромождает мой код до точка, в которой я ее больше не узнаю. 3К или 300-байтовый источник при создании, кто-нибудь?
Многие люди не знают этого синтаксиса. Когда я использую чистый PHP для создания шаблонов, этот синтаксис предлагает приятный и чистый способ смешивать простые управляющие структуры, такие как if или foreach, с кодом вашего HTML-шаблона, обычно в сочетании с коротким стилем печати переменной <?= $myVar ?>.
Не совсем портативный, многие люди отходят от него.
Я действительно отключил это. он может сломать страницы, которые начинаются с <? xml ... это означает, что вам нужно записать строку, когда это не нужно
не будет ли удален этот «короткий синтаксис» в php6?
@DaNieL Нет. Они решили оставить его себе.
@Commenters, есть разница между альтернативным синтаксисом для структур управления (который охватывает этот пост, например, if (2 + 2 === 4): echo 'hi'; endif;) и короткими тегами (например, <?= 'hi' ?>).
Вы можете использовать функции с неопределенным количеством аргументов, используя func_get_args().
<?php
function test() {
$args = func_get_args();
echo $args[2]; // will print 'd'
echo $args[1]; // will print 3
}
test(1,3,'d',4);
?>
Собирался опубликовать это. Вроде как свойство arguments в функциях JS.
Использование элементов массива или свойств объекта внутри строк.
Вместо того, чтобы писать
$newVar = $ar['foo']['bar'];
echo "Array value is $newVar";
$newVar = $obj->foo->bar;
echo "Object value is $newVar";
Ты можешь написать:
echo "Array value is {$ar['foo']['bar']}";
echo "Object value is {$obj->foo->bar}";
Можно, но нельзя. Интерполированные переменные в строках опасны (синтаксический анализ более сложен) и их сложнее поддерживать.
Я считаю рискованным писать переменные без фигурных скобок.
@staticsan Не могли бы вы объяснить, почему это опаснее и сложнее поддерживать? Я считаю, что интерполяция очень удобна по сравнению со стилем "foo:" . $bar. Хорошая IDE также выделяет интерполированные переменные, поэтому их не сложно поддерживать.
Ctype функции быстрее, чем preg_match () для базовой проверки символов.
ctype_alnum() — Check for alphanumeric character(s)
ctype_alpha() — Check for alphabetic character(s)
ctype_cntrl() — Check for control character(s)
ctype_digit() — Check for numeric character(s)
...etc...
Очень хорошо - я никогда о них не слышал, и они включены по умолчанию без необходимости установки или настройки дополнительных модулей PHP. Может ли кто-нибудь сказать, почему они не используются чаще?
Я начал переходить на python, и одна вещь, которая мне нравилась в python, - это живой интерпретатор. Только позже, когда я работал над проектом php, я понял, что в php есть эта опция, просто она не так широко известна. В командной строке введите php -a и вставьте любой PHP-код, который хотите протестировать, но не забудьте запустить его с <?php.
Вам не нужно вводить «<? Php», однако вам нужно будет ввести «echo» или «var_dump» и не забыть «;».
Включаемые файлы могут иметь возвращаемое значение можно присвоить переменной.
// config.php
return array(
'db' => array(
'host' => 'example.org',
'user' => 'usr',
// ...
),
// ...
);
// index.php
$config = include 'config.php';
echo $config['db']['host']; // example.org
@Peter ОЧЕНЬ полезно для обработки ошибок исключения db-> localhost.
Это удобно для создания быстрого и грязного файла конфигурации.
Почему вы возвращаете этот массив? Если включаемый файл содержит массив, его можно сразу использовать при включении.
@fabrik, потому что это будет глобальная переменная, доступная во всей основной области видимости. Это довольно неприятно, так лучше.
Я работал над проектом в структуре Yii, и у этого проекта есть файл конфигурации, в котором массив был возвращен таким образом, теперь я понимаю, почему файл был таким.
Я предлагаю использовать PHPUnit для модульного тестирования, если вы хотите иметь аннотации для маркировки ваших тестов, поставщиков данных, тесты, управляемые данными, и так далее. Не говоря уже о том, что, похоже, он получает всю любовь к интеграции, когда речь идет о таких вещах, как непрерывная интеграция (круиз-контроль, бамбук, хадсон и т. д.).
PHP 5.3 - это большой скачок, и он того стоит с точки зрения языковых возможностей. Это может быть грубовато по краям, но это стартап, и к тому времени, когда вы запустите, они будут исправлены.
Что касается магических методов, то только __invoke () имеет большое значение, но у него нет для него обратного метода, даже тогда, в сочетании с array_map, array_reduce, array_filter и некоторыми оболочками, вы можете выполнять удивительное функциональное программирование.
__get, __set и __call также действительно удобны, я использовал их и некоторые хитрости в соглашениях об именах интерфейсов / классов для реализации трейтов до версии 5.3, но теперь у вас есть и трейты.
Также обратите внимание на библиотеку дополнений, написанную Дериком Ретансом из ezComponents, и на известность XDebug, она позволяет вам делать аннотации для php 5+. Это неплохо, и производительность не является проблемой с кешированием.
Для профилирования можно использовать xdebug + webcachegrind.
Лучшая IDE - это, вероятно, бесплатная eclipse PDT, если вы используете подсказку типа для параметров и комментарии phpdoc для параметров и возвращаемых значений, она может понять вещи из них и предоставить вам автозавершение кода. Это должно дать вам приличный интеллект.
Кстати, заманчиво делать всевозможные сумасшедшие конкатенации строк, переменные переменные, вызовы методов переменных или создание классов переменных, делать это более чем в одном месте, что плохо документировано и легко найти через регулярное выражение, и вы ВИНТОВЫЙ. Забудьте об отладке, но рефакторинг - это большая проблема. Это то, о чем люди редко думают, что в php НЕТ автоматических инструментов рефакторинга, а рефакторинг больших баз кода ОЧЕНЬ сложно выполнить на php.
Несколько вещей, о которых следует вас предупредить, даже если вы чувствуете малейшую вероятность того, что вам, возможно, придется иметь дело с многобайтовыми символами или «экзотическими» кодировками символов, я настоятельно рекомендую вам завершить обработку строк. Фактически, введение тонкого слоя косвенного обращения, который позволяет вам перемещаться между или действовать как стыки для тестирования / внедрения между вашим кодом и встроенными модулями, облегчит вашу жизнь. Не обязательно, но если у вас нет предвидения, трудно справиться с интернационализацией или такими крупными сквозными проектами.
автозагрузите, изучите и полюбите. Убегайте от жестко запрограммированных требований / включает или, что еще хуже, их вариантов * _once, они связывают вам руки с точки зрения инъекции, вместо этого используйте автозагрузчик, проще всего заглушить все ваши включения в массив, привязать к имени класса и значение - это путь к файлу от некоторого корня, это быстро. Самое плохое в этом то, что это действительно упрощает тестирование, поскольку вы реализовали загрузчик классов, и поэтому вы можете делать с ним действительно полезные вещи.
В PHP 5.3 теперь есть пространства имен, прыгайте от радости и используйте их, как сумасшедший. Уже одно это дает возможность создавать швы (редко) для тестирования / инъекций.
Кеши опкодов, доступ к файлам медленный, чтобы их избежать, используйте кеш опкодов, это не просто доступ к файлу, это весь синтаксический анализ, на самом деле. Если вам не нужно анализировать запрос PER, это имеет БОЛЬШОЕ значение. Даже выполнение этого для переднего контроллера / перехватчика даст вам много преимуществ.
Подумайте иначе, одна из самых неприятных вещей для программистов PHP, если они приходят с Java / .Net, - это то, что ваш сервер приложений распределен по PHP / Apache или любому другому веб-серверу, который вы используете.
Phing / Ant / PHPMaven на начальном этапе кажется легким, просто заткнуть все, но скрипты сборки по-прежнему полезны в php, и у них есть отличная поддержка.
У меня были проблемы с перегрузкой методов, и я все еще борюсь с ними. Я придумал шаблон, чтобы смягчить определенный аспект этого. У меня часто было много вещей, которые могли соответствовать определенному параметру, поэтому, когда вы документируете его @param mixed (int | array | fooObject), если это были возможности, я создал статический метод под названием Caster :: CastTo ($ param, $ toTypeAsString) это будет просто проходить через регистр, соответствующий типу, и пытаться преобразовать его в известный тип. Остальная часть метода может затем предположить, что один тип или сбой при преобразовании, и работать с этим. И так как я заглушил ВСЕ преобразования в одном классе, сопоставление типов перестало быть сквозной проблемой, и, поскольку эти функции можно тестировать индивидуально, я мог протестировать их один раз и полагаться на них повсюду.
PHPUnit / PHPMaven несовместимы с 90% распространенных фреймворков php.
В PHP5.3 вы можете размещать архивы PHAR внутри архивов PHAR! Как WAR / EJB в мире Java.
Мои откровения на протяжении многих лет были скорее концептуальными, чем языковыми.
1: Рендеринг вместо эха.
function render_title($title){
return "<title>$title</title";
}
намного проще использовать части повторно и передавать их в шаблоны при рендеринге вывода вместо использования эха (в этом случае вам придется полагаться на буферизацию вывода).
2: функциональное программирование, или, по крайней мере, насколько я могу приблизиться к нему, работает без побочных эффектов. Рендеринг без использования глобальных объектов, сохранение ваших функций в локальной области видимости и тому подобное. Я думал, что объектно-ориентированное программирование - это способ пойти на некоторое время с php, но снижение накладных расходов и сложности синтаксиса, которое я испытал при переходе от объектно-ориентированных методов к методам функционального программирования на php, делает функциональное программирование очевидным выбором для меня. .
3: Системы шаблонов (например, smarty). Мне потребовалось много времени, чтобы понять, что вам нужна система шаблонов внутри того, что уже является языком сценариев шаблонов, но отделение логики от отображения, которое она дает вам, так необходимо.
Класс ReflectionClass предоставляет информацию о данном классе.
$classInfo = new ReflectionClass ('MyClass');
if ($classInfo->hasMethod($methodName))
{
$cm = $classInfo->getMethod($name);
$methodResult = $cm->invoke(null);
}
Помимо прочего, полезно проверить, существует ли метод, и вызвать его.
Как уже упоминалось, возможность запустить PHP на уровне командной строки просто фантастическая. Я постоянно устанавливаю сценарии PHP в качестве заданий cron для очистки и резервного копирования данных. Просто запустите файл с этих строк:
#!/usr/bin/php5
<?php
// start coding here
Обратите внимание, что первая строка может отличаться в зависимости от того, где PHP установлен в вашей системе.
Отсюда легко реализовать PHP для более сложных процессов системного уровня, как демоны.
В качестве альтернативы вы можете указать #! / Usr / bin / env и позволить системе найти его за вас.
Просто отстой, что вы не можете выполнять автозагрузку классов в CLI, иначе это отличная функция.
Совет: используйте #! / usr / bin / env php, и он будет меньше зависеть от того, где находится двоичный файл php на диске.
Вы также можете использовать php script.php. Не такой короткий, но более гарантированный для работы на разных машинах.
Лот уже сказал об этом.
Просто добавлю, что одна вещь, которая выглядела довольно забытой, если не скрытой, - это часть http://talks.php.net из http://www.php.net. В нем собрано много полезных презентаций, некоторые из которых действительно старые, а некоторые новые и чрезвычайно ценные.
Я думаю, что их должное уважение к функции GOTO является ключевым.
Обязательный xkcd: xkcd.com/292
Предопределенные интерфейсы:
http://php.net/manual/en/reserved.interfaces.php
Например, реализация ArrayAccess сделает ваш объект массивом или Iterator позволит использовать его в операторе foreach.
К сожалению, вы не можете использовать «объектные массивы» с собственными функциями, которые принимают массивы в качестве параметров.
Я также счел полезным переопределить функцию __call, которая позволяет динамически создавать свойства и методы для объекта.
В своей абстракции базы данных я использую это для создания функций, названных по именам столбцов базы данных. Например, если есть «имя» столбца, вы можете изменить значения в нем с помощью updateByName("foo").
Еще одна приятная функция - копия (). Эта функция позволяет получить файл из любого места (даже URL-адреса работают) и скопировать его на локальный ресурс. Так что захват файлов становится действительно простым.
Магический метод __callStatic.
Действительно полезно делать синглтоны, как этот Одноэлементный класс PDO
Вопрос по исходному сообщению: зачем вам нужен оператор switch, чтобы перегрузить метод в PHP? Возможно, вы имеете в виду под термином «перегрузка» что-то, что не соответствует тому, что я узнал из C++.
Что касается любимых функций PHP, мне нравится объект Exception. Я считаю, что наличие стандартного контейнера ошибок значительно упрощает отделение логики представления от бизнес-логики, а синтаксис throw / catch значительно упрощает написание автоматизированных тестов для каждого класса изолированно.
Жаль, что большинство функций PHP не используют исключения!
Стекируемые файлы юнитов
<?
// file unit1.php
$this_code='does something.';
?>
<?
// file unit2.php
$this_code='does something else. it could be a PHP class object!';
?>
<?
// file unit3.php
$this_code='does something else. it could be your master include file';
require_once('unit2.php');
include('unit1.php');
?>
<?
// file main.php
include('unit1.php');
require_once('unit2.php');
require_once('unit3.php');
?>
Я намеренно использовал include и require_once как взаимозаменяемые, чтобы показать, что можно сделать, потому что они работают по-разному.
Существует несколько способов создания кода или добавления файлов в код. Можно даже динамически связывать HTML, AJAX, CSS, JAVASCRIPT, ИЗОБРАЖЕНИЯ и всевозможные файлы в свой код.
Мне это особенно нравится, потому что также нет требований размещать include / requires в начале, середине или конце. Это дает больше свободы в зависимости от использования.
Использование cURL для настройки набора тестов для управления большой сложной веб-формой и ее серверным приложением. Тесты были исчерпывающими - по крайней мере, с точки зрения выполнения каждой комбинации допустимых входных данных.
included может иметь практически любой тип файла, от .html до .jpeg. Любая байтовая строка, найденная внутри связанных открытых тегов PHP, будет выполнена. Да, образ goat.se может содержать все ваши обычные служебные функции. Я предполагаю, что внутренним поведением include является преобразование входного файла в строку и анализ любого кода php.
Вы можете использовать break N; для выхода из вложенных циклов (чтобы компенсировать отсутствие goto). Например
for (int i=0; i<100; i++) {
foreach ($myarr as $item) {
if ($item['name'] == 'abort')
break 2;
}
}
Подробнее здесь - http://php.net/manual/en/control-structures.break.php
Я предполагаю, что эта «функция» лучше останется СКРЫТОЙ, иначе у нас скоро появятся десятки «программистов» PHP, использующих GOTO. GOTO - это зло! Но в любом случае, не знал об этом ... Красиво :)
goto на самом деле больше нет ...
Это очень полезно и безопасно, пока мы не имеем дело с объектами / структурами, которые должны быть, из-за отсутствия лучшего слова, «освобожденными». Но в целом мне очень не хватает этого на других языках - я думаю, это намного яснее и недвусмысленнее, чем любой GOTO.
Вы можете установить проверку для каждой опции при использовании оператора switch, это пример:
$check = "HELLO";
switch ($check) {
case (eregi('HI', $check)):
echo "Write HI!";
case (eregi('HELLO', $check)):
echo "Write HELLO!";
case (eregi('OTHER', $check)):
echo "Write OTHER!";
}
До свидания...
Вы знаете, что ereg * устарел, верно?
Лямбда-функции
Пример - сортировка по полю в многомерном массиве
function sort_by_field($field, & $data) {
$sort_func = create_function('$a,$b', 'if ($a["' . $field . '"] == $b["' . $field . '"]) {return 0;}
return ($a["' . $field . '"] < $b["' . $field . '"]) ? -1 : 1;');
uasort($data, $sort_func);
}
Анонимные функции
Анонимные функции позволяют вам определять функцию переменной. http://www.php.net/manual/en/functions.anonymous.php
create_function оооочень неэлегантен. Попробуйте новый синтаксис PHP 5.3.
Чтобы было ясно, синтаксис 5.3 - это анонимные функции.
Сокращенные логические цепочки
<?php
TRUE AND print 'Hello';
FALSE OR print 'World';
// Prints "Hello World";
// Complex example...
User::logged_in() or die('Not allowed');
User::is_admin() AND print 'Admin Area';
Что действительно полезно, если у вас есть файлы PHP в области, доступной через Интернет. Вставляя этот небольшой лакомый кусочек в верхнюю часть каждого файла, вы можете быть уверены, что никто не сможет получить доступ ни к одному файлу, кроме index.php.
<?php defined('YOURCONSTANT') or die('Not allowed');
///rest of your code
Это напечатает «HelloWorld», а не «Hello World».
Сломанная парадигма объектно-ориентированного программирования? Для меня это худшая «скрытая» функция, которую вы обнаружите.