Скрытые возможности PHP?

Я знаю, что это звучит как назойливый вопрос, но позвольте мне объяснить, откуда я.

После колледжа я устроился на работу в магазин PHP. Я проработал там полтора года и подумал, что узнал все, что нужно, о программировании.

Затем я устроился на работу в отдел внутренней разработки с одним человеком в крупную корпорацию, где вся работа была на C#. Придерживаясь этой должности, я начал читать кучу блогов и книг и быстро понял, насколько я был неправ, думая, что знаю все. Я узнал о модульном тестировании, паттернах внедрения зависимостей и декораторах, принципах проектирования слабой связи, спорах о компоновке над наследованием и т. д. И т. Д. - я все еще очень сильно поглощаю все это. Излишне говорить, что мой стиль программирования полностью изменился за последний год.

Теперь я обнаружил, что беру php-проект, пишу код для стартапа друга, и чувствую себя полностью ограниченным, в отличие от программирования на C#. Меня действительно беспокоит, что ко всем переменным в области класса нужно ссылаться, добавляя «$ this->». Меня раздражает, что ни одна из IDE, которые я пробовал, не имеет очень хорошего intellisense и что мои методы модульных тестов SimpleTest должны начинаться со слова «test». Меня сводит с ума тот факт, что динамическая типизация не позволяет мне неявно указывать, какой тип параметра ожидает метод, и что вам нужно написать оператор switch для перегрузки метода. Я терпеть не могу, что у вас не может быть вложенных пространств имен и вам нужно использовать оператор :: для вызова конструктора базового класса.

Сейчас у меня нет намерения начинать дискуссию о PHP и C#, скорее я хочу сказать, что я уверен, что есть некоторые функции PHP, о которых я либо не знаю, либо о которых я не знаю, но которые не используются должным образом. Я нахожусь в своей вселенной C#, и мне трудно видеть что-то за стеклянной чашей.

Итак, я спрашиваю, какие ваши любимые особенности PHP? Что вы можете сделать в нем, чего не можете или что сделать в языках .Net является более сложным?

Сломанная парадигма объектно-ориентированного программирования? Для меня это худшая «скрытая» функция, которую вы обнаружите.

knoopx 26.12.2009 21:25

Эти темы довольно забавные ... Потому что для команды, в которой я работаю, «скрытая функция» - это кодовая фраза, означающая «ошибка». И знаете что ... Иногда обнаружение скрытой функции не всегда хорошо ...

Ganesh Shankar 24.02.2010 02:44

@Ganesh ошибка одного человека - скрытая особенность другого человека ...

Xeoncross 29.06.2010 03:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
174
3
60 400
78

Ответы 78

Вот один, мне нравится, что установка значений по умолчанию для параметров функции, которые не поставляются, намного проще:

function MyMethod($VarICareAbout, $VarIDontCareAbout = 'yippie') { }

Как ни странно, на прошлой неделе я увидел эту «скрытую функцию» в Google Reader. Я не понимаю, что в этом скрыто - это базовый синтаксис. Например, попробуйте if ($ var = true).

Ross 13.10.2008 19:28

Легче чего? Эта функция есть в большинстве языков.

Christian Davén 08.04.2009 18:28

Проще, чем C# (и я думаю, C++ и Java)

George Mauer 08.04.2009 19:40

C++ поддерживает значения параметров по умолчанию.

sjobe 23.06.2009 00:45

Реальные объектно-ориентированные языки поддерживают перегрузку имен методов, благодаря чему эта функция работает одинаково.

whiskeysierra 21.12.2009 16:35

C# вообще не поддерживает значения по умолчанию. вам нужно написать перегруженную функцию и всегда объявлять значение, которое просто громоздко

DeveloperChris 09.01.2010 09:02

C# будет поддерживать значения по умолчанию в версии 4.0. Хотя предположительно в основном для поддержки COM-взаимодействия

George Mauer 11.01.2010 19:01

Это то, к чему я привык в C++ и Python. Аргументы по умолчанию - это одна из вещей, которые я считаю упущениями в некоторых языках, а не просто интересными функциями на других языках.

Ivan Vučica 30.06.2010 08:19

Магические методы - это сквозные методы, которые, помимо прочего, вызываются всякий раз, когда вы вызываете метод, который не существует, или назначаете или читаете свойство, которое не существует.

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

grom 29.10.2008 02:44

Не согласен. Это намного слабее, чем аналогичные возможности в Smalltalk, Ruby и Python (и предположительно он был скопирован с одного из них).

finnw 22.06.2009 01:49

Тот факт, что реализация этой функции в PHP слабее, чем в других языках, не делает ее менее полезной в PHP.

Allain Lalonde 22.06.2009 06:07

__call() отлично подходит для фреймворков с картой domain.com/controller/method/

alex 09.07.2009 16:30

Магические методы также чертовски медленны. Используйте их осторожно.

Alex Weinstein 30.07.2009 00:07

Медленно по сравнению с чем: garfieldtech.com/blog/magic-benchmarks да, медленнее, но не заметно. Конвейер будет играть большую роль, чем магические методы, если вы не работаете с очень большими нагрузками.

Allain Lalonde 31.07.2009 17:39

Полезно, например, для логики уровня представления и реализации миксинов, известных в Ruby.

Jasper Bekkers 10.12.2009 14:22

Кто-нибудь еще думает, что магические методы фантастически опасны? Они не заполняются автоматически в выбранной вами IDE, если вы не знаете, что есть какая-то магия, тогда выполнение кода на глаз невозможно, вы можете в конечном итоге использовать их случайно вместо одноименного немагического метода ...

sanbikinoraion 08.01.2010 20:38

По сути, это похоже на прямой вызов в Objective-C.

G-Wiz 09.01.2010 10:11

А начиная с php 5.3 в список магических функций добавлен «__invoke».

Bob Fanger 05.06.2010 16:59

Я обновил список, включив в него все магические методы, и добавил параграф о других методах функциональности перегрузки.

NikiC 28.08.2010 13:28

На каком языке разрешена перегрузка операторов, а нет допускает перегрузку этих операторов?

Billy ONeal 30.08.2010 20:44

Обработчики потоков позволяет вам расширить «файловую систему» ​​логикой, которую, насколько я знаю, довольно сложно реализовать на большинстве других языков.

Например, с помощью Обработчик потока 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.

MiffTheFox 06.06.2009 11:26

ИМХО, наличие правильного объектно-ориентированного подхода было бы намного разумнее, чем этот беспорядок с обработчиками потоков. Да, это мило - иметь возможность читать / писать файлы Excel, но должно ли это так работать?

Anti Veeranna 23.08.2009 00:50

Может быть, и так, но этот подход инкапсулирует сложность в интерфейсе, который является общим для большинства разработчиков PHP ... не требуя от них изучения объектно-ориентированных концепций, которые могут быть им недоступны.

Allain Lalonde 23.08.2009 17:59

Если вы работаете с Amazon S3, обратите внимание на Zend_Amazon_S3, который предоставляет потоковый интерфейс для URL-адресов, таких как 's3: // {bucket-name} / path'.

davidtbernal 13.09.2009 04:21

Я использовал это, чтобы создать простой DSL для моего уровня представления, просто прочитав файл PHP, сделав некоторую замену строки и передав ее через eval (). Например, я сделал так, что могу использовать короткие теги всякий раз, когда захочу, и делаю @ -> someVar, чтобы иметь доступ к данным на уровне представления.

Jasper Bekkers 10.12.2009 14:21

не php-кодировщик, но разве в этом фрагменте кода отсутствуют закрывающие скобки для трех средних строк array(?

rtpHarry 01.05.2010 13:36

Некоторые потоки также доступны для pop и imap. Действительно убийца!

Savageman 29.06.2010 01:08

@Allain Lalonde: Я не думаю, что тот, кто не понимает концепции ООП, должен писать код такой сложности. Кроме того, как этот метод сочетается с другими обработчиками потоков? Что, если я захочу загрузить этот файл XLS через ftp: //?

Matti Virkkunen 07.12.2010 03:24

Документация. документация получает мой голос. Я не встречал более подробной онлайн-документации по языку программирования - все остальное мне нужно собрать воедино с различных веб-сайтов и страниц руководства.

Я согласен. Возможность набрать www.php.net/function_name и в большинстве случаев получать ссылку - это здорово.

Allain Lalonde 14.09.2008 21:46

эх, мне нравится руководство и все такое, но было бы лучше, если бы все было не просто глобальным. Не говоря уже о том, что названия некоторых функций настолько произвольны, что иногда бывает сложно найти то, что вам нужно.

George Mauer 15.09.2008 03:13

В большинстве IDE есть функция поиска вручную. В моей IDE (PhpDesigner), если вы вводите имя функции и набираете (), она показывает вам ожидаемые аргументы во всплывающей подсказке. Если вы выберете функцию и нажмете f1, отобразится страница руководства для этой функции в файле .chm.

Click Upvote 04.01.2009 19:29

Это отличная функция PHP, но я бы не стал называть ее скрытой ... Если вы когда-либо искали в Google параметры метода и т. д., Вы оказались бы на php.net.

John Bubriski 23.03.2009 20:04

Истинный; Однако вопрос, на который я ответил, был озаглавлен «Какие особенности языка PHP вам нравятся больше всего?» и документация, безусловно, относится к этим критериям.

Kyle Cronin 23.03.2009 21:03

Я тоже согласен. Самое замечательное в руководстве - это комментарии пользователей. Я редко видел, чтобы они были в других документах. Они могут содержать настоящие драгоценные камни. Единственным недостатком является то, что ИМХО они слишком рано подрезают.

Sander Marechal 22.06.2009 02:37

Я был бы признателен, если бы они организовали ссылку на функцию немного лучше и разделили ее на темы. Особенно следует разделять классы, связанные с конкретными базами данных и другими внешними технологиями, потому что они используются редко, а их много.

Michał Tatarynowicz 03.11.2009 22:42

MSDN - обширный и в значительной степени превосходный справочник (включая HOWTO и руководства). Меня шокирует тот факт, что, несмотря на это, разработчики php считают документацию самой лучшей особенностью php.

G-Wiz 09.01.2010 09:54

@Phoexo "немного менее читабельный" ??? Я никогда не понимал и никогда не пойму MSDN, а документация PHP проста и понятна.

lauriys 13.02.2010 15:13

Без сомнения, PHP прост и понятен, но MSDN также является хорошим источником информации и ответит на большинство ваших вопросов.

Phoexo 13.02.2010 22:04

Система комментариев потрясающая; Я бы хотел, чтобы у Sun было это для их онлайн-документации Javadoc, хотя есть Docjar (но было бы лучше на веб-сайте Sun из-за большего количества посетителей).

Chris Dennett 24.02.2010 00:45

@wallacoloo вопрос, на который я ответил, был озаглавлен "Какие особенности языка PHP вам больше всего нравятся?" и документация, безусловно, относится к этому

Kyle Cronin 25.02.2010 08:00

Не согласен. Единственная причина, по которой документация "хороша", заключается в том, что некоторые комментарии пользователей закрывают все дыры в официальных примечаниях.

Rob Howard 27.02.2011 11:28

Да, документация PHP хороша, потому что она охватывает большинство из 9000 граничных случаев каждой функции, и даже больше описано в комментариях.

L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ 16.11.2011 08:51

Манипуляции с массивами.
Тонны инструментов для работы с массивами и управления ими. Возможно, он не является уникальным для PHP, но я никогда не работал с языком, который упростил бы его.

что например? Мне кажется, что все функции неудобно названы и расположены в глобальном пространстве имен. Кроме того, я не могу придумать ничего, что было бы так просто на другом языке, кроме, может быть, $ arr [] = $ newvalue для добавления значений - это круто

George Mauer 14.09.2008 22:29

Что ж, массив PHP - это структура данных, которую можно легко использовать как стек, очередь, двухстороннюю очередь, список, хеш-таблицу и т. д. Он действительно довольно гибкий для большинства общих нужд, не прибегая ни к чему другому, кроме функций array_ *.

Camilo Díaz Repka 19.09.2008 18:22

Python делает массивы (в виде списков и кортежей) намного лучше, чем PHP.

too much php 18.11.2008 10:08

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

function foo ( array $param0, stdClass $param1 );

Примечание: Работает только для имен «массив» и объектов.

И так далее, и вы даже можете передавать свои собственные классы в качестве ожидаемых параметров. Вызов методов / функций с чем-то другим приведет к фатальной ошибке.

Еще один намек на хороший intellisense в PHP. Мы используем ZendStudio, и на самом деле он будет работать намного лучше, если вы напишете хорошие PHPDocs для своих методов, он будет учитывать их при намеках.

Согласно ch2.php.net/language.oop5.typehinting, «строка» не поддерживается для подсказки типов. "массив" поддерживается начиная с PHP 5.1, а определенные типы объектов поддерживаются начиная с 5.0.

JW. 14.09.2008 23:50

Чтобы усилить JW, скалярные типы не поддерживаются при указании типов (за исключением массивов), однако все типы поддерживаются при приведении типов.

dcousineau 24.06.2009 01:33

Я был с вами до тех пор, пока вы не предположили, что ZendStudio - это даже удаленно проходимая IDE.

Jeremy Logan 04.07.2009 11:12

Подбор текста для скаляров будет доступен с PHP 5.4.

NikiC 30.08.2010 20:46

Кроме того, в примечании говорится: «Это работает только для имен массивов и объектов». но чтобы быть полностью педантичным, он должен читать: «Это работает только для« массивов »и имен классов».

Wil Moore III 02.09.2010 01:32

Веб-пространство с поддержкой PHP обычно дешевле, чем что-то с (asp) .net. Вы мог бы называете это функцией ;-)

Кроме того, гораздо дешевле установить несколько серверов, если вам не нужно платить за Windows Server на каждом из них.

MiffTheFox 06.06.2009 11:29

Единственное место, где я знаю, где Windows является рентабельной, - это университет, который получает скидки STEEEEP на серверное программное обеспечение, поскольку для моего отдела дешевле купить 100 копий Windows, чем обучать наших администраторов работе с Linux (что частично мне грустно, но их настройки Windows чистые и хорошо настроены).

dcousineau 22.06.2009 02:37

Пока, но переключиться нужно только один раз, а новые лицензии рано или поздно придется покупать ...

e-satis 26.10.2009 16:35

Переменные переменные и функции без сомнения!

$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!).

Обожаю эти! Потребовались минуты, чтобы сбить меня с толку, годы, чтобы научиться справляться.

willasaywhat 30.09.2008 18:28

Неустранимая ошибка PHP: вызов неопределенной функции foobar! (); Поместите $$ перед foo ();

David 13.10.2008 20:25

Также скажите больше под контролем, чем "eval ()" !!

Joshi Spawnbrood 24.10.2008 11:19
stackoverflow.com/questions/1003605/… << Related question I posted last week
sjobe 23.06.2009 00:05

переменные переменные фактически делают код менее читаемым и более подверженным ошибкам.

Elzo Valugi 09.07.2009 16:30

Хорошо ... хорошо ... это больно. Как сказал Эльзо, менее читабельный, беспорядочный, а значит, и плохой. Это НЕ Perl.

Ivan Vučica 09.07.2009 18:09

Чем больше гибкости, тем сложнее. Но также больше гибкости :)

Jrgns 10.07.2009 23:23

И люди реально этим пользуются? Человек, я бы не хотел читать эти источники.

Gary Willoughby 26.07.2009 03:29

Переменные переменные - одна из худших возможностей PHP.

davidtbernal 13.09.2009 04:22

часто беспорядок, но в очень немногих случаях действительно хорошая помощь

dusoft 10.12.2009 14:21

9 Из 10 случаев переменные переменные лучше заменять массивами, чтобы у вас были все данные в одном месте, вы могли перебирать их и так далее. Только в некоторых очень специфических обстоятельствах они могут быть полезны.

Jasper Bekkers 10.12.2009 14:24

Пожалуйста, не заставляйте новичков использовать эту «функцию».

whiskeysierra 21.12.2009 16:29

Переменные переменные - это, по сути, двойные указатели. Функции переменных - это просто указатели на функции. Эти концепции существуют уже много лет с тех пор, как C.

Alex Weinstein 22.12.2009 07:39

@Alex - Да, за исключением PHP, новички могут использовать его и принимать пользовательский ввод, что, в свою очередь, заставляет меня помогать этим людям.

Tor Valamo 12.01.2010 10:41

call_user_func () - еще один возможный заменитель некоторых функций переменных.

Frank Farmer 24.02.2010 00:18

Пожалуйста, как минимум напишите ${$a}. Просто чтобы остальные из нас знали, что что-то происходит, и два $$ не просто свернуты в один.

Thomas Ahle 24.02.2010 00:47

Я мало что знаю о PHP, но реализация ссылок (или их использование, если они уже существуют) было бы лучше путь, чем делать это таким образом.

Ponkadoodle 24.02.2010 02:48

Для чего, черт возьми, это можно использовать? Может кто-нибудь объяснить это?

Emil 30.10.2010 14:01

@Emil, одним из примеров может быть вызов шаблона, имя которого хранится в базе данных.

zzzzBov 27.01.2011 00:45

ХОРОШИЙ:

  • Широкое распространение PHP в WebHosting. Почти все службы веб-хостинга поддерживают PHP.
  • Простые вещи можно решить с помощью простого кода. Никаких классов или пространств имен строго не требуется.

ПЛОХО:

  • Существует масса функций без каких-либо соглашений об именах. Так сложно запомнить все эти функции, чтобы использовать их эффективно.
  • Плохие привычки программирования, по всему Интернету :(

Согласитесь, что Плохой №1, но, конечно, Плохой №2 - это не ошибка языка, а ошибка программиста? является можно написать красивый PHP ... честно!

HoboBen 13.10.2008 03:07

Я думаю, что меня больше, чем непоследовательное именование, раздражает непоследовательный порядок аргументов. Например, функции поиска по строкам - сначала идет стог сена или иголка? В некоторых функциях порядок изменился довольно давно - также некоторые функции принимают их в любом порядке для совместимости.

thomasrutter 20.03.2009 13:05

Не уверен, что это скрытые возможности PHP ...

Sasha Chedygov 22.06.2009 09:53

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) {}

sjobe 23.06.2009 01:07

Ваш пример вводит в заблуждение. Предоставленный вами код выполняет приведение типов, которое поддерживает скалярные типы. (int)$i вернет int (а не строковое представление), а (Bar)$i вернет Bar или отказ. Подсказка типов выполняется на уровне определения функции (function foo($a, array $b, Bar $c)) и поддерживает только подсказки для массивов и объектов.

dcousineau 24.06.2009 01:29

Функции Приведение типов и ctype_ * становятся важными для обеспечения чистых данных. В последнее время я широко использую исключения, что значительно упростило мой код обработки ошибок.

Я бы не сказал, что у этого языка много убийственных функций. (По крайней мере, я не нахожу особых поводов искать их.) Мне нравится, что язык ненавязчивый.

Почему я раньше не узнал о функциях Ctype? Очень полезный!

Alec 14.06.2009 03:54

Массивы. Судя по ответам на этот вопрос, я не думаю, что люди полностью понимают, насколько простые и полезные массивы в PHP. Массивы PHP одновременно действуют как списки, карты, стеки и общие структуры данных. Массивы реализованы в ядре языка и используются повсеместно, что приводит к хорошей локализации кэша ЦП. И Perl, и Python используют отдельные языковые конструкции для списков и карт, что приводит к большему копированию и потенциально запутанным преобразованиям.

Преимущество подхода Perl состоит в том, что мы можем заявить о своем намерении иметь упорядоченный контейнер.

jrockway 11.02.2009 03:55

Элементы массива PHP упорядочены.

user8134 17.02.2009 22:02

Мой первоначальный переход с PHP на C# чуть не убил меня. В C# массивы представляют собой простую структуру со статическим размером и числовым индексом. В PHP массивы - это клейкая лента вселенной!

Dinah 25.03.2009 19:04

Действительно, гибкость массивов PHP, а также интерфейсов ArrayAccess, Iterator и Countable (для создания класса, который можно использовать точно так же, как массив), делают мою жизнь настолько легкой, хотя выполнение некоторых задач без нее труднее.

dcousineau 22.06.2009 02:31

Трудно недооценить универсальность массивов. Как только вы разовьете мышление использовать их в своих интересах, вы сможете делать удивительные вещи.

staticsan 22.06.2009 04:34

Я тоже согласен. Когда я играл с Java для задания Uni, я был поражен их жесткостью и отсутствием гибкости. Действительно заставил меня оценить, насколько хороши массивы PHP.

Christian 22.06.2009 04:54

Вы даже можете легко конвертировать между массивами и объектами, выполняя (array) $ object и (object) $ array. Это не рекурсивно, но написать такую ​​функцию несложно.

Michał Tatarynowicz 03.11.2009 22:46

Сравнение массива php с массивами java похоже на сравнение яблок с бананами. Если вам нужны быстрые коллекции фиксированного размера, используйте массив. Если вам нужны растущие и простые в использовании коллекции, используйте List.

whiskeysierra 21.12.2009 16:25

Я уверен, что массивы php - это здорово, но 40 голосов за комментарий, сбивающий с толку массивы C#? Если массив C# не подходит, есть много вариантов. ArrayList и общие коллекции очень эффективны. Существует множество типов коллекций для конкретных нужд. Единственный фактический преимущество php в этом отношении состоит в том, что он не предоставляет никаких опций, из которых программист должен решить. Вы либо используете массив, либо у вас нет индексируемой переменной.

G-Wiz 09.01.2010 10:01

С другой стороны, синтаксис массивов - отстой. Во многих языках сценариев вы можете создать простой 2D-массив, например [[1, 2], [3, 4]], сравните его с версией PHP: array(array(1, 2), array(3, 4)).

Rene Saarsoo 04.02.2010 11:43

@gWiz: согласен. Непонятно, почему массив C# не является также ArrayList, Dict или HashTable. То, что это работает на одном языке, не означает, что так должно быть везде. Тем не менее, я проклинал ASP каждый раз, когда мне приходилось возвращаться с PHP по той же причине.

Tom 23.02.2010 23:30

Массивы @Tom C# тускнеют, потому что нужно думать. Вы только что сказали, что существует 4 типа данных, которые необходимы для охвата большинства возможностей простых массивов PHP. Массивы PHP просто работают.

smdrager 29.06.2010 08:12

Вы сравниваете статические и динамические языки и жалуетесь, что не получаете преимуществ динамического языка со статическим языком, не принимая во внимание недостатки динамических языков. Я попадаю в лагерь динамических языков и предпочитаю подход PHP, но он не делает его единственным истинным путем.

Tom 29.06.2010 17:28

Я не уверен, что люди выбивают массивы C#. У меня была та же проблема (до сих пор), когда я перешел с PHP на C#, я был уверен, что массивы действительно используются для всего. Но в C# массив - это просто массив. Это был просто культурный шок, а не ненависть к C#.

Chris Ridenour 09.07.2010 00:48

… Это не о том, чтобы разбить массивы C#, но я проголосовал за «В PHP массивы - это клейкая лента вселенной!»

feeela 22.10.2011 00:21

Насколько легко найти связанные с PHP примеры, приложения, классы, документацию, фреймворки и т. д.

Во всем Интернете это самый простой язык для изучения, когда вы станете коммандос (в одиночку), а также тот, который больше ценит ваше время.

После изучения PHP можно поставить CMS с joomla, блог с wordpress и т. д.

После изучения PHP нажмите CodeIgniter или Symfony для улучшения разработки. Они должны помочь упростить переход на Ruby или Python в будущем. Если это твоя цель, конечно.

Jon Winstanley 01.07.2009 19:30

Я иногда добавляю также «Как легко найти примеры PHP Плохо». люди учатся писать "привет, мир", и они думают, что они бог-программист, и распространяют предложения, которые ... иногда не совсем хорошие

Strae 24.02.2010 12:44

а) руководство - чрезвычайно всеобъемлющий, актуальный и просто огромный источник вдохновения при решении проблем - застрял? просмотрите / найдите руководство, оно придет к вам

б) массивы - они пластичны, они ассоциативно проиндексированы, их можно легко вложить (!) для создания каких-то диких структур данных, и есть множество функций только для операций с массивами. О, и я уже упоминал, что нужно рассматривать отдельные переменные как массив значений?

c) eval () и подобные конструкции (например, имена динамических переменных и функций), которые обеспечивают гораздо большую гибкость (и по-прежнему относительно безопасны, если вы знаете, что делаете) - ничто не сравнится с программой, которая в основном определяет свой собственный поток процесса (или даже конкретное исполнение) на лету

г) наиболее вероятно, что проще всего упустить из виду: поскольку почти все в движке ZEND - это zVal (который, по сути, представляет собой набор ссылок на указатели), возможность возвращать что-либо в качестве возвращаемого значения функции


Кроме того, я хотел бы отметить одну замечательную функцию, но она больше связана с исходным кодом PHP, чем с языком (и поэтому - указана отдельно):

д) простота написания Расширения C (в основном интерфейсы для других объектов, таких как OpenAL или SDL) - отличная структура исходного кода и примерно столько же мощных инструментов внутри, сколько и снаружи - если вам когда-нибудь понадобится расширить функциональность чуть больше.

Я пишу PHP полный рабочий день в течение 5 лет и не встречал ни одной ситуации, в которой мне законно нужно было бы использовать eval () или переменные переменные.

Frank Farmer 27.06.2010 01:40

Читаемость eval () - использование программ ... нехорошо. Хуже, чем "goto" imho, но, как и "goto", может иметь законное использование.

Ivan Vučica 30.06.2010 08:20

@Frank: чрезвычайно полезно при кодировании с кем-то, кто выполняет экстремальные операции GET (около предела длины URI). Объявите таблицу и пройдите по ней с автоматической очисткой входных данных. В этом не было особой необходимости, но это сделало мою жизнь намного проще. @ Иван: Согласен, это ужасно. С другой стороны, бывают случаи, когда аналогичные - и в то же время разные - функции должны быть сосредоточены вокруг общего ядра. В какой-то момент мне было намного проще просто сгенерировать их во время выполнения, поскольку принятый стандарт заключался в объявлении функций PHP как внешних команд, используемых интерфейсом. Сэкономлено много времени.

Egon_Freeman 23.09.2010 17:01

Легкость. Самая большая особенность заключается в том, насколько легко новым разработчикам сесть и написать «рабочие» сценарии и понять код.

Худшая особенность заключается в том, насколько легко новым разработчикам сесть и написать «рабочие» сценарии, думая, что они понимают код.

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

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

Определенно хороший комментарий. Python был моим первым языком, и это было здорово, но отсутствие проектов, которые я чувствовал способным понять, действительно создавало препятствия. С помощью PHP я могу найти в документации практически все, что угодно, и разобраться в этом ... ресурсы, доступные в Интернете, потрясающие.

dscher 06.04.2010 07:49

Одна не очень известная функция 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 вы можете установить значения по умолчанию перед извлечением

Ken 06.10.2008 22:03

Я собирался рассердиться на вас за то, что вы предположили, что extract () в любом случае является хорошей функцией. Но я думаю, что пользоваться им довольно удобно. Полагаю, это единственный раз, когда я видел, как он используется там, где это хорошая идея!

thomasrutter 20.03.2009 12:59

extract () упрощает создание вашей собственной чрезвычайно легкой системы шаблонов. +1

Dinah 25.03.2009 21:32

Его обратный, compact (), тоже хорош: $ a = 1; $ b = 2; компактный ('а', 'б'); // == массив ('a' => $ a, 'b' => $ b)

Annika Backstrom 07.06.2009 01:48

Да, это, вероятно, единственное действительно хорошее использование extract ().

staticsan 22.06.2009 04:33

Zend Framework часто использует extract () в своих помощниках просмотра.

zachleat 22.06.2009 17:38

Я бы посоветовал в этом случае не использовать общие слова в качестве имен аргументов функций, поскольку $ context, из которого вы извлекаете (), может содержать значения в индексах as_string или template_name. Использование EXTR_SKIP допустимо, но только перемещает проблему в другое место (т.е. если шаблон ожидает $ as_string, он получит для него неверное значение).

Michał Tatarynowicz 03.11.2009 21:10

extract() - это зло! Практически такое же зло, как и eval(). Нет ничего хуже, чем пытаться понять и отладить код, используя extract() и compact() почти во всех функциях. Никогда не знаешь, откуда взялась переменная.

Petr Peller 23.02.2010 23:45

Я думаю, что extract () и compact () имеют свое применение и могут быть очень мощными при использовании в правильном контексте. extract () отлично подходит для создания систем шаблонов, а compact отлично подходит для быстрого создания хэш-массивов.

Mark Story 26.05.2010 20:05

За исключением $as_string, это почти то же самое, что моя маленькая функция renderView!

Halil Özgür 07.12.2011 12:53

Я немного похож на вас, я кодировал PHP более 8 лет. Мне пришлось пройти курс .NET / C# около года назад, и мне очень понравился язык C# (ненавидел ASP.NET), но он сделал меня лучшим разработчиком PHP.

PHP как язык довольно плохой, но я очень быстро с ним разбираюсь, и стек LAMP великолепен. Конечный продукт намного превышает сумму частей.

Тем не менее, в ответ на ваш вопрос:

http://uk.php.net/SPL

Мне нравится SPL, класс коллекции в C# мне понравился, как только я начал с ним работать. Теперь я могу съесть свой торт и съесть его.

Андрей

Встроенные фильтры для анализа переменных по определенным предопределенным типам, а также охват основ (int / float и т. д.), Распространяется на электронные письма, URL-адреса и даже если переменная является действительным регулярным выражением.

http://ch2.php.net/manual/en/book.filter.php

Файлы __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 () лучше использовать?

alex 21.04.2009 06:04

Конечно! __autoload () - это PHP4, но spl_autoload_register () - это неразрушающее «шлейфовое соединение» методов автозагрузки.

Willem 22.04.2009 00:00

Удобная функция, но с одной оговоркой, когда вы находите экземпляр данного класса, становится немного сложнее выследить местоположение файла класса. Явное определение включений вверху дает вам конечный список задействованных классов и их точное расположение.

Cory House 25.04.2009 07:20

Это хорошая функция, но только для того, чтобы обойти ситуацию, когда код не скомпилирован заранее, поэтому он не знает, где будет находиться класс. Большим недостатком этого является то, что у вас не может быть 2 классов с одинаковым именем, даже если они находятся в разных пространствах имен.

Kibbee 01.07.2009 05:59

@Cory: Просто пусть __autoload хранит список загруженных классов и файлов, из которых он их загрузил.

Jasper Bekkers 10.12.2009 14:25

@Jasper и @Cory: Вы также можете использовать php.net/get_included_files.

mcrumley 30.01.2010 00:20

Пожалуйста, ознакомьтесь с пропсалом PSR-0 от рабочей группы по стандартам PHP (с участием разработчиков ZF, Symfony, Doctrine, CakePHP, Solar и т. д.) При реализации автозагрузки: groups.google.com/group/php-standards/web/psr-0-final-propos‌ al

Philippe Gerber 29.08.2010 15:18

Затем трюк "и печать"

<?php $flag and print "Blah" ?>

Будет эхо Blah, если $ flag истинно. НЕ РАБОТАЕТ С ECHO.

Это очень удобно в шаблоне и заменяет? : это не очень легко читать.

Я лично считаю, что тернарный оператор намного более очевиден, чем использование короткого замыкания вычисления логического и.

Vicent Marti 06.10.2008 15:16

На самом деле это то же количество символов, что и <? Php if ($ flag) print "Blah"

too much php 18.11.2008 10:00

Скобки напечатать не так просто, как "и", особенно на моей чертовой французской клавиатуре ;-)

e-satis 18.11.2008 20:10

Это короче, если у вас включены короткие теги: <?=$flag?'blah':''?>. Собственно без коротких тегов все равно короче.

DisgruntledGoat 26.10.2009 15:52

@ все комментарии - Дело не в том, насколько коротким вы можете его получить! Речь идет о удобочитаемости и простоте использования для разработчиков шаблонов, которые иногда даже не являются программистами.

Tor Valamo 12.01.2010 10:47

Я бы сказал, что оператор if () проще и читабельнее. Для меня, конечно, легче разобраться, чем использовать по существу побочный эффект оператора 'and' в PHP, где легко сделать ошибку (или выглядеть так, как будто это ошибка, когда вы позже прочитаете код). Например, как уже говорилось, это не будет работать так, как вы хотите, с «эхо». С if () таких ошибок не бывает.

thomasrutter 10.04.2010 06:54

print - это функция, echo - это инструкция, поэтому echo не работает.

Walt Stoneburner 21.07.2010 23:20

Версия if... не заставляет задуматься.

Halil Özgür 07.12.2011 13:07

стандартный класс - аккуратный контейнер. Я узнал об этом только недавно.

Вместо использования массива для хранения нескольких атрибутов

$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']} лет") работает.

Kornel 17.11.2008 02:56

Вы должны опубликовать это как скрытую функцию, я бы проголосовал за это :)

Dean Rather 17.11.2008 07:49

"person [name] is $ person [age] years" тоже подойдет ... Без кавычек и скобок :)

majelbstoat 24.11.2008 04:44

Я этого не знал. Он не жалуется, что должен предполагать, что вы не используете неопределенные константы?

Dean Rather 24.11.2008 15:59

Делает это очень Javascript-у :)

thomasrutter 20.03.2009 12:56

@Dean, если вы не используете фигурные скобки, нет, он не жалуется. [Должен следовать сразу за именем переменной, тогда его содержимое интерпретируется как строка.

thomasrutter 20.03.2009 12:58

$ string = sprintf ("% s% d лет.", $ person ['name'], $ person ['age']);

Daniel Sloof 10.05.2009 06:00

Пока мы говорим о теме: (объект) array ("name" => 'bob', 'age' => 5)

Annika Backstrom 07.06.2009 01:46

@majelbstoat: удаление кавычек замедлит работу скрипта, потому что интерпретатор PHP будет проверять, установлены ли 'name' и 'age' с помощью define (...). Это также плохая практика, учитывая, что можно было бы полностью перевернуть ключи, к которым осуществляется доступ в каждом случае: define ('age', 'name'); define ('имя', 'возраст');

brianreavis 03.09.2009 07:59

Не заботьтесь о производительности, читаемость (кстати!) Важнее.

whiskeysierra 21.12.2009 16:31

Оба с использованием массивов стандартного класса И полезны для разных вещей.

Talvi Watia 29.01.2010 13:17

@Willi Schönborn: конечно, аспект производительности может не иметь большого значения, но, учитывая тот факт, что E_NOTICE выдается каждый раз, когда PHP сталкивается с одним из них, это просто небрежно.

Frank Farmer 24.02.2010 00:15

@Adam Backstrom, это объектный литерал в PHP! Ты просто взорвал мне голову.

thomasrutter 10.04.2010 06:59

@brianreavis и @Frank Farmer, дело не в этом. Без фигурных скобок внутри строки PHP рассматривает то, что в фигурных скобках, как литерал. например: «$ person [name]» эквивалентно «{$ person ['name']}» - PHP не будет рассматривать имя как ссылку на константу в любом случае. См. Типы -> Строки в разделе «Анализ переменных» в руководстве по PHP.

thomasrutter 10.04.2010 07:04

не используйте $ person [name] ... если вы установите error_reporting на E_ALL, вы увидите, что компилятор выдает уведомление. Всегда заключайте в кавычки ключи массива строк: $ person ['name']

Harold1983- 18.11.2010 22:47

Я не могу понять, почему комментарий @brianreavis получил 23 голоса за, хотя он принципиально неправильно понял интерполяцию переменных в строках ...

Matti Virkkunen 07.12.2010 03:25

Одна приятная особенность PHP - это CLI. В документации это не так «продвигается», но если вам нужны обычные скрипты / консольные приложения, использование cron + php cli действительно быстро!

Я действительно должен изучить это, у меня есть несколько заданий cron, которые извлекают PHP-скрипт через wget http://example.com....

DisgruntledGoat 28.06.2010 23:54

Интерфейс командной строки также является отличным способом выборочной отладки, поскольку предупреждения и ошибки отображаются без необходимости изменения настроек отчетов об ошибках.

Ben Carlsson 27.09.2011 22:13

Вы можете воспользоваться тем фактом, что оператор or имеет более низкий приоритет, чем =, для этого:

$page = (int) @$_GET['page'] 
  or $page = 1;

Если значение первого присвоения оценивается как true, второе присвоение игнорируется. Другой пример:

$record = get_record($id) 
  or throw new Exception("...");

Думаю, я не совсем уверен в этом; хотя кажется, что он не подвержен ошибкам, он противоречит интуиции и сам по себе может способствовать ошибкам.

thomasrutter 20.03.2009 13:01

Опять же, кто я такой, чтобы говорить? Я довольно часто использую тернарный оператор, и все же некоторые люди считают это мерзостью!

thomasrutter 20.03.2009 13:03

@thomasrutter: Как бы вы написали первый пример без использования «или»?

Michał Tatarynowicz 22.03.2009 03:08

@Pies: один из способов - это следующий, довольно запутанный код, если честно: $ page = isset ($ _ GET ['page'])? (int) $ _ GET ['страница']: 1; // Преимущество этого в том, что не требуется подавление ошибок.

DisgruntledGoat 10.05.2009 02:00

обдумывая, поскольку вы ищете целое число, которое вы могли бы использовать вместо этого: $ page = is_int ($ _ GET ['page'])? $ _GET ['страница']: 1;

DisgruntledGoat 10.05.2009 02:13

Я делаю это по-своему, потому что он короче и может быть легче читается. Очевидно, вы можете сделать то же самое в коде более. В основном я хотел избежать двойного написания $ _GET ['page'].

Michał Tatarynowicz 16.05.2009 05:23

Стоит отметить, что код после or будет выполняться, если код до or приведет к числовому значению 0. Таким образом, семантически это может быть менее вероятно с чем-то вроде $_GET['page'], но, очевидно, могут возникнуть обстоятельства, и их следует остерегаться.

eyelidlessness 10.12.2009 08:25

Также стоит отметить, что оператор or является более ранней версией оператора ||. Кроме того, +1, потому что это очень выразительно, и я часто забываю, что это возможно. Его нужно использовать чаще, и совершенно понятно, что он делает. Я не знаю, как кодируют «настоящие мужчины», поэтому не могу это комментировать.

eyelidlessness 10.12.2009 08:27

Лично я не решаюсь использовать or, потому что не верю, что все, с кем я работаю, всегда будут осознавать разницу между or и ||.

Frank Farmer 24.02.2010 00:19

Он должен был называться then

JeroenEijkhof 22.05.2010 03:29

@DisgruntledGoat, $_GET['page'] никогда не может быть int, если вы не измените $_GET в своем PHP-коде.

Ionuț G. Stan 27.08.2010 14:33

@ Ionuț: Да, наверное, я имел в виду is_numeric, поскольку он проверяет, является ли это числовой строкой.

DisgruntledGoat 27.08.2010 14:54

использование 'or throw' не работает, вы получите ошибку T_THROW без исключения.

Harold1983- 18.11.2010 22:49

$page = getPage($_POST["page"]) or GTFO();

L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ 16.11.2011 08:57

Я чувствую, что что-то добавляется в мой мозговой багаж каждый раз, когда используется подавитель ... + Лучше 404 для URL ...&page=<something_not_valid>, чем молча проглатывать его.

Halil Özgür 07.12.2011 12:43

@ HalilÖzgür Я думаю, что чтение из $ _GET - одно из законных применений подавления ошибок, но каждому свое. Вы могли бы просто создать для него функцию.

Michał Tatarynowicz 27.12.2011 16:27

Кажется, здесь все забыли эту жемчужину: mysql_connect(*) or die().

Tim 01.02.2012 22:00

Быстро и грязно - значение по умолчанию. Язык наполнен полезными ярлыками, что делает 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 12.04.2009 18:06

@OIS целью его примера было проиллюстрировать и сравнить выполнение быстрого совпадения с регулярным выражением, а не как найти строку «кошка» в «одной кошке».

dcousineau 24.06.2009 01:24

Хороший звонок @eyelidlessness. Я использовал ereg () несколько лет, пошел по пути preg, начиная с php 5.3. Мне не нравятся устаревшие сообщения ;-)

Bob Fanger 10.12.2009 14:30

Java: if (Pattern.matches ("кошка", "один кот")) {// что-то делать} Прекратите жаловаться на java, если вы этого не знаете.

whiskeysierra 21.12.2009 16:52

+1 Вилли, как вы делаете preg_replace ('/ ([<[]! - \ s *) (\ S *?) (\ S * - [>]]?) / Se', "\ $ this- > Выберите ('\\ 1', '\\ 2', '\\ 3', \ $ data) ", $ text); в Яве? Это находит комментарий во входном тексте, а затем вызывает функцию с совпадающими элементами, которая в этом случае $ this-> choose (...) решает, чем заменить совпадение, и возвращает результаты.

DeveloperChris 09.01.2010 09:49

Regex - это PHP довольно дрянный ... Я бы предпочел Regex в стиле Perl или JavaScript, где // встроен в язык.

cdmckay 20.04.2010 00:26

strtr ()

Это очень быстро, настолько, что вы удивитесь. Внутри он, вероятно, использует какую-то сумасшедшую структуру типа b-tree, чтобы упорядочить ваши совпадения по их общим префиксам. Я использую его с более чем 200 строками поиска и замены, и он все равно проходит 1 МБ менее чем за 100 мс. Для всех строк, кроме тривиально маленьких, strtr () даже значительно быстрее, чем strtolower (), при выполнении того же самого, даже с учетом набора символов. Вероятно, вы могли бы написать целый синтаксический анализатор, используя последовательные вызовы strtr, и это было бы быстрее, чем обычное сопоставление регулярного выражения, выяснение типа токена, вывод того или иного, следующего типа регулярного выражения.

Я писал нормализатор текста для разделения текста на слова, строчные буквы, удаления знаков препинания и т.д., а strtr был моим швейцарским армейским ножом, он превосходил регулярные выражения или даже str_replace ().

Вероятно, это быстрее, потому что он выполняет замену одного символа.

staticsan 22.06.2009 04:30

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

thomasrutter 22.06.2009 08:52

Вы упомянули, что в некоторых случаях это было быстрее, чем strtolower, можете ли вы это доказать? Я провел небольшой тест и обнаружил, что это неверно.

The Pixel Developer 07.03.2010 00:14

Я обнаружил, что на небольших строках, скажем, 80 символов, он был медленнее, чем strtolower, а на больших строках, скажем, 1 МБ, он был быстрее. Вероятно, каждый раз, когда он вызывается, возникают некоторые накладные расходы типа фиксированной стоимости. Я просто использовал strtr ($ this-> string, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); Строка, над которой я работал, представляла собой типичный английский текст («Быстрая коричневая лиса» и тому подобное).

thomasrutter 09.03.2010 09:03

Я только что прочитал этот пост, а затем поискал в Google и нашел: simplemachines.org/community/index.php?topic=175031.0 Есть идеи, какой из них правильный?

Flipper 07.09.2011 10:10

Когда я проводил тестирование, я обнаружил, что strtr работает / намного / быстрее для более сложных наборов замены на длинных строках, скажем, длиной 100 КБ или более. Я обнаружил, что для коротких строк размером, скажем, 80 байт или меньше, str_replace работает намного быстрее. Однако я провел свое тестирование около двух лет назад, и я не уверен, правда ли это до сих пор. Я был бы удивлен, если бы производительность strtr снизилась для длинных струн. Я считаю, что его производительность связана с индексированием префикса перед каждым вызовом, что замедляет его на коротких строках.

thomasrutter 07.09.2011 14:42

Функции даты. Мне приходится обрабатывать много информации о времени и строках даты в течение всего дня, поэтому такие функции, как strftime () и strtotime (), просто потрясающие.

Убедитесь, что вы проверили DateTime. php.net/datetime

Annika Backstrom 24.03.2009 17:42

На самом деле strtotime - отстой, потому что магия нигде не документирована, и вы не можете использовать собственный формат для синтаксического анализа. -1

whiskeysierra 21.12.2009 16:37

Согласен с приведенными выше комментариями; strtotime () ужасен, но DateTime 5.3 намного лучше (поскольку вы можете точно указать формат ввода).

El Yobo 07.04.2010 15:27

Полностью не согласен. Делать свидания на PHP было ужасно до появления DateTime.

cdmckay 20.04.2010 00:23

Наверное, не многие знают, что можно указать постоянные «переменные» в качестве значений по умолчанию для параметров функции:

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 тем не менее

George Mauer 20.03.2009 18:32

Вероятно, это более эффективно, чем вызов функции для этого. Обычно строки хранятся в памяти непрерывно, поэтому добраться до $ str [4] несложно. Хранение строк в виде массивов символов характерно для большинства языков, унаследованных от C.

sjobe 23.06.2009 01:02

Вам не обязательно использовать определенную константу в качестве значения по умолчанию. Следующее также совершенно верно: function foot ($ param1, $ default = array ('key' => 'value'), $ default_s = 'String', $ default_i = 10, $ default_b = false). Однако вы правильно заметили, что нельзя использовать переменную в качестве аргумента по умолчанию.

dcousineau 24.06.2009 01:31

@dcousineau Ваш пример совершенно верен, поскольку array () - это не функция, а языковая конструкция. Вызов функций не допускается в качестве значений по умолчанию для аргументов.

Jamol 20.07.2009 13:48

вы также можете получить доступ к строковому символу следующим образом: $ a_char = $ a_string {2}

Felipe 27.02.2011 07:43

Будьте осторожны с обработкой строк как массивов, если у вас есть многобайтовые строки (иностранные языки и т. д.).

philfreo 12.04.2011 09:48

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

Я пытаюсь выучить Python сейчас (чтобы вырасти ... ну ... программистом, не так ли?), И самая полезная вещь в Python - это отступы. Мне нравятся отступы PHP, знак $ для обозначения переменных, фигурные скобки для циклов и циклов, ну, эти умные вещи делают мой код очень простым для понимания (даже если тот, кто написал код, был маленьким ... беспорядочным .. 'спагетти-код', а?)

Массивы в PHP довольно просты и мощны.

Базы данных: MySQL, Postrgee, sql; вы можете использовать почти все типы баз данных .. легко.

Быстро: логически зависит от того, как написан код, но обычно PHP довольно быстро для малых / средних приложений (поскольку он теряет колесо в более крупном приложении).

Вы можете легко добавить элемент в массив.

$my_array = array();
$my_array[] = 'first element';
$my_array[] = 'second element';

Элементом может быть что угодно: объект, массив, скаляр ...

Он спросил: «... какие особенности PHP вам нравятся больше всего?»

Luc M 10.05.2009 06:31

Первая строка не нужна.

Ilya Birman 20.05.2009 10:25

Наоборот; отсутствие этой строки является источником многих проблем и ошибок.

Anax 02.10.2009 01:13

«Первая строка в ненужном» <- совершенно неверно! если вы не инициализируете массив, вы можете получить довольно много проблем на разных серверах. Вы должны ВСЕГДА инициализировать все перед использованием.

Newbie 21.02.2010 00:11

Не говоря уже о том, что простое объявление массива как такового делает код более читаемым.

Egon_Freeman 23.09.2010 17:31

Вы можете использовать минус в именах переменных так:

class style
{
  ....
  function set_bg_colour($c)
  {
    $this->{'background-color'} = $c;
  }
}

Зачем это нужно? Понятия не имею: может быть, для модели CSS? Или какой-нибудь странный JSON, который нужно вывести. Странная особенность :)

Это работает с именами методов? Может быть полезно для фреймворков, которые используют маршрутизатор, и мне нужен domain.com/something-with-minuses/view/

alex 09.07.2009 16:40

Фигурные скобки позволяют получить доступ к свойствам объектов, которые содержат тире, точки и другие не буквенно-цифровые объекты. Одна из причин его использования - при работе с xml, где имена сущностей могут быть разделены точками, как в NITF / NewsML <body.content>. Если вы используете SimpleXML, вы получите доступ к нему как $item->DataContent->body->{'body.content'}.

Jesse Kochis 20.09.2009 23:22

При таком использовании переменные PHP могут принимать любые символы, даже пробелы и символы новой строки.

Newbie 20.02.2010 23:58

Это было бы очень полезно при использовании в SimpleXML ... здорово. Спасибо, что поделился.

KyleFarris 02.09.2011 18:16

Я неравнодушен к другим пользователям 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 и затем написать много шаблонного кода.

Kimble 26.12.2009 21:34

«Таким образом вы даже можете удаленно включать () или требовать () файлы кода». Конечно, include () файл на сервере, который вы не контролируете, - ужасная, ужасная идея.

Frank Farmer 24.02.2010 00:22

@Frank - да, можно предположить, что вы будете включать код с сервера, которым вы управляете сделал.

zombat 25.02.2010 02:23

Дело в том, что включение удаленного файла является распространенной проблемой безопасности PHP: en.wikipedia.org/wiki/Remote_File_Inclusion#PHP.

Frank Farmer 25.02.2010 06:50

Комментарии быстрого блока

/*
    die('You shall not pass!');
//*/


//*
    die('You shall not pass!');
//*/

Эти комментарии позволяют переключаться, если блок кода комментируется одним символом.

На самом деле это не относится к PHP. Это работает на любом языке, который поддерживает строковые комментарии // ... и блочные комментарии /* ... */.

Jordan Ryan Moore 07.12.2009 18:44

любые утилиты для очистки кода в конечном итоге возненавидят вас за это ...;)

Talvi Watia 29.01.2010 13:41

Я также использовал /** / до и /**/ после. Вы можете переключать блок, удаляя и добавляя пробел в первом. Это дает дополнительное преимущество работы с CSS (и другими языками, которые не поддерживают комментарии // ... ).

kingjeffrey 10.06.2010 02:35

FWIW, ссылка на оригинальную статью aleembawany.com/2009/01/27/lazy-block-comment-trick

aleemb 14.09.2010 15:42

@aleemb, воздержитесь от дальнейших правок в этом вопросе.

Sam152 15.09.2010 14:30

Давайте посмотрим...

  1. Тернарные операторы. Они творит чудеса, обрабатывая флажки в результатах формы.

    $ var = ($ _POST ['my_checkbox'] == 'проверено')? ИСТИНА: ЛОЖЬ;

  2. Стоит изучить все замечательные функции обработки строк и массивов. strtotime (), strlen () и strpos () - некоторые из моих любимых.

  3. Класс SimpleXML и функция json_decode (). Вызовите REST API или RSS-канал с помощью file_get_contents (), без труда проанализируйте его с помощью одного из этих инструментов, и все готово.

Я знаю, что это был просто пример, но ваш код мог быть таким: $ var = ($ _POST ['my_checkbox'] == 'checked');

Matt Kantor 22.06.2009 04:51

Подавление ошибок с помощью оператор контроля ошибок, @ почти никогда не должно использоваться. Он продвигает ленивые и небезопасные методы кодирования, просто игнорируя ошибки, создает кошмары отладки, поскольку ошибки всех типов - даже фатальные - будут подавлены, а в некоторых случаях могут привести к снижению производительности (особенно при подавлении больших количество ошибок).

Я рад, что ты сказал «почти никогда». Функция fopen () печально известна тем, что выдает предупреждение и, возвращающее проверяемое значение ошибки, когда она не может открыть файл. К сожалению, единственное решение - использовать @fopen ().

staticsan 22.06.2009 04:23

Я стараюсь избегать чрезмерно рьяных заявлений по поводу всего, что связано с программированием. Я считаю, что он всегда возвращается, чтобы преследовать нас. Но да, parse_url тоже хлопотно;)

Justin Johnson 22.06.2009 08:53

Да, это так. "Скрытая" часть в том, что вы обычно не должны его использовать;)

Justin Johnson 10.07.2009 20:24

Множество заметок в журнале для неопределенных индексов могут раздражать. Я обычно @ any isset ($ something ['something']), чтобы избежать такого количества уведомлений.

Alex S 30.07.2009 08:22

Хорошее защитное программирование - это не просто игнорирование проблемы. Кроме того, вы не должны получать никаких уведомлений при использовании isset или empty.

Justin Johnson 30.07.2009 13:27

Тень: если вы получаете много-много уведомлений, это признак плохой практики кодирования. Подавление ошибки - это решительный шаг в сторону песка. Он может вернуться и укусить вас. если значение должно быть там, а его нет, то это ошибка. если значение может быть неопределенным, вам следует проверить его. В противном случае могут возникнуть проблемы с безопасностью.

DeveloperChris 09.01.2010 09:09

в некоторых особых случаях вы действительно ДОЛЖНЫ использовать этот оператор, чтобы сделать код совместимым с другими системами / версиями.

Newbie 21.02.2010 00:06

Вот почему я сказал «почти никогда», а не «никогда».

Justin Johnson 21.02.2010 04:56

@staticsan: Это неправда. Используйте file_exists перед попыткой выполнения файловых операций.

Lotus Notes 02.06.2010 03:49

Проблема в том, что file_exists(), за которым следует fopen(), не является атомарным. Иногда это не проблема; иногда бывает.

staticsan 02.06.2010 07:58

@staticsan: Да, но это не только fopen (). Большинство функций, которые работают с внешними источниками данных, особенно. в сети есть этот недостаток. Подключение за пределами прив. окружающая среда всегда рискованна, и примерно в 99% случаев есть способ проверить на отказ тем или иным способом. А еще есть функции, которые НИКОГДА не выдают ошибку, И НЕ возвращают проверяемый результат сбоя, но я не могу назвать ни одного из них (хотя я помню, что видел по крайней мере одну), так что это не все плохо. Тем не менее, всегда лучше иметь больше предупреждений, чем меньше, и использовать @ как GOTO - с уважением, которого он заслуживает.

Egon_Freeman 23.09.2010 17:09

@Lotus Примечания: я бы хотел увидеть, как вы выполняете file_exists () на удаленном HTTP-сервере. : D Знаю, встречается не часто, но есть. Подключение и проверка - это, как правило, огромная боль, но зачастую лучший план. Если, конечно, не допускается безопасный отказ, и, таким образом, @ оправдан.

Egon_Freeman 23.09.2010 17:12

Да, есть несколько виновников. Я упомянул только fopen(), потому что именно с ним я сталкиваюсь чаще всего. Я использую тот же подход с поясом и подтяжками для mysql_connect().

staticsan 24.09.2010 04:57

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 18.12.2009 21:12

@GetFree Не думаю, что кто-то станет отрицать, что почти весь PHP скопирован с C, C++, Perl и т. д.

Frank Farmer 27.06.2010 01:34

Копирование - лучшее, что можно сделать.

NikiC 30.08.2010 20:41

Плохой PHP. Он всегда копирует черты других. Вместо этого он должен писать все с нуля! (В случае малейшей возможности восприятия этого всерьез: шучу)

Halil Özgür 07.12.2011 13:06

Мой список ... большинство из них больше относится к "скрытым функциям", чем к "избранным функциям" (я надеюсь!), И не все они полезны, но ... да.

// 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."

Вы не можете напрямую вызывать функции внутри {}, но вы может используете переменные-содержащие-имя-функции и вызываете их! (* и * вы также можете использовать в нем переменные переменные)

Пожалуйста, не злоупотребляйте тернарным оператором сравнения; это приводит к запутыванию кода.

staticsan 22.06.2009 04:24

Вау. Это может полностью накрыть ваш список $ GLOBALS. Плохая практика. Серьезно.

Talvi Watia 29.01.2010 14:22

Есть ли еще конкурс запутанных PHP?

Lotus Notes 02.06.2010 03:54

Что ж, прикол со свопом - впечатляюще и полезно, спасибо.

OZ_ 29.04.2011 00:45

${''} = 456; хахаха .... довольно ругательство.

Skurmedel 28.06.2011 18:42

+1 для ${''} = 456;. Наконец-то полностью анонимная переменная.

Halil Özgür 07.12.2011 13:11

«Оскорбления» правильно употреблены в вашем посте во всех смыслах.

Tim 01.02.2012 22:26

Единственная самая полезная вещь в PHP-коде заключается в том, что если я не совсем понимаю функцию, которую вижу, я могу найти ее, используя браузер и набрав:

http://php.net/function

В прошлом месяце я видел функцию "диапазон" в каком-то коде. Это одна из сотен функций, которые мне никогда не удавалось использовать, но которые оказались действительно полезными:

http://php.net/range

Этот URL-адрес является псевдонимом для http://us2.php.net/manual/en/function.range.php. Эта простая идея, сопоставление функций и ключевых слов с URL-адресами, потрясающая.

Я бы хотел, чтобы у других языков, фреймворков, баз данных и операционных систем был такой же простой механизм поиска документации.

range() может быть полезен для foreach( range(1, 10) as $i) { };

alex 09.07.2009 16:41

Если у вас FireFox; просто введите PHP function в адресной строке, он выполнит поиск в Google «Мне повезет», и вы почти всегда окажетесь на нужной странице документации php.

Kolky 18.03.2010 14:03

Я немного удивлен, что никто еще не упомянул об этом, но один из моих любимых приемов с массивами - это использование оператора плюс. Он немного похож на 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

diEcho 23.04.2010 12:33

Я думаю, что это не так ясно, как array_merge, когда вам нужно поддерживать много кода. По крайней мере, когда вы используете функцию array_merge, очевидно, что вы имеете дело с массивами.

Sylvain 06.05.2010 22:19

И того факта, что вы делаете ... + array( ..., недостаточно, чтобы указать на это? :-)

staticsan 07.05.2010 10:24

Какая версия PHP вам нужна для этого?

Lotus Notes 02.06.2010 03:50

Это отличная функция, и следует отметить, что массив с «правой» стороны от «+» не будет перезаписывать существующие ключи массива с «левой» стороны от «+».

Wil Moore III 02.09.2010 01:36

На самом деле @wilmmore, так и будет. Это та самая функция, которая делает его таким полезным.

staticsan 02.09.2010 04:53

Я думаю, что элементы, найденные в левом массиве, - это те, которые остались, то есть не перезаписываются теми, которые находятся справа. Так что я думаю, что size все равно будет 30.

BDuelz 03.08.2011 21:22

Если вы используете это, как будто это array_merge, вы делаете это неправильно: «Оператор + возвращает правый массив, добавленный к левому массиву; для ключей, которые существуют в обоих массивах, элементы из левого будет использоваться массив, а соответствующие элементы из правого массива будут проигнорированы. " php.net/manual/en/language.operators.array.php против php.net/manual/en/function.array-merge.php

Halil Özgür 07.12.2011 13:16

Это здорово:

//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, потому что ленивая загрузка должна выполняться контейнером / средой.

whiskeysierra 21.12.2009 16:55

Я ненавижу такой код. Изменяться или расширяться - кошмар, поскольку совершенно невозможно выяснить зависимости. (По крайней мере, для крупных проектов).

Kimble 26.12.2009 21:40

Логическое приведение, которое особенно полезно для первого примера redwall_hp, приведенного выше.

Вместо:

$var = ($_POST['my_checkbox']=='checked') ? TRUE : FALSE;

Вы можете ввести:

$var = !!($_POST['my_checkbox']=='checked');

Почему не работает $var = ($_POST['my_checkbox'] == 'checked')?

DisgruntledGoat 17.07.2009 23:00

Я думаю, что отправитель хотел сказать что-то вроде: $ var = !! ($ othervar - 1); - проверка того, что $ othervar равно 1, и установка bool. Есть и другие законные применения, когда вы хотите принудительно сохранить логическое значение и где это самый простой способ получить его.

Ivan Vučica 30.06.2010 08:25

вы понимаете, что используя !! это то же самое, что не использовать! оператор у всех, да? Это как сказать «неправда» вместо того, чтобы просто сказать «правда».

Harold1983- 18.11.2010 23:23

Классифицировать() сам по себе не скрыт, но я все еще вижу много людей, которые повторяют:

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) {}, что еще проще.

SilentGhost 22.06.2009 15:59

Это может быть микрооптимизация, но стоит отметить, что for и while намного быстрее и потребляют меньше памяти, чем foreach.

JAL 19.12.2009 09:42

это НЕ то, как нужно использовать range ()!

Newbie 21.02.2010 00:08

Вам следует попробовать Python. Это так же просто, как «for i in range (12)», или вы можете использовать более эффективный xrange.

Ponkadoodle 24.02.2010 03:15

Я был, вот откуда мне пришла идея. Я начал использовать Python для решения вопросов Project Euler, и это было хорошо.

Darren Newton 25.02.2010 04:53

@SilentGhost: вам все равно понадобится массив для начала, что не всегда так. @ Новичок: поясните, пожалуйста?

Alec 27.02.2010 16:19

К вашему сведению, foreach может быть таким же быстрым, если не быстрее, чем при определенных обстоятельствах в PHP 5.3.

Wil Moore III 02.09.2010 01:30

@SilentGhost это то, что я использую. Всякий раз, когда я перехожу на java, мне всегда приходится искать, как там использовать foreach. Это похоже на foreach в 10 раз лучше, чем на цикл for. Ибо петли - это так 1970-е.

Matt 12.04.2011 07:47

@flexxy, по-видимому, это НЕ. Рассмотрим это: phpbench.com прокрутите вниз до Read Loop.

Buddy 28.07.2011 17:41

@Buddy А затем ознакомьтесь с примером изменения, в котором говорится: «Доказательство в этом примере показывает, насколько функционально убийственным может быть цикл foreach ()».

JAL 30.07.2011 00:27

Насколько я знаю, вы можете указать неявный тип параметра в вызове функции:

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)

cdmckay 20.04.2010 05:56

Определенно методы магии и перегрузки. Аллен процитировал __get (), __set (), __call () и __toString (), но мне также нравятся __wakeup () и __sleep ().

Эти магические методы вызываются, когда объект сериализуется (спит) и десериализуется (пробуждение). Эта функция позволяет создавать такие вещи, как сериализуемые оболочки базы данных, которые я использую в приложении:

Class Connection {
   private $dsn;
   private $connection;
   ...
   public __wakeup() {
      $this->connection = ADONewConnection();
   }
}

Таким образом я могу «сохранять» соединения в $ _SESSION и т. д.

Функции json_encode / decode в php довольно полезны, хотя и не очень скрыты.

Помимо мгновенного доступа, чтобы начать кодировать все, что вам нужно для веб-сайта?

Помимо магических методов и отражений, есть несколько интересных функций:

  1. serialize / unserialize - состояние сохранения добродетели через sql, куки, процессы, плоский файл. хорошая вещь.
  2. json_encode / json_decode - мгновенное развлечение AJAX
  3. get_class - полезно в моменты утомления, связанного с небрежным набором текста
  4. call_user_func_array - мощный инструмент, когда вы можете работать со своим кодом как со строками (думайте динамически)
  5. method_exists - отражение
  6. func_num_args / func_get_arg - неизвестные аргументы ftw
  7. set_error_handler / set_exception_handler - очень хорошие возможности отладки для языка сценариев

Побочным эффектом этого является сильно загрязненное глобальное пространство имен.

cdmckay 20.04.2010 00:27

Синтаксис ИРЕДОК - моя любимая скрытая функция. Всегда трудно найти, так как вы не можете использовать Google для <<<, но это избавляет вас от необходимости избегать больших фрагментов HTML и по-прежнему позволяет добавлять переменные в поток.

echo <<<EOM
  <div id = "someblock">
    <img src = "{$file}" />
  </div>
EOM;

HEREDOC - мой любимый способ создания и использования операторов SQL.

bdl 09.01.2010 05:25

Примечание: закрывающая МНВ; не может иметь отступ.

micahwittman 09.01.2010 09:29

Хорошо, но бессмысленно, если вы используете шаблоны. К тому же это мешает правильному отступу.

Manos Dilaverakis 23.04.2010 13:06

Боже мой, это самый уродливый фрагмент кода, который я когда-либо видел. Если вы используете HEREDOC, значит, вы не отделили представление от логики.

Lotus Notes 02.06.2010 03:45

@Byron: вам не обязательно использовать его для презентации, его можно использовать для любой строки. См. Комментарий от bdl.

Tom Pažourek 03.07.2010 22:47

@bdl: Я использовал heredocs для операторов SQL, но, на мой взгляд, хранимые процедуры более удобны в обслуживании.

Joey Adams 31.10.2010 05:21

Было бы намного лучше отделить HTML, Javascript от PHP с помощью шаблона MVC. )

daGrevis 09.03.2011 20:35

Мне также нравится разница между 'и ".

$foo = 'Bob';
echo 'My name is {$foo}'; // Doesn't swap the variable
echo "My name is {$foo}"; // Swaps the variable

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

Примечание. Я использую {}, так как это делает мои переменные более заметными.

Также используйте {} для массивов: echo "Вот {$ array ['bob'] ['name']}!"

Alex L 17.07.2009 22:20

Интерполяция +1 строки - это то, чего не хватает многим другим языкам. При переходе с perl на php я вздохнул с облегчением, когда это сработало. Единственное, чего ему не хватает, это то, что вы не можете интерполировать константы. define ('FOO', 'bar'); эхо "фу {ФУ}"; не работает :(

DeveloperChris 09.01.2010 09:57

Объединение строк в PHP так же быстро, как и интерполяция переменных, и его легче читать и поддерживать.

staticsan 24.02.2010 02:55

@staticsan: Я полностью не согласен, я считаю, что встраивание переменных в строку легче читать и намного проще в обслуживании.

Josh 24.03.2010 16:36

Отлично подходит для написания HTML без каких-либо экранирований.

Lotus Notes 02.06.2010 03:55

В стандартной библиотеке 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)

  1. много библиотеки. зайдите на phpclasses.org, и я почти все получил оттуда.
  2. многие сети используют его. Любите это или ненавидите .. это факт! :)
  3. простой, компактный и легкий в обслуживании. вы просто устанавливаете xampplite + vim (мой любимый) на свои портативные устройства.
  4. дешевый !!! дешево как пиво ... например: хостинг. по сравнению с хостом java или .net, хост php очень дешевый, и вы можете получить его бесплатно с некоторых веб-сайтов (хотя они будут размещать некоторые баннеры / скрытые элементы внутри вашего сайта)
  5. документация по php была очень хорошей !! это основная причина, по которой я придерживаюсь php около 6 лет (хотя я делал некоторые проекты с использованием Groovy / Grails)

Буферизация вывода через 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 09.01.2010 09:16

Чтобы расширить сообщение DeveloperChris, мне кажется странным, что большинство людей не осознают, что это ВЕЛИКИЙ способ конвертировать символы на лету, не беспокоясь о том, откуда они пришли. Я печатаю в основном польские страницы, и они должны быть в формате ISO-8859-2. Однако большинство простых редакторов работают только с Windows-1250. Я видел исходные файлы, скажем, с таблицами перевода, закодированными непосредственно в 8859-2, но поддерживать это БОЛЬНО. Добавьте к этому хороший буфер преобразования и вуаля! - огромная боль ушла, и код внезапно стал более читаемым.

Egon_Freeman 23.09.2010 17:16

Что ж, недавно я доставил свое первое приложение с графическим интерфейсом платежеспособному покупателю, написанное на PHP! Он собирает данные со сканера штрих-кода или кнопок графического интерфейса, флажков, переключателей или текстовых полей, сохраняет в SQLite или удаленном MySQL, запускает другие приложения Windows, отправляет заархивированные XML-отчеты в виде вложений электронной почты, шифрует и дешифрует сохраненные данные и даже воспроизводит звук. когда закончите.

Сделал это с miniPHP и Винбиндер. Это достаточно спрятано? Думаю, не многие разработчики PHP действительно пробовали это.

Я предполагаю, что не многие разработчики PHP пробовали это, потому что PHP-соединения с API ОС практически не связаны.

eyelidlessness 10.12.2009 10:19

-1, есть причина не пробовать

whiskeysierra 21.12.2009 16:54

+1 за это. Я также использую Winbinder, PHP-GTK и множество других вещей. Что касается подключений к ОС, вот почему существуют некоторые изящные библиотеки, такие как php-opengl или php-openal. Я знаю, что большую часть этого ДОЛЖНО быть написано на C++, но, тем не менее, это интересная задача. И, что наиболее важно, он работает НАВСЕГДА, и большая часть беспорядка встречается в «правильных приложениях для Windows» - мне не нужны тяжелые функциональные возможности и все виды хитрости, которые развивались за многие годы и теперь являются «стандартными» - это просто загромождает мой код до точка, в которой я ее больше не узнаю. 3К или 300-байтовый источник при создании, кто-нибудь?

Egon_Freeman 23.09.2010 17:28

Альтернативный синтаксис для управляющих структур

Многие люди не знают этого синтаксиса. Когда я использую чистый PHP для создания шаблонов, этот синтаксис предлагает приятный и чистый способ смешивать простые управляющие структуры, такие как if или foreach, с кодом вашего HTML-шаблона, обычно в сочетании с коротким стилем печати переменной <?= $myVar ?>.

Не совсем портативный, многие люди отходят от него.

Peter Lindqvist 07.12.2009 15:27

Я действительно отключил это. он может сломать страницы, которые начинаются с <? xml ... это означает, что вам нужно записать строку, когда это не нужно

DeveloperChris 09.01.2010 09:53

не будет ли удален этот «короткий синтаксис» в php6?

Strae 24.02.2010 12:36

@DaNieL Нет. Они решили оставить его себе.

Anax 26.06.2010 02:23

@Commenters, есть разница между альтернативным синтаксисом для структур управления (который охватывает этот пост, например, if (2 + 2 === 4): echo 'hi'; endif;) и короткими тегами (например, <?= 'hi' ?>).

strager 14.09.2010 17:10

Вы можете использовать функции с неопределенным количеством аргументов, используя 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.

alex 09.07.2009 16:49

Использование элементов массива или свойств объекта внутри строк.

Вместо того, чтобы писать

$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 24.02.2010 02:54

Я считаю рискованным писать переменные без фигурных скобок.

RaYell 24.02.2010 12:45

@staticsan Не могли бы вы объяснить, почему это опаснее и сложнее поддерживать? Я считаю, что интерполяция очень удобна по сравнению со стилем "foo:" . $bar. Хорошая IDE также выделяет интерполированные переменные, поэтому их не сложно поддерживать.

cdmckay 20.04.2010 00:29

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. Может ли кто-нибудь сказать, почему они не используются чаще?

cam8001 26.06.2010 15:09

Я начал переходить на python, и одна вещь, которая мне нравилась в python, - это живой интерпретатор. Только позже, когда я работал над проектом php, я понял, что в php есть эта опция, просто она не так широко известна. В командной строке введите php -a и вставьте любой PHP-код, который хотите протестировать, но не забудьте запустить его с <?php.

Вам не нужно вводить «<? Php», однако вам нужно будет ввести «echo» или «var_dump» и не забыть «;».

laurentb 03.02.2010 00:39

Функция filter_var. Не скрытая жемчужина, но довольно новая.

Включаемые файлы могут иметь возвращаемое значение можно присвоить переменной.

// 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.

Talvi Watia 29.01.2010 14:30

Это удобно для создания быстрого и грязного файла конфигурации.

Frank Farmer 24.02.2010 00:27

Почему вы возвращаете этот массив? Если включаемый файл содержит массив, его можно сразу использовать при включении.

fabrik 11.08.2010 11:47

@fabrik, потому что это будет глобальная переменная, доступная во всей основной области видимости. Это довольно неприятно, так лучше.

Mikulas Dite 28.08.2010 13:14

Я работал над проектом в структуре Yii, и у этого проекта есть файл конфигурации, в котором массив был возвращен таким образом, теперь я понимаю, почему файл был таким.

Simer Twilio Toronto developer 23.12.2010 15:01

Я предлагаю использовать 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.

whiskeysierra 21.12.2009 16:56

В 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 и позволить системе найти его за вас.

Gipetto 09.01.2010 08:36

Просто отстой, что вы не можете выполнять автозагрузку классов в CLI, иначе это отличная функция.

Javier Parra 22.06.2010 19:09

Совет: используйте #! / usr / bin / env php, и он будет меньше зависеть от того, где находится двоичный файл php на диске.

Harold1983- 18.11.2010 23:11

Вы также можете использовать php script.php. Не такой короткий, но более гарантированный для работы на разных машинах.

Ben Carlsson 27.09.2011 22:23

Лот уже сказал об этом.

Просто добавлю, что одна вещь, которая выглядела довольно забытой, если не скрытой, - это часть http://talks.php.net из http://www.php.net. В нем собрано много полезных презентаций, некоторые из которых действительно старые, а некоторые новые и чрезвычайно ценные.

Я думаю, что их должное уважение к функции GOTO является ключевым.

http://us2.php.net/goto

Обязательный xkcd: xkcd.com/292

Ikke 23.02.2010 23:24

Предопределенные интерфейсы:

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 не используют исключения!

laurentb 03.02.2010 00:44

Стекируемые файлы юнитов

<?
// 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 - это зло! Но в любом случае, не знал об этом ... Красиво :)

user312650 24.06.2010 19:05

goto на самом деле больше нет ...

NikiC 30.08.2010 20:47

Это очень полезно и безопасно, пока мы не имеем дело с объектами / структурами, которые должны быть, из-за отсутствия лучшего слова, «освобожденными». Но в целом мне очень не хватает этого на других языках - я думаю, это намного яснее и недвусмысленнее, чем любой GOTO.

Egon_Freeman 23.09.2010 17:19

Вы можете установить проверку для каждой опции при использовании оператора 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 * устарел, верно?

Maerlyn 29.06.2010 17:47

Лямбда-функции

Пример - сортировка по полю в многомерном массиве

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.

Savageman 29.06.2010 01:05

Чтобы было ясно, синтаксис 5.3 - это анонимные функции.

Codler 29.06.2010 01:24

Сокращенные логические цепочки

<?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».

Mark Tomlin 30.06.2010 09:26

Другие вопросы по теме