<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><generator uri="http://www.habariproject.org/" version="0.7">Habari</generator><id>tag:blog.kron0s.com,2011-12-20:atom/bd0509f72171676ceeaaa08b8de6822a290c3e7c</id><title>Пара слов о программировании</title><subtitle>Сон разума рождает чудовищ</subtitle><updated>2011-07-01T16:25:15+06:00</updated><link rel="alternate" href="http://blog.kron0s.com/" /><link rel="first" href="http://blog.kron0s.com/atom/1/page/1" type="application/atom+xml" title="First Page" /><link rel="next" href="http://blog.kron0s.com/atom/1/page/2" type="application/atom+xml" title="Next Page" /><link rel="last" href="http://blog.kron0s.com/atom/1/page/6" type="application/atom+xml" title="Last Page" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/kron0s/atom" /><feedburner:info uri="kron0s/atom" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>kron0s/atom</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fkron0s%2Fatom" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fkron0s%2Fatom" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fkron0s%2Fatom" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/kron0s/atom" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fkron0s%2Fatom" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fkron0s%2Fatom" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fkron0s%2Fatom" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fkron0s%2Fatom" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2Fkron0s%2Fatom" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2Fkron0s%2Fatom" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2Fkron0s%2Fatom" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fkron0s%2Fatom" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fkron0s%2Fatom" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fkron0s%2Fatom" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fkron0s%2Fatom" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2Fkron0s%2Fatom" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2Fkron0s%2Fatom" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fkron0s%2Fatom" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsalloy.com/?rss=http%3A%2F%2Ffeeds.feedburner.com%2Fkron0s%2Fatom" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fkron0s%2Fatom" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><entry><title>Инвайты для социальной сети Google+</title><link rel="alternate" href="http://feedproxy.google.com/~r/kron0s/atom/~3/BLNZE4RuPc8/google-plus" /><link rel="edit" href="http://blog.kron0s.com/google-plus/atom" /><author><name>kron0s</name><uri>http://blog.kron0s.com</uri></author><id>tag:blog.kron0s.com,2011:%D0%B8%D0%BD%D0%B2%D0%B0%D0%B9%D1%82%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9-%D1%81%D0%B5%D1%82%D0%B8-google/1309513697</id><updated>2011-07-01T16:25:15+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-13T16:47:39+06:00</app:edited><published>2011-07-01T15:48:17+06:00</published><category term="google" /><category term="инвайт" /><content type="html">&lt;p&gt;&lt;a href="http://www.rusdigi.org/"&gt;Гилязетдинов Руслан&lt;/a&gt; угостил меня инвайтом в Google+. Теперь вот хочу пригласить читателей моего блога :) Для того, чтобы получить инвайт - сделайте ретвит этого и еще одного (любого) поста из моего блога. Не забудьте в комментариях написать твиттер аккаунт и email (желательно gmail).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3fWvWYOT3MPTlYsa7hHKZTfMFxg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3fWvWYOT3MPTlYsa7hHKZTfMFxg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3fWvWYOT3MPTlYsa7hHKZTfMFxg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3fWvWYOT3MPTlYsa7hHKZTfMFxg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=BLNZE4RuPc8:dKbPdcWxJz4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=BLNZE4RuPc8:dKbPdcWxJz4:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=BLNZE4RuPc8:dKbPdcWxJz4:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=BLNZE4RuPc8:dKbPdcWxJz4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=BLNZE4RuPc8:dKbPdcWxJz4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=BLNZE4RuPc8:dKbPdcWxJz4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=BLNZE4RuPc8:dKbPdcWxJz4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=BLNZE4RuPc8:dKbPdcWxJz4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/kron0s/atom/~4/BLNZE4RuPc8" height="1" width="1"/&gt;</content><feedburner:origLink>http://blog.kron0s.com/google-plus</feedburner:origLink></entry><entry><title>Понимание Javascript с помощью Object Graphs</title><link rel="alternate" href="http://feedproxy.google.com/~r/kron0s/atom/~3/rlhSf5iX0Z4/%D0%BF%D0%BE%D0%BD%D0%B8%D0%BC%D0%B0%D0%BD%D0%B8%D0%B5-javascript-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-object-graphs" /><link rel="edit" href="http://blog.kron0s.com/%D0%BF%D0%BE%D0%BD%D0%B8%D0%BC%D0%B0%D0%BD%D0%B8%D0%B5-javascript-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-object-graphs/atom" /><author><name>kron0s</name><uri>http://blog.kron0s.com</uri></author><id>tag:blog.kron0s.com,2011:%D0%BF%D0%BE%D0%BD%D0%B8%D0%BC%D0%B0%D0%BD%D0%B8%D0%B5-javascript-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-object-graphs/1303674451</id><updated>2011-04-25T01:47:31+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-25T01:52:23+06:00</app:edited><published>2011-04-25T01:47:31+06:00</published><category term="javascript" /><category term="основы" /><content type="html">&lt;p&gt;Настоящее понимание семантики языка - важный секрет хорошего разработчика на Javscript. В этой статье с помощью диаграмм показаны основы JS.&lt;/p&gt;&lt;h2&gt;Все - ссылки&lt;/h2&gt;&lt;p&gt;Переменные в JS это ярлыки, которые указывают на значение в памяти. Эти значения могут быть простыми типами - строками, числами и булевыми значениями. Так же они могут быть объектами или функциями.&lt;/p&gt;&lt;!--more--&gt;&lt;h3&gt;Локальные переменные&lt;/h3&gt;&lt;p&gt;В примере ниже, мы создадим четыре локальные переменные в области видимости верхнего уровня и присвоим им значения.&lt;/p&gt;&lt;pre class="javascript" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// variables.js&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// создаем локальные переменные&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"Алексей"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; age &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #CC0000;"&gt;26&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; isProgrammer &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; likesJavaScript &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// Проверяем, что две переменные ссылаются на одно значение&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;isProgrammer &lt;span style="color: #339933;"&gt;===&lt;/span&gt; likesJavaScript&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #006600; font-style: italic;"&gt;// true&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="http://kron0s.com/demo/object-graphs/variables.png" alt="Локальные переменные" title="Локальные переменные"&gt;&lt;/p&gt;&lt;p&gt;Обратите внимание, что обе булевы переменные указывают на одно и то же значение в памяти. Это происходит из-за того что простые типы данных неизменны и виртуальная машина JS оптимизирует и объединяет все экземпляры в одно значение.&lt;/p&gt;&lt;p&gt;В этом куске кода мы проверили, указывают ли две переменные на одно значение используя ===, и получили в результате true.&lt;/p&gt;&lt;p&gt;Большой прямоугольник это наружная область видимости. Это локальные переменные верхнего уровня, но не надо путать их со свойствами объекта window, глобальными переменными.&lt;/p&gt;&lt;h3&gt;Объекты и цепочки прототипов&lt;/h3&gt;&lt;p&gt;Объекты это просто наборы ссылок на другие объекты и прототипы. И с еще одной специальной штукой - цепочкой прототипов, которая позволяет получить доступ к свойству, которого нет в локальном объекте, но которое есть в основном.&lt;/p&gt;&lt;pre class="javascript" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// objects.js&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// создаем основной объект&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; al &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"Алексей"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;age&lt;span style="color: #339933;"&gt;:&lt;/span&gt; 26&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;isProgrammer&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;likesJavaScript&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// Создаем наследуемый объект&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; valera &lt;span style="color: #339933;"&gt;=&lt;/span&gt; Object.&lt;span style="color: #660066;"&gt;create&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;al&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// локально переопределим некоторые свойства&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;valera.&lt;span style="color: #000066;"&gt;name&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"Валера"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;valera.&lt;span style="color: #660066;"&gt;age&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #CC0000;"&gt;23&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// Остальные ищутся по цепочке прототипов&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;valera.&lt;span style="color: #660066;"&gt;likesJavaScript&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #006600; font-style: italic;"&gt;// true&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="http://kron0s.com/demo/object-graphs/objects.png" alt="создаем основной объект" title="создаем основной объект"&gt;&lt;/p&gt;&lt;p&gt;У нас был объект с четырьмя свойствами, на который указывала переменная al. Потом мы унаследовали от него другой объект, на который стала указывать переменная valera. Затем мы переопределили два свойства в новом объекте.&lt;/p&gt;&lt;p&gt;Теперь при обращении к valera.likesJavaScript, сначала будет найдена переменная valera. Затем будет попытка обратиться к свойству likesJavaScript. Так как его нет в этом объекте, но есть у родительского, будет возвращено значение родительского свойства likesJavaScript. И мы получим true.&lt;/p&gt;&lt;h3&gt;Глобальный объект&lt;/h3&gt;&lt;p&gt;Почему такие инструменты, как &lt;a href="http://jslint.com/"&gt;jslint&lt;/a&gt;, всегда напоминают написать ключевое слово var перед объявлением переменной (если его нет, конечно). Давайте посмотрим, что будет, если его все же забыли.&lt;/p&gt;&lt;pre class="javascript" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// globals.js&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"Алексей"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; age &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #CC0000;"&gt;26&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; isProgrammer &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// упс, мы забыли ключевое слово var&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;likesJavaScript &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="http://kron0s.com/demo/object-graphs/globals.png" alt="Глобальный объект" title="Глобальный объект"&gt;&lt;/p&gt;&lt;p&gt;Обратите внимание likesJavaScript теперь свойство глобального объекта, а не какой-то переменной. Это имеет важное значение, если вы собираетесь использовать одновременно несколько разных скриптов. А в любом настоящем приложении вам придется использовать несколько скриптов.&lt;/p&gt;&lt;p&gt;Всегда ставьте ключевое слово var, для того, чтобы использовать ваше область видимости для переменных. Если следовать этому правилу, то вам будет гораздо легче писать и отлаживать программы.&lt;/p&gt;&lt;p&gt;Если вам действительно надо что-то положить в глобальный объект, сделайте это явно, например, так, window.woo (для браузеров) или global.goo (для node.js).&lt;/p&gt;&lt;h2&gt;Функции и замыкания&lt;/h2&gt;&lt;p&gt;JavaScript это не только последовательности вложенных структур данных. Переменные могут содержать выполняемый код - функции. Каждая функция имеет свою область видимости.&lt;/p&gt;&lt;h3&gt;Визуализация замыканий&lt;/h3&gt;&lt;p&gt;Функции можно представить в виде вложенных областей видимости или в виде специфических объектов, содержащих исполняемый код и имеющих свои свойства.&lt;/p&gt;&lt;p&gt;В этом примере мы реализуем простой фабричный метод, который будет генерировать замыкания и возвращать функцию.&lt;/p&gt;&lt;pre class="javascript" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// closure.js&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; makeClosure&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; description1 &lt;span style="color: #339933;"&gt;=&lt;/span&gt; makeClosure&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"Первое замыкание"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; description2 &lt;span style="color: #339933;"&gt;=&lt;/span&gt; makeClosure&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"Второе"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;console.&lt;span style="color: #660066;"&gt;log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;description1&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;console.&lt;span style="color: #660066;"&gt;log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;description2&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// Результат:&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// Первое замыкание&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// Второе&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="http://kron0s.com/demo/object-graphs/closure.png" alt="Визуализация замыканий" title="Визуализация замыканий"&gt;&lt;/p&gt;&lt;p&gt;Когда происходит вызов description1(), виртуальная машина JavaScript ищет функцию с таким названием и выполняет ее. И в каждой функции ищется локальная переменная name. Фабричный метод хорош тем, что создает функции со своей собственной областью видимости.&lt;/p&gt;&lt;p&gt;Хорошее понимание замыканий очень важно в JavaScript, и на эту тему написано много различный &lt;a href="http://howtonode.org/why-use-closure"&gt;статей&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Общие функции и this&lt;/h3&gt;&lt;p&gt;В JavaScript есть возможность переопределить значение this, что позволяет использовать функции с различными областями видимости, что бывает полезно для повышения производительности или для написания более красивого кода.&lt;/p&gt;&lt;p&gt;Ниже мы создадим несколько объектов, владеющих одной общей функцией. Эта функция будет использовать this, чтобы показать, как он меняется от вызова к вызову.&lt;/p&gt;&lt;pre class="javascript" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// functions.js&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; lambda &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"Лямбда"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;description&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #000066;"&gt;name&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; description &lt;span style="color: #339933;"&gt;=&lt;/span&gt; lambda.&lt;span style="color: #660066;"&gt;description&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; funct &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;description&lt;span style="color: #339933;"&gt;:&lt;/span&gt; lambda.&lt;span style="color: #660066;"&gt;description&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"Функция"&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// вызываем функцию из четырех различных областей видимости&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;console.&lt;span style="color: #660066;"&gt;log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;lambda.&lt;span style="color: #660066;"&gt;description&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;console.&lt;span style="color: #660066;"&gt;log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;funct.&lt;span style="color: #660066;"&gt;description&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;console.&lt;span style="color: #660066;"&gt;log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;description&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;console.&lt;span style="color: #660066;"&gt;log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;description.&lt;span style="color: #660066;"&gt;call&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"Что-то"&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// Результат:&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// Лямбда&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// Функция&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// undefined&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// Что-то&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="http://kron0s.com/demo/object-graphs/functions.png" alt="Общие функции и this" title="Общие функции и this"&gt;&lt;/p&gt;&lt;p&gt;На диаграмме видно, что хоть funct.description присвоена lambda.description, на самом деле, это ссылки на одну и ту же функцию. Таким образом все три ссылки указывают на одну и ту же анонимную функцию. Именно по этому я стараюсь не называть функции в конструкторе прототипа "методами", так как они всего лишь способ указать что эта функция связанна с этим "классом". (&lt;a href="http://howtonode.org/what-is-this"&gt;здесь&lt;/a&gt; описано подробно о природе this)&lt;/p&gt;&lt;/h2&gt;&lt;p&gt;Заключение&lt;/p&gt;&lt;/h2&gt;&lt;p&gt;Я получил кучу удовольствия используя диаграммы для визуализации структур данных. Я надеюсь, они помогут тем, кто изучает JavaScript, в понимании его семантики. У меня есть опыт в разработке как клиентской, так и серверной части архитектуры. Возможно, мой опыт поможет новичкам в изучении Javascript, этого замечательного языка программирования.&lt;/p&gt;&lt;p&gt;Файлы с исходным кодом и dot файлы для генерации графов можно скачать &lt;a href="http://kron0s.com/demo/object-graphs/object-graphs.rar"&gt;здесь&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://howtonode.org/object-graphs"&gt;Оригинал&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BWw0wyMMoG-99v9reKFOLtFSRQE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BWw0wyMMoG-99v9reKFOLtFSRQE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BWw0wyMMoG-99v9reKFOLtFSRQE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BWw0wyMMoG-99v9reKFOLtFSRQE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=rlhSf5iX0Z4:x-2s3kxkZwQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=rlhSf5iX0Z4:x-2s3kxkZwQ:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=rlhSf5iX0Z4:x-2s3kxkZwQ:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=rlhSf5iX0Z4:x-2s3kxkZwQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=rlhSf5iX0Z4:x-2s3kxkZwQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=rlhSf5iX0Z4:x-2s3kxkZwQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=rlhSf5iX0Z4:x-2s3kxkZwQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=rlhSf5iX0Z4:x-2s3kxkZwQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/kron0s/atom/~4/rlhSf5iX0Z4" height="1" width="1"/&gt;</content><feedburner:origLink>http://blog.kron0s.com/%D0%BF%D0%BE%D0%BD%D0%B8%D0%BC%D0%B0%D0%BD%D0%B8%D0%B5-javascript-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-object-graphs</feedburner:origLink></entry><entry><title>Делаем "float:both" с помощью псевдоэлементов</title><link rel="alternate" href="http://feedproxy.google.com/~r/kron0s/atom/~3/SskcViU2KWA/%D0%B4%D0%B5%D0%BB%D0%B0%D0%B5%D0%BC-floatboth-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-%D0%BF%D1%81%D0%B5%D0%B2%D0%B4%D0%BE%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2" /><link rel="edit" href="http://blog.kron0s.com/%D0%B4%D0%B5%D0%BB%D0%B0%D0%B5%D0%BC-floatboth-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-%D0%BF%D1%81%D0%B5%D0%B2%D0%B4%D0%BE%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2/atom" /><author><name>kron0s</name><uri>http://blog.kron0s.com</uri></author><id>tag:blog.kron0s.com,2011:%D0%B4%D0%B5%D0%BB%D0%B0%D0%B5%D0%BC-floatboth-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-%D0%BF%D1%81%D0%B5%D0%B2%D0%B4%D0%BE%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2/1303191476</id><updated>2011-04-19T11:37:59+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-20T10:38:53+06:00</app:edited><published>2011-04-19T11:37:56+06:00</published><category term="css" /><category term="float" /><content type="html">&lt;p&gt;Предположим мы хотим создать подобный шаблон:&lt;/p&gt;&lt;p&gt;&lt;img src="http://kron0s.com/demo/float_both/catinmiddle1.png"&gt;&lt;/p&gt;&lt;p&gt;Зачем нам это надо? Ну, например, чтобы внимание читателя привлекла фотография кошки в середине. Как это сделать? (фото кошки получено с &lt;a href="http://placekitten.com/"&gt;PlaceKitten&lt;/a&gt;)&lt;/p&gt;&lt;!--more--&gt;&lt;p&gt;Сделать такой макет не очень просто. Современные методы верстки не рассчитаны на такое использование. Иногда кажется, что они создавались вообще не для web-дизайна. Или я не прав? Даже бета версии CSS3 не позволяют легко сделать такой макет. На самом деле рисунок в нем похож на поплавок - текст огибает его с обоих сторон, вероятно, стоило бы использовать свойство center или both у float; но ничего подобного нет.&lt;/p&gt;&lt;p&gt;Но это возможно! Итак:&lt;/p&gt;&lt;p&gt;Пример&lt;/p&gt;&lt;p&gt;Сделано это с использованием псевдоэлементов. Добавим по псевдоэлементу в каждый столбец, один с float:left, другой с float:right. У каждого псевдоэлемента должна быть установлена высота равная высоте изображения и ширина равная половине ширины изображения (это без учета возможных отступов, а они нужны, например, для создания просвета между колонками).&lt;/p&gt;&lt;p&gt;Код:&lt;/p&gt;&lt;pre class="css" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #cc00cc;"&gt;#l&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;:before&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt; &lt;span style="color: #cc00cc;"&gt;#r&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;:before &lt;/span&gt;&lt;span style="color: #00AA00;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;content&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;""&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;width&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #933;"&gt;125px&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;height&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #933;"&gt;250px&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #00AA00;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #cc00cc;"&gt;#l&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;:before &lt;/span&gt;&lt;span style="color: #00AA00;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;float&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;right&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #00AA00;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #cc00cc;"&gt;#r&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;:before &lt;/span&gt;&lt;span style="color: #00AA00;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;float&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;left&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #00AA00;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="http://kron0s.com/demo/float_both/psuedoplaceholders.jpg"&gt;&lt;/p&gt;&lt;p&gt;Таким образом получиться своеобразная "дыра" для изображения. В примере использовалось абсолютное позиционирование изображения. Так же можно было оставить рисунок в центре и добавить отрицательный margin-top для правой колонки.&lt;/p&gt;&lt;p&gt;&lt;a href="http://css-tricks.com/float-center/"&gt;оригинал&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/RHPWq4HKAk4h1648-Q37m3EeJMI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RHPWq4HKAk4h1648-Q37m3EeJMI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/RHPWq4HKAk4h1648-Q37m3EeJMI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RHPWq4HKAk4h1648-Q37m3EeJMI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=SskcViU2KWA:Xv6TYmw5EPA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=SskcViU2KWA:Xv6TYmw5EPA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=SskcViU2KWA:Xv6TYmw5EPA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=SskcViU2KWA:Xv6TYmw5EPA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=SskcViU2KWA:Xv6TYmw5EPA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=SskcViU2KWA:Xv6TYmw5EPA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=SskcViU2KWA:Xv6TYmw5EPA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=SskcViU2KWA:Xv6TYmw5EPA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/kron0s/atom/~4/SskcViU2KWA" height="1" width="1"/&gt;</content><feedburner:origLink>http://blog.kron0s.com/%D0%B4%D0%B5%D0%BB%D0%B0%D0%B5%D0%BC-floatboth-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-%D0%BF%D1%81%D0%B5%D0%B2%D0%B4%D0%BE%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2</feedburner:origLink></entry><entry><title>Итераторы SPL (Standard PHP Library)</title><link rel="alternate" href="http://feedproxy.google.com/~r/kron0s/atom/~3/ISIO-B_5yaA/%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B-spl-standard-php-library" /><link rel="edit" href="http://blog.kron0s.com/%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B-spl-standard-php-library/atom" /><author><name>kron0s</name><uri>http://blog.kron0s.com</uri></author><id>tag:blog.kron0s.com,2011:итераторы-spl-standard-php-library/1302781316</id><updated>2011-04-18T14:03:06+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-18T14:03:06+06:00</app:edited><published>2011-04-18T14:03:06+06:00</published><category term="php" /><category term="spl" /><category term="итераторы" /><content type="html">&lt;p&gt;Не так давно я писал о структурах данных в SPL. Теперь я решил написать о другой возможности этого расширения - об итераторах.&lt;/p&gt;&lt;p&gt;Что такое &lt;a href="http://ru.wikipedia.org/wiki/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)"&gt;итератор&lt;/a&gt; согласно википедии:&lt;/p&gt;&lt;p&gt;Итератор — объект, позволяющий программисту перебирать все элементы коллекции без учёта особенностей её реализации.&lt;/p&gt;&lt;p&gt;В SPL есть несколько реализаций итераторов. По большей части они используют &lt;a href="http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BA%D0%BE%D1%80%D0%B0%D1%82%D0%BE%D1%80_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)"&gt;паттерн декоратор&lt;/a&gt;, так что можно совмещать несколько итераторов.&lt;/p&gt;&lt;!--more--&gt;&lt;h2&gt;Примеры итераторов SPL&lt;/h2&gt;&lt;h3&gt;&lt;a href="http://www.php.net/manual/en/class.arrayiterator.php"&gt;ArrayIterator&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;C помощью ArrayIterator можно создать итератор из массива. Это необходимо для использования декораторов.&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$arrayIterator&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; ArrayIterator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;1&lt;span style="color: #339933;"&gt;,&lt;/span&gt; 2&lt;span style="color: #339933;"&gt;,&lt;/span&gt; 3&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;foreach&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$arrayIterator&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;as&lt;/span&gt; &lt;span style="color: #000088;"&gt;$element&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #000088;"&gt;$element&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; PHP_EOL&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// 1 2 3&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Обратите внимание: в некоторых случаях, вместо ArrayIterator, можно использовать объект &lt;a href="http://www.php.net/manual/en/class.arrayobject.php"&gt;ArrayObject&lt;/a&gt;, который позволяет работать с объектами как с массивами.&lt;/p&gt;&lt;h3&gt;&lt;a href="http://www.php.net/manual/en/class.recursivearrayiterator.php"&gt;RecursiveArrayIterator&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У ArrayIterator есть один недостаток. Он работает только с одномерными массивами. Если вы хотите использовать многомерные массивы, воспользуйтесь RecursiveArrayIterator.&lt;/p&gt;&lt;p&gt;Для перебора рекурсивного итератора можно использовать &lt;a href="http://www.php.net/manual/en/class.recursiveiteratoriterator.php"&gt;RecursiveIteratorIterator&lt;/a&gt;.&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$recursiveArrayIterator&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; RecursiveArrayIterator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'a'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'b'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'c'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'d'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;foreach&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; RecursiveIteratorIterator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$recursiveArrayIterator&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;as&lt;/span&gt; &lt;span style="color: #000088;"&gt;$element&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #000088;"&gt;$element&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; PHP_EOL&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// a b c d&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Обратите внимание: некоторые другие итераторы тоже имеют рекурсивную версию. Здесь вы можете найти все реализации интерфейса &lt;a href="http://www.php.net/manual/en/class.recursiveiterator.php"&gt;RecursiveIterator&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;&lt;a href="http://www.php.net/manual/en/class.filteriterator.php"&gt;FilterIterator&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;FilterIterator отвечает за отсеивание ненужных значений. Это абстрактный класс с абстрактным методом accept(), который возвращает true, если значение удовлетворяет условию и false в противоположном случае.&lt;/p&gt;&lt;p&gt;Фильтруем значение больше чем 3:&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$arrayIterator&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; ArrayIterator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;2&lt;span style="color: #339933;"&gt;,&lt;/span&gt; 4&lt;span style="color: #339933;"&gt;,&lt;/span&gt; 6&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;class&lt;/span&gt; GreatherThanThreeFilterIterator &lt;span style="color: #000000; font-weight: bold;"&gt;extends&lt;/span&gt; FilterIterator&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; accept&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;getInnerIterator&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;current&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;&gt;&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;3&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;foreach&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; GreatherThanThreeFilterIterator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$arrayIterator&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;as&lt;/span&gt; &lt;span style="color: #000088;"&gt;$element&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #000088;"&gt;$element&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; PHP_EOL&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// 4 6&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Обратите внимание: для получения значение используется метод $this-&gt;getInnerIterator()-&gt;current().&lt;/p&gt;&lt;h3&gt;&lt;a href="http://www.php.net/manual/en/class.regexiterator.php"&gt;RegexIterator&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Это другой интересный итератор, который позволяет отсеивать значения используя регулярные выражения.&lt;/p&gt;&lt;p&gt;Возвращает элементы, которые начинаются на is_.&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$arrayIterator&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; ArrayIterator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'is_one'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'is_two'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'was_three'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;foreach&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; RegexIterator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$arrayIterator&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'/is_*/'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;as&lt;/span&gt; &lt;span style="color: #000088;"&gt;$element&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #000088;"&gt;$element&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; PHP_EOL&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// is_one is_two&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h3&gt;&lt;a href="http://www.php.net/manual/en/class.limititerator.php"&gt;LimitIterator&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;LimitIterator отвечает за предельное количество итераций. Это может быть удобно при разбивке элементов коллекции на страницы.&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$arrayIterator&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; ArrayIterator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'one'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'two'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'three'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;foreach&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; LimitIterator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$arrayIterator&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; 2&lt;span style="color: #339933;"&gt;,&lt;/span&gt; 1&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;as&lt;/span&gt; &lt;span style="color: #000088;"&gt;$element&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #000088;"&gt;$element&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; PHP_EOL&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// three&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h3&gt;&lt;a href="http://www.php.net/manual/en/class.directoryiterator.php"&gt;DirectoryIterator&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;DirectoryIterator предоставляет способ получения списка файлов в директории. Все файлы и директории представлены как объекты класса &lt;a href="http://www.php.net/manual/en/class.splfileinfo.php"&gt;SplFileInfo&lt;/a&gt;, и содержат все системную информацию о себе.&lt;/p&gt;&lt;p&gt;Пример использования DirectoryIterator и FilterIterator для печати списка файлов в директории:&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$directoryIterator&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; DirectoryIterator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'.'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;class&lt;/span&gt; OnlyFilesFilterIterator &lt;span style="color: #000000; font-weight: bold;"&gt;extends&lt;/span&gt; FilterIterator&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; accept&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #339933;"&gt;!&lt;/span&gt; &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;getInnerIterator&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;current&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;isDir&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;foreach&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; OnlyFilesFilterrIterator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$directoryIterator&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;as&lt;/span&gt; &lt;span style="color: #000088;"&gt;$file&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #000088;"&gt;$file&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;getFilename&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; PHP_EOL&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h3&gt;&lt;a href="http://www.php.net/manual/en/class.infiniteiterator.php"&gt;InfiniteIterator&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Итератор InfiniteIterator позволяет бесконечно перечислять элементы коллекции. По достижению последнего элемента, цикл начнется с первого. Это полезно, когда вы хотите сделать свой сервер запросов или реализовать обработку реакций на события.&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$arrayIterator&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; ArrayIterator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$task1&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$task2&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$task3&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$infiniteTaskIterator&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; InfiniteIterator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$arrayIterator&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;foreach&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$infiniteTaskIterator&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;as&lt;/span&gt; &lt;span style="color: #000088;"&gt;$task&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000088;"&gt;$performSucceded&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$task&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;perform&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;false&lt;/span&gt; &lt;span style="color: #339933;"&gt;===&lt;/span&gt; &lt;span style="color: #000088;"&gt;$performSucceded&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;break&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #990000;"&gt;usleep&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;200&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h3&gt;&lt;a href="http://www.php.net/manual/en/class.appenditerator.php"&gt;AppendIterator&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;С помощью AppendIterator можно объединить несколько итераторов в один.&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$arrayIterator&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; ArrayIterator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;2&lt;span style="color: #339933;"&gt;,&lt;/span&gt; 4&lt;span style="color: #339933;"&gt;,&lt;/span&gt; 6&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$arrayIterator2&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; ArrayIterator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;7&lt;span style="color: #339933;"&gt;,&lt;/span&gt; 8&lt;span style="color: #339933;"&gt;,&lt;/span&gt; 9&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$appendIterator&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; AppendIterator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$appendIterator&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;append&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$arrayIterator&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$appendIterator&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;append&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$arrayIterator2&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;foreach&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$appendIterator&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;as&lt;/span&gt; &lt;span style="color: #000088;"&gt;$element&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #000088;"&gt;$element&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; PHP_EOL&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// 2 4 6 7 8 9&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h3&gt;&lt;a href="http://www.php.net/manual/en/class.globiterator.php"&gt;GlobIterator&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Итератор GlobIterator работает почти как функция glob(), но возвращает итератор, содержащий объекты класса SplFileInfo, вместо массива.&lt;/p&gt;&lt;p&gt;Код ниже вернет все файлы начинающиеся с точки в текущей директории.&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$globIterator&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; GlobIterator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'.*'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;foreach&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$globIterator&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;as&lt;/span&gt; &lt;span style="color: #000088;"&gt;$file&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #000088;"&gt;$file&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; PHP_EOL&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h3&gt;&lt;a href="http://www.php.net/manual/en/class.emptyiterator.php"&gt;EmptyIterator&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;На первый взгляд это совершенно бесполезный итератор. Но это не так. Представьте, что ваш код должен вернуть коллекцию данных, и эта коллекция используется другими итераторами.&lt;/p&gt;&lt;p&gt;Но, возвращать нечего - что делать? Можно вернуть false, но это сломает цепочку декораторов или создать итератор из пустого массива. Но все же правильнее вернуть EmptyIterator.&lt;/p&gt;&lt;h2&gt;&lt;a href="http://www.php.net/manual/en/class.splfileobject.php"&gt;SplFileObject&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;С помощью SplFileObject можно перебрать все строки файла. Что-то вроде &lt;a href="http://php.net/manual/en/function.file.php"&gt;функции file&lt;/a&gt;, но с помощью итераторов.&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$fileObject&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; SplFileObject&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'FILE'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;foreach&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$fileObject&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;as&lt;/span&gt; &lt;span style="color: #000088;"&gt;$fileRow&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #000088;"&gt;$fileRow&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt;PHP_EOL&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h2&gt;Функции для работы с итераторами&lt;/h2&gt;&lt;h3&gt;iterator_count&lt;/h3&gt;&lt;p&gt;Число элементов в итераторе.&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$arrayIterator&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; ArrayIterator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;1&lt;span style="color: #339933;"&gt;,&lt;/span&gt; 2&lt;span style="color: #339933;"&gt;,&lt;/span&gt; 3&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #990000;"&gt;iterator_count&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$arrayIterator&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// 3&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h3&gt;iterator_apply&lt;/h3&gt;&lt;p&gt;Применяет функцию к каждому элементу итератора.&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$arrayIterator&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; ArrayIterator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;1&lt;span style="color: #339933;"&gt;,&lt;/span&gt; 2&lt;span style="color: #339933;"&gt;,&lt;/span&gt; 3&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; triple&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Iterator &lt;span style="color: #000088;"&gt;$iterator&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;    &lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #000088;"&gt;$iterator&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;current&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;*&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;3&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;    &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #009900; font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #990000;"&gt;iterator_apply&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$arrayIterator&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'triple'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$arrayIterator&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Обратите внимание: вы можете прервать вызовы функции вернув false.&lt;/p&gt;&lt;h3&gt;&lt;a href="http://php.net/manual/pl/function.iterator-to-array.php"&gt;iterator_to_array&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Очень полезная функция, создает массив из итератора.&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$directoryIterator&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; GlobIterator&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'.*'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #990000;"&gt;var_dump&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;iterator_to_array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$directoryIterator&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// массив объектов класса SplFileInfo&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PabBvxakl-nKwPew3jeU3EIHI6w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PabBvxakl-nKwPew3jeU3EIHI6w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PabBvxakl-nKwPew3jeU3EIHI6w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PabBvxakl-nKwPew3jeU3EIHI6w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=ISIO-B_5yaA:TtvRsM_x9_4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=ISIO-B_5yaA:TtvRsM_x9_4:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=ISIO-B_5yaA:TtvRsM_x9_4:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=ISIO-B_5yaA:TtvRsM_x9_4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=ISIO-B_5yaA:TtvRsM_x9_4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=ISIO-B_5yaA:TtvRsM_x9_4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=ISIO-B_5yaA:TtvRsM_x9_4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=ISIO-B_5yaA:TtvRsM_x9_4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/kron0s/atom/~4/ISIO-B_5yaA" height="1" width="1"/&gt;</content><feedburner:origLink>http://blog.kron0s.com/%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B-spl-standard-php-library</feedburner:origLink></entry><entry><title>Структуры данных в SPL (Standard PHP Library)</title><link rel="alternate" href="http://feedproxy.google.com/~r/kron0s/atom/~3/knCD-m_nkqk/%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B2-spl-standard-php-library" /><link rel="edit" href="http://blog.kron0s.com/%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B2-spl-standard-php-library/atom" /><author><name>kron0s</name><uri>http://blog.kron0s.com</uri></author><id>tag:blog.kron0s.com,2011:структуры-данных-в-spl-standard-php-library/1302579100</id><updated>2011-04-12T09:32:56+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-13T16:51:22+06:00</app:edited><published>2011-04-12T09:32:56+06:00</published><category term="php" /><category term="spl" /><category term="структуры-данных" /><content type="html">&lt;p&gt;&lt;a href="http://pl2.php.net/manual/en/book.spl.php"&gt;Standard PHP Library (SPL)&lt;/a&gt; это классная штука, так сказать  - скрытая жемчужина PHP. На мой взгляд, расширение SPL совершенно необходимо для любого PHP программиста.&lt;/p&gt;&lt;p&gt;Одна из самых важных вещей в SPL это &lt;a href="http://pl2.php.net/manual/en/spl.datastructures.php"&gt;структуры данных&lt;/a&gt;. Раньше я использовал обычные массивы или &lt;a href="http://en.wikipedia.org/wiki/List_of_data_structures"&gt;простые структуры данных&lt;/a&gt;. После того, как я открыл для себя структуры данных SPL, я использую их в каждом проекте.&lt;/p&gt;&lt;!--more--&gt;&lt;p&gt;Ниже я приведу несколько примеров использования структур данных SPL.&lt;/p&gt;&lt;h2&gt;SplObjectStorage&lt;/h2&gt;&lt;p&gt;Какой самый большой недостаток у массивов в PHP? В качестве ключей можно использовать только строки или целые числа. В некоторых случаях это может быть очень неудобно, например, при создании ассоциативного массива. Решить эту проблему поможет структура &lt;a href="http://pl2.php.net/manual/en/class.splobjectstorage.php"&gt;SplObjectStorage&lt;/a&gt;. В нем можно использовать объекты в качестве ключей.&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$storage&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; SplObjectStorage&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$objectA&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; stdClass&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$objectB&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; stdClass&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$storage&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #000088;"&gt;$objectA&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'привет '&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$storage&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #000088;"&gt;$objectB&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'мир'&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #000088;"&gt;$storage&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #000088;"&gt;$objectA&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #000088;"&gt;$storage&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #000088;"&gt;$objectB&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; PHP_EOL&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// привет мир&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Другое применение SplObjectStorage - простая реализация множеств. Множества могут быть очень удобны при работе с переменным количеством объектов, например, с группой свойств.&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;class&lt;/span&gt; Language&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: #000088;"&gt;$_name&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; __construct&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$name&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;_name &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$name&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; __toString&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #990000;"&gt;ucfirst&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;_name&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$knownLanguages&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; SplObjectStorage&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$english&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; Language&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'english'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$russian&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; Language&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'русский'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// добавляем english в множество&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$knownLanguages&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;attach&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$english&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// проверяем, есть ли english в списке известных языков&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #990000;"&gt;var_dump&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$knownLanguages&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;contains&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$english&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// true&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #990000;"&gt;var_dump&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$knownLanguages&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;contains&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$russian&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// false&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// добавляем русский в множество&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$knownLanguages&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;attach&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$russian&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #990000;"&gt;var_dump&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$knownLanguages&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;contains&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$russian&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// true&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// удаляем english из множества&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$knownLanguages&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;detach&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$english&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// печатаем языки&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$knownLanguagesArray&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;foreach&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$knownLanguages&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;as&lt;/span&gt; &lt;span style="color: #000088;"&gt;$knownLanguage&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000088;"&gt;$knownLanguagesArray&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;string&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #000088;"&gt;$knownLanguage&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;	&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #990000;"&gt;join&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;', '&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$knownLanguagesArray&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// Русский&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h2&gt;SplHeap&lt;/h2&gt;&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Heap_%28data_structure%29"&gt;Куча&lt;/a&gt; используется, когда нужно хранить упорядоченные данные. SplHeap это абстрактный класс и его надо реализовать для использования.&lt;/p&gt;&lt;p&gt;В SPL есть две реализации SplHeap: &lt;a href="http://pl2.php.net/manual/en/class.splmaxheap.php"&gt;SplMaxHeap&lt;/a&gt; - порядок от большего к меньшему и &lt;a href="http://pl2.php.net/manual/en/class.splminheap.php"&gt;SplMinHeap&lt;/a&gt; - от меньшего к большему.&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$splMinHeap&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; SplMinHeap&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$splMinHeap&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;insert&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt; 1 &lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$splMinHeap&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;insert&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt; 2 &lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$splMinHeap&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;insert&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt; 3 &lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;foreach&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$splMinHeap&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;as&lt;/span&gt; &lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; PHP_EOL&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// 1 2 3&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$splMaxHeap&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; SplMaxHeap&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$splMaxHeap&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;insert&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt; 1 &lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$splMaxHeap&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;insert&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt; 2 &lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$splMaxHeap&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;insert&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt; 3 &lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;foreach&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$splMaxHeap&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;as&lt;/span&gt; &lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; PHP_EOL&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// 3 2 1&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Класс SplHeap имеет один абстрактный метод - &lt;a href="http://pl2.php.net/manual/en/splheap.compare.php"&gt;compare&lt;/a&gt;, который используется при добавлении элемента в кучу. Благодаря этому можно реализовать класс со своим способом сортировки или хранения объектов.&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;class&lt;/span&gt; Language&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: #000088;"&gt;$_name&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; __construct&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$name&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;_name &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$name&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; getName&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;_name&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$russian&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; Language&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'русский'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$english&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; Language&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'english'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;class&lt;/span&gt; LanguageHeap &lt;span style="color: #000000; font-weight: bold;"&gt;extends&lt;/span&gt; SplHeap&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; compare&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Language &lt;span style="color: #000088;"&gt;$objA&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; Language &lt;span style="color: #000088;"&gt;$objB&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #990000;"&gt;strcmp&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$objB&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;getName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$objA&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;getName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$LanguageHeap&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; LanguageHeap&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// добавляем в кучу&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$LanguageHeap&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;insert&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt; &lt;span style="color: #000088;"&gt;$russian&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$LanguageHeap&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;insert&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt; &lt;span style="color: #000088;"&gt;$english&lt;/span&gt; &lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;foreach&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$LanguageHeap&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;as&lt;/span&gt; &lt;span style="color: #000088;"&gt;$language&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #000088;"&gt;$language&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;getName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; PHP_EOL&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// english русский&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Обратите внимание: с php.net - Наличие нескольких элементов с одинаковым значением в куче не рекомендуется. Так как они не будут упорядочиваться относительно друг друга.&lt;/p&gt;&lt;h2&gt;SplQueue&lt;/h2&gt;&lt;p&gt;Другая хорошая структура это &lt;a href="http://ru.wikipedia.org/wiki/%D0%9E%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)"&gt;очередь&lt;/a&gt;. Если есть очередь задач или очередь писем для отправки, то можно использовать при реализации SqlQueue.&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;class&lt;/span&gt; Task&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: #000088;"&gt;$_name&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; __construct&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$name&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;_name &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$name&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; getName&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;_name&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$splQueue&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; SplQueue&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$task1&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; Task&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'проверить email'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$task2&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; Task&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'покормить кошку'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// добавляем в очередь&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$splQueue&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;enqueue&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$task2&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$splQueue&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;enqueue&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$task1&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;while&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt; &lt;span style="color: #000088;"&gt;$splQueue&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;count&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;&gt;&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;        &lt;span style="color: #666666; font-style: italic;"&gt;// получаем из очереди&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #000088;"&gt;$splQueue&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;dequeue&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;getName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; PHP_EOL&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// печатается покормить кошку проверить email&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h2&gt;SplPriorityQueue&lt;/h2&gt;&lt;p&gt;&lt;a href="http://ru.wikipedia.org/wiki/%D0%9E%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C_%D1%81_%D0%BF%D1%80%D0%B8%D0%BE%D1%80%D0%B8%D1%82%D0%B5%D1%82%D0%BE%D0%BC"&gt;Очередь с приоритетами&lt;/a&gt; - это более исчерпывающий тип очереди. Элементы извлекаются из очереди на основании приоритетов. Это может быть полезно при реализации менеджера задач или чего-нибудь подобного.&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$taskManager&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; SplPriorityQueue&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$task1&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; Task&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'проверить email'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; 1&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$task2&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; Task&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'покормить кошку'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; 10&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// добавляем в очередь&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$taskManager&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;insert&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$task1&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$task1&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;getPriority&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$taskManager&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;insert&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$task2&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$task2&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;getPriority&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;foreach&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$taskManager&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;as&lt;/span&gt; &lt;span style="color: #000088;"&gt;$task&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #000088;"&gt;$task&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;getName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;' '&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt;&lt;span style="color: #000088;"&gt;$task&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;getPriority&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; PHP_EOL&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// печатается покормить кошку 10 проверить email 1&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Обратите внимание: когда нужно получить приоритет в итерациях (если нет метода getPriority() в объекте) - можно воспользоваться &lt;a href="http://pl2.php.net/manual/en/splpriorityqueue.setextractflags.php"&gt;setExtractFlags&lt;/a&gt; и там определять, что нужно получить.&lt;/p&gt;&lt;p&gt;SplPriorityQueue основан на SplHeap, таким образом можно расширить SplPriorityQueue, переопределив метод и реализовав свой алгоритм сортировки.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/au8OK7-HfC-8gBMm9UGINPjqeJg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/au8OK7-HfC-8gBMm9UGINPjqeJg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/au8OK7-HfC-8gBMm9UGINPjqeJg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/au8OK7-HfC-8gBMm9UGINPjqeJg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=knCD-m_nkqk:o9fl7GTeTFA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=knCD-m_nkqk:o9fl7GTeTFA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=knCD-m_nkqk:o9fl7GTeTFA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=knCD-m_nkqk:o9fl7GTeTFA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=knCD-m_nkqk:o9fl7GTeTFA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=knCD-m_nkqk:o9fl7GTeTFA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=knCD-m_nkqk:o9fl7GTeTFA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=knCD-m_nkqk:o9fl7GTeTFA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/kron0s/atom/~4/knCD-m_nkqk" height="1" width="1"/&gt;</content><feedburner:origLink>http://blog.kron0s.com/%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B2-spl-standard-php-library</feedburner:origLink></entry><entry><title>Цепочки вызовов в PHP</title><link rel="alternate" href="http://feedproxy.google.com/~r/kron0s/atom/~3/1RQeH8HsT2I/%D1%86%D0%B5%D0%BF%D0%BE%D1%87%D0%BA%D0%B8-%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%BE%D0%B2-%D0%B2-php" /><link rel="edit" href="http://blog.kron0s.com/%D1%86%D0%B5%D0%BF%D0%BE%D1%87%D0%BA%D0%B8-%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%BE%D0%B2-%D0%B2-php/atom" /><author><name>kron0s</name><uri>http://blog.kron0s.com</uri></author><id>tag:blog.kron0s.com,2011:цепочки-вызовов-в-php/1300229665</id><updated>2011-03-21T06:57:08+05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-21T06:57:08+05:00</app:edited><published>2011-03-21T06:57:08+05:00</published><category term="php" /><category term="цепочки-вызовов" /><category term="ооп" /><category term="паттерны" /><content type="html">&lt;p&gt;В этой статье я расскажу про один из паттернов ООП  - цепочку вызовов. Если вы работали с PHP фреймворками (Zend, CodeIgniter, CakePHP или другими), то наверняка видели подобный стиль вызова методов классов:&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$obj&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;foo&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;bar&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;anotherMethod&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Такой стиль называется цепочка вызовов.&lt;/p&gt;&lt;p&gt;Рассмотрим использование цепочки вызовов на простом классе:&lt;/p&gt;&lt;!--more--&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;class&lt;/span&gt; Person  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: #000088;"&gt;$name&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: #000088;"&gt;$age&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; setName&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$Name&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;name&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$Name&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; setAge&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$Age&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;age&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$Age&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; findMe&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;echo&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;"Меня зовут "&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt;&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;name&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;" и мне "&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt;&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;age&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;" лет."&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Для доступа к классу создадим объект класса Person:&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$myself&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; Person&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$myself&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;setName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'Алексей'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$myself&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;setAge&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'26'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$myself&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;findMe&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;В результате получиться:&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;Меня зовут Алексей и мне &lt;span style="color: #cc66cc;"&gt;26&lt;/span&gt; лет&lt;span style="color: #339933;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h3&gt;Как сделать цепочку вызовов:&lt;/h3&gt;&lt;p&gt;Для того чтобы использовать цепочку вызовов, надо изменить класс, чтобы каждый метод "setXXX" возвращал объект $this.&lt;/p&gt;&lt;p&gt;Теперь наш класс выглядит следующим образом:&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;class&lt;/span&gt; Person  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: #000088;"&gt;$name&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: #000088;"&gt;$age&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; setName&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$Name&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;name&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$Name&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;span style="color: #666666; font-style: italic;"&gt;//возвращаем this, т.е. объект класса Person&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; setAge&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$Age&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;age&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$Age&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;span style="color: #666666; font-style: italic;"&gt;//опять возвращаем this, т.е. объект класса Person&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; findMe&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;echo&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;"Меня зовут "&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt;&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;name&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;" и мне "&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt;&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;age&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;" лет."&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Теперь можно использовать класс следующим образом:&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$myself&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; Person&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$myself&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;setName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'Алексей'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;setAge&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'26'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;findMe&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h3&gt;Суть концепции:&lt;/h3&gt;&lt;p&gt;Скорее всего вы уже видели, как работает такой код. Но давайте разберем поподробнее. Методы в цепочке вызываются слева направо.&lt;/p&gt;&lt;p&gt;$myself = new Person() - создает новый объект класса Person&lt;/p&gt;&lt;p&gt;Далее, $myself-&gt;setName('Алексей') присваивает значение переменной и возвращает все тот же объект.&lt;/p&gt;&lt;p&gt;Т.к.  $myself-&gt;setName('Алексей') возвращает объект класса Person, то можно использовать методы этого класса.&lt;/p&gt;&lt;p&gt;Зададим возраст пользователя $myself-&gt;setName('Алексей')-&gt;setAge('26'). Метод setAge('26') тоже возвращает объект $this, и можно опять вызывать другой метод этого класса.&lt;/p&gt;&lt;p&gt;В конце концов, метод findMe отображает информацию о пользователе:&lt;/p&gt;&lt;p&gt;$myself-&gt;setName('Алексей')-&gt;setAge('26')-&gt;findMe();&lt;/p&gt;&lt;p&gt;Цепочка вызовов работает.&lt;/p&gt;&lt;h3&gt;Цепочки вызовов в нескольких классах:&lt;/h3&gt;&lt;p&gt;Если у в проекте несколько классов, то цепочки вызовов могут и тут облегчить вам жизнь.&lt;/p&gt;&lt;p&gt;Рассмотрим пример:&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;class&lt;/span&gt; ComplexPerson  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; setName&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$Name&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; FindNames&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$Name&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;span style="color: #666666; font-style: italic;"&gt;//возвращаем объект класса FindAges&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; setAge&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$Age&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;age&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$Age&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; FindAges&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$Age&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;span style="color: #666666; font-style: italic;"&gt;//возвращаем объект класса FindAges&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;class&lt;/span&gt; FindNames  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: #000088;"&gt;$name&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; __construct&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$n&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;name&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$n&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; printName&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;echo&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;"Меня зовут "&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt;&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;n&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"."&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;class&lt;/span&gt; FindAges  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: #000088;"&gt;$age&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; __construct&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$a&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;age&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$a&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; printAge&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;echo&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;"Мне "&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt;&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;age&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;" лет."&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Теперь мы можем использовать цепочки вызовов в этих классах:&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$anotherMe&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; ComplexPerson&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$anotherMe&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;setName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"Алексей"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;printName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$anotherMe&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;setAge&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"26"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;printAge&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h2&gt;Цепочки вызовов и магические сеттеры&lt;/h2&gt;&lt;p&gt;Как сделать так, чтобы присвоение свойст объекту было красивым и не требовало написания кучи кода? Методы присвоения свойств очень похожи - объединим их, воспользовавшись магическим методом __call. Рассмотрим это на примере:&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;class&lt;/span&gt; Email&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000088;"&gt;$from&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000088;"&gt;$to&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000088;"&gt;$subject&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000088;"&gt;$body&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; send&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #666666; font-style: italic;"&gt;// заглушка для отправки почты&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;echo&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;"Отправляем mail"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; __call&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$name&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$arguments&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #666666; font-style: italic;"&gt;// присвоение переменной значения&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;substr&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$name&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;4&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;==&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'set_'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;			&lt;span style="color: #000088;"&gt;$property&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #990000;"&gt;substr&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$name&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;4&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;			&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$property&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$arguments&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;0&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #666666; font-style: italic;"&gt;// добавление значения в массив&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #009900;"&gt;}&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;else&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;substr&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$name&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;4&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;==&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'add_'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;			&lt;span style="color: #000088;"&gt;$property&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #990000;"&gt;substr&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$name&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;4&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;			&lt;span style="color: #990000;"&gt;array_push&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$property&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$arguments&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;0&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #666666; font-style: italic;"&gt;// этот метод тоже может быть использован в цепочке вызовов&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Обратите внимание, что методов set_from, set_subject, set_body и add_to нет. Тем не менее Этот код дает возможность использовать класс следующим образом:&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;require_once&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'Email.php'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$my_email&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; Email&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$my_email&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;set_from&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'test@email.com'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;add_to&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'programming@gmail.com'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;add_to&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'smth@gmail.com'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;set_subject&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'Цепочки ввызовов'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;set_body&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Само сообщение&lt;span style="color: #0000ff;"&gt;')&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #0000ff;"&gt;	-&gt;send();&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h2&gt;Цепочки вызовов для валидаторов&lt;/h2&gt;&lt;p&gt;Предположим у нас есть такой код для валидации отправляемых данных:&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$validation&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; Validation&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$myvar&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$_POST&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'somepostvariable'&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$validation&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;required&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$myvar&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;&amp;&amp;&lt;/span&gt; &lt;span style="color: #000088;"&gt;$validation&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;isInt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$myvar&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'Все верно'&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;else&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'Не валидные данные'&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Как сделать его более легким для восприятия? Например, таким:&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$validation&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; Validation&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$myvar&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$_POST&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'somepostvariable'&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$validation&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;value&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$myvar&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;required&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;isInt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;execute&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'Все верно'&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #b1b100;"&gt;else&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #b1b100;"&gt;print&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'Не валидные данные'&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Для этого напишем следующий класс:&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;Class&lt;/span&gt; Validation&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000088;"&gt;$value&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;''&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000088;"&gt;$error_count&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; __construct&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; value&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;value&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; required&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;empty&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;			&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;error_count&lt;/span&gt;&lt;span style="color: #339933;"&gt;++;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; isInt&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #339933;"&gt;!&lt;/span&gt;&lt;span style="color: #990000;"&gt;is_numeric&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;||&lt;/span&gt; &lt;span style="color: #990000;"&gt;intval&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;!=&lt;/span&gt;&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;			&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;error_count&lt;/span&gt;&lt;span style="color: #339933;"&gt;++;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; execute&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;error_count&lt;/span&gt;&lt;span style="color: #339933;"&gt;&gt;&lt;/span&gt;0&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;			&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;error_count&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;			&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #009900; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #b1b100;"&gt;else&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;			&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #009900; font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;		&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h2&gt;Цепочка вызовов в построении запроса к БД&lt;/h2&gt;&lt;p&gt;Другим хорошим примером цепочки вызовов является стандартная реализация паттерна Active Record&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$db&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; Database&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$customers&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$db&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;select&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"name,email"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;from&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"customers"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;where&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"name"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"joe"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;limit&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;5&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;	&lt;span style="color: #339933;"&gt;-&gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;execute&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;В результате будет сделан запрос:&lt;/p&gt;&lt;pre class="sql" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #993333; font-weight: bold;"&gt;SELECT&lt;/span&gt; name&lt;span style="color: #66cc66;"&gt;,&lt;/span&gt;email &lt;span style="color: #993333; font-weight: bold;"&gt;FROM&lt;/span&gt; customers &lt;span style="color: #993333; font-weight: bold;"&gt;WHERE&lt;/span&gt; name&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'joe'&lt;/span&gt; &lt;span style="color: #993333; font-weight: bold;"&gt;LIMIT&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;,&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;5&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Вот и все :)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WDNC0iWc4fnn-9y4mE8ZasgPFKk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WDNC0iWc4fnn-9y4mE8ZasgPFKk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/WDNC0iWc4fnn-9y4mE8ZasgPFKk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WDNC0iWc4fnn-9y4mE8ZasgPFKk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=1RQeH8HsT2I:qLqFrcnGe8k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=1RQeH8HsT2I:qLqFrcnGe8k:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=1RQeH8HsT2I:qLqFrcnGe8k:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=1RQeH8HsT2I:qLqFrcnGe8k:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=1RQeH8HsT2I:qLqFrcnGe8k:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=1RQeH8HsT2I:qLqFrcnGe8k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=1RQeH8HsT2I:qLqFrcnGe8k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=1RQeH8HsT2I:qLqFrcnGe8k:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/kron0s/atom/~4/1RQeH8HsT2I" height="1" width="1"/&gt;</content><feedburner:origLink>http://blog.kron0s.com/%D1%86%D0%B5%D0%BF%D0%BE%D1%87%D0%BA%D0%B8-%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%BE%D0%B2-%D0%B2-php</feedburner:origLink></entry><entry><title>Как сделать ввод пароля наподобие iPhone</title><link rel="alternate" href="http://feedproxy.google.com/~r/kron0s/atom/~3/hwi_Sjva2ZU/iphone-password" /><link rel="edit" href="http://blog.kron0s.com/iphone-password/atom" /><author><name>kron0s</name><uri>http://blog.kron0s.com</uri></author><id>tag:blog.kron0s.com,2011:как-сделать-ввод-пароля-наподобие-iphone/1300110023</id><updated>2011-03-15T10:25:38+05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-15T12:53:13+05:00</app:edited><published>2011-03-15T10:25:38+05:00</published><category term="javascript" /><category term="jquery" /><category term="юзабилити" /><category term="пароль-как-в-iphone" /><content type="html">&lt;p&gt;Якоб Нильсен, не так давно, &lt;a href="http://www.useit.com/alertbox/passwords.html"&gt;предположил&lt;/a&gt;, что скрывать вводимый пароль звездочками - не самая лучшая идея:&lt;/p&gt;&lt;p align="right"&gt;&lt;i&gt;
Когда пользователь вводит пароль, а видит только звездочки - это неудобно. Причем на повышение безопасности этот функционал почти не влияет, зато может оказаться решающим для вашего сайта.
&lt;/i&gt;&lt;/p&gt;&lt;p align="right"&gt;&lt;b&gt;Якоб Нильсен&lt;/b&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Нильсен утверждает, что основные условия успешного юзабилити - предоставление обратной связи и отображение текущего состояния. Более того, он утверждает, что с точки зрения бизнеса неудачные попытки войти на сайт встанут в дополнительные расходы на поддержку пользователей. Все это верно, но тем не менее для пользователей важно, что их пароль не видно.&lt;/p&gt;&lt;p&gt;Пользователи привыкли, что их пароль никто не видит.&lt;/p&gt;&lt;!--more--&gt;&lt;h2&gt;Пароли - это безопасность&lt;/h2&gt;&lt;p&gt;Пароли - это основа безопасности. Если на сайте можно ввести пароль, то для большинства пользователей он - безопасен, вне зависимости от того как это обстоит на самом деле. Если показать ввод пароля вместо звездочек, это сэкономит вашим пользователям несколько секунд, но скажется на доверии к вашему сайту.&lt;/p&gt;&lt;h2&gt;Хорошее решение&lt;/h2&gt;&lt;p&gt;Во многих смартфонах, в том числе iPhone, эту проблему решили следующим способом - заменять введенный символ на звездочку через одну/две секунды после ввода.Вы можете видеть что вводите, но не видите весь пароль. Это обеспечивают обратную связь для пользователя и, вместе с тем, сохраняет пароль в безопасности. Есть только одна проблема - в современных браузерах нет такого функционала. Значит, надо добавить его с помощью JavaScript.&lt;/p&gt;&lt;p&gt;&lt;img src="http://kron0s.com/demo/iphone-password/iphone-password.jpg"&gt;&lt;/p&gt;&lt;h2&gt;Как сделать на вашем сайте&lt;/h2&gt;&lt;p&gt;Как сделать удобный ввод пароля используя только Javascript и CSS?&lt;/p&gt;&lt;p&gt;1. Добавить стандартный тэг input с type=text вместо type=password.&lt;/p&gt;&lt;p&gt;2. Добавить скрытое поле с реальным паролем, куда JavaScript будет копировать введенные пользователем символы.&lt;/p&gt;&lt;p&gt;3. Когда пользователь отправляет форму, отправить имя пользователя и поле с настоящим паролем, и убрав поле со спрятанным паролем (так как он будет содержать только звездочки).&lt;/p&gt;&lt;p&gt;Решение на jQuery&lt;/p&gt;&lt;p&gt;Как использовать:&lt;/p&gt;&lt;pre class="html4strict" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;&lt;&lt;span style="color: #000000; font-weight: bold;"&gt;input&lt;/span&gt; &lt;span style="color: #000066;"&gt;id&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"password"&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"password"&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;/&lt;/span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;&lt;&lt;span style="color: #000000; font-weight: bold;"&gt;script&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"text/javascript"&lt;/span&gt; &lt;span style="color: #000066;"&gt;src&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"/js/jquery.js"&lt;/span&gt;&gt;&lt;&lt;span style="color: #66cc66;"&gt;/&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;script&lt;/span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;&lt;&lt;span style="color: #000000; font-weight: bold;"&gt;script&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"text/javascript"&lt;/span&gt; &lt;span style="color: #000066;"&gt;src&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"/js/jQuery.dPassword.js"&lt;/span&gt;&gt;&lt;&lt;span style="color: #66cc66;"&gt;/&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;script&lt;/span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;&lt;&lt;span style="color: #000000; font-weight: bold;"&gt;script&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"text/javascript"&lt;/span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;$(document).ready( function() {&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;    $('#password').dPassword(); &lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;});&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;&lt;&lt;span style="color: #66cc66;"&gt;/&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;script&lt;/span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;&lt;script type="text/javascript" src="http://kron0s.com/demo/iphone-password/jquery.js"&gt;&lt;/script&gt;&lt;br&gt;&lt;script type="text/javascript" src="http://kron0s.com/demo/iphone-password/jQuery.dPassword.js"&gt;&lt;/script&gt;&lt;br&gt;&lt;/p&gt;&lt;div style="background: #E6EDF0; padding: 10px;"&gt;&lt;p&gt;&lt;label for="password"&gt;Введите что-нибудь:&lt;/label&gt;&lt;br&gt; &lt;br&gt;	&lt;input id="password" type="password" style="width: 450px; font-size: 20px; margin-right: 10px;"&gt;&lt;br&gt;	&lt;a href="#" id="show_password"&gt;Показать пароль&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;script type="text/javascript"&gt;jQuery(document).ready( function() {jQuery('#password').dPassword({interval:100,duration:1000});jQuery('#show_password').click( function() {alert('Пароль: '+jQuery('#password').val());return false;});});&lt;/script&gt;&lt;/p&gt;&lt;p&gt;Параметры конфигурации&lt;/p&gt;&lt;dl&gt;&lt;p&gt;&lt;dt&gt;interval&lt;/dt&gt;&lt;br&gt;&lt;dd&gt;Временной интервал между проверками новых символов&lt;/dd&gt;&lt;br&gt;&lt;dt&gt;duration&lt;/dt&gt;&lt;br&gt;&lt;dd&gt;Время, по истечению которого символ будет спрятан&lt;/dd&gt;&lt;br&gt;&lt;dt&gt;replacement&lt;/dt&gt;&lt;br&gt;&lt;dd&gt;Символ для замены, по умолчанию: %u25CF&lt;/dd&gt;&lt;br&gt;&lt;dt&gt;prefix&lt;/dt&gt;&lt;br&gt;&lt;dd&gt;Префикс генерируемого тэга input. По умолчанию - password_.&lt;/dd&gt;&lt;br&gt;&lt;dt&gt;debug&lt;/dt&gt;&lt;br&gt;&lt;dd&gt;Для отладки. Должен быть установлен и включен FireBug&lt;/dd&gt;&lt;br&gt;&lt;/p&gt;&lt;/dl&gt;&lt;h2&gt;Готово!&lt;/h2&gt;&lt;p&gt;Это решение проблемы? По большей части - да. Это золотая середина между полным сокрытием пароля и тем, чтобы не скрывать его вовсе. Эксперт по безопасности Bruce Schneier назвал такое решение в Blackberry/iPhone "отличным компромиссом".&lt;/p&gt;&lt;p&gt;Однако, это не работает в старых браузерах, или при отключенном JavaScript. Идеальным решением была бы реализация такого функционала на уровне браузера.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yFvSKO_xwPXCA_WBAIHVrNAMU_g/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yFvSKO_xwPXCA_WBAIHVrNAMU_g/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yFvSKO_xwPXCA_WBAIHVrNAMU_g/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yFvSKO_xwPXCA_WBAIHVrNAMU_g/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=hwi_Sjva2ZU:6WKfTMA4tu0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=hwi_Sjva2ZU:6WKfTMA4tu0:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=hwi_Sjva2ZU:6WKfTMA4tu0:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=hwi_Sjva2ZU:6WKfTMA4tu0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=hwi_Sjva2ZU:6WKfTMA4tu0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=hwi_Sjva2ZU:6WKfTMA4tu0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=hwi_Sjva2ZU:6WKfTMA4tu0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=hwi_Sjva2ZU:6WKfTMA4tu0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/kron0s/atom/~4/hwi_Sjva2ZU" height="1" width="1"/&gt;</content><feedburner:origLink>http://blog.kron0s.com/iphone-password</feedburner:origLink></entry><entry><title>Drag-n-drop в HTML5</title><link rel="alternate" href="http://feedproxy.google.com/~r/kron0s/atom/~3/I_u_1JdLif4/drag-n-drop-in-html5" /><link rel="edit" href="http://blog.kron0s.com/drag-n-drop-in-html5/atom" /><author><name>kron0s</name><uri>http://blog.kron0s.com</uri></author><id>tag:blog.kron0s.com,2011:drag-n-drop-в-html5/1298909760</id><updated>2011-03-01T13:55:40+05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-01T13:56:13+05:00</app:edited><published>2011-03-01T13:55:40+05:00</published><category term="html5" /><category term="drag-n-drop" /><content type="html">&lt;link rel="stylesheet" href="http://kron0s.com/demo/dnd/style.css"&gt;&lt;h2&gt;Введение&lt;/h2&gt;&lt;p&gt;Долгое время для того чтобы упростить создание сложных элементов пользовательского интерфейса, с применением анимации, скругленных углов или drag-n-drop, использовались jQuery, Dojo и им подобные библиотеки. И это, безусловно, удобно для создания сложных web-приложений.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd"&gt;Drag-n-drop&lt;/a&gt; теперь есть в HTML5. Спецификация определяет событийный механизм, JavaScript API и дополнительные элементы разметки, позволяя таскать по странице любой ее элемент. Я не думаю, что кто-то будет против поддержки drag-n-drop на уровне браузера. Поддержка браузерами drag-n-drop приведет к созданию более быстрых, "отзывчивых" web-приложений.&lt;/p&gt;&lt;p&gt;&lt;!--more--&gt;&lt;br&gt;&lt;/p&gt;&lt;h3&gt;Есть ли поддержка в браузере?&lt;/h3&gt;&lt;p&gt;Многим приложениям внезапно отключившийся drag-n-drop может очень повредить. Например, представьте что рисунки фигурок в шахматах не двигаются. Упс! Очень важно выяснить поддерживает ли браузер пользователя drag-n-drop (да, вообщем-то, и любой другой используемый функционал). Если drag-n-drop недоступен, следует вернуться к использованию какой-либо JS библиотеки.&lt;/p&gt;&lt;p&gt;Если вы используете API, проверяйте поддержку функционала с помощью библиотек, а не по User-Aget`у. Одна из лучших библиотек для этого называется &lt;a href="http://www.modernizr.com/"&gt;Modernizr&lt;/a&gt;. Modernizr имеет логическое свойство на каждый проверяемый функционал. Таким образом, проверка на поддержку drag-n-drop выглядит следующим образом:&lt;/p&gt;&lt;pre class="javascript" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;Modernizr.&lt;span style="color: #660066;"&gt;draganddrop&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// браузер поддерживает drag-n-drop HTML5 &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #006600; font-style: italic;"&gt;// не поддерживает, нужно использовать JS библиотеку, как раньше&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h2&gt;Создание перетаскиваемых элементов&lt;/h2&gt;&lt;p&gt;Сделать элемент перетаскиваемым очень просто. Достаточно добавить атрибут draggable=true. Перетаскивать можно что угодно - рисунки, ссылки, вообщем, любые узлы DOM.&lt;/p&gt;&lt;p&gt;Давайте, в качестве примера, сделаем перетаскиваемые колонки. Разметка:&lt;/p&gt;&lt;pre class="html4strict" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;&lt;&lt;span style="color: #000000; font-weight: bold;"&gt;div&lt;/span&gt; &lt;span style="color: #000066;"&gt;id&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"columns"&lt;/span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;&lt;&lt;span style="color: #000000; font-weight: bold;"&gt;div&lt;/span&gt; &lt;span style="color: #000066;"&gt;class&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"column"&lt;/span&gt; draggable&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"true"&lt;/span&gt;&gt;&lt;header&gt;&lt;/span&gt;A&lt;span style="color: #009900;"&gt;&lt;&lt;span style="color: #66cc66;"&gt;/&lt;/span&gt;header&gt;&lt;&lt;span style="color: #66cc66;"&gt;/&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;div&lt;/span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;&lt;&lt;span style="color: #000000; font-weight: bold;"&gt;div&lt;/span&gt; &lt;span style="color: #000066;"&gt;class&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"column"&lt;/span&gt; draggable&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"true"&lt;/span&gt;&gt;&lt;header&gt;&lt;/span&gt;B&lt;span style="color: #009900;"&gt;&lt;&lt;span style="color: #66cc66;"&gt;/&lt;/span&gt;header&gt;&lt;&lt;span style="color: #66cc66;"&gt;/&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;div&lt;/span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;&lt;&lt;span style="color: #000000; font-weight: bold;"&gt;div&lt;/span&gt; &lt;span style="color: #000066;"&gt;class&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"column"&lt;/span&gt; draggable&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"true"&lt;/span&gt;&gt;&lt;header&gt;&lt;/span&gt;C&lt;span style="color: #009900;"&gt;&lt;&lt;span style="color: #66cc66;"&gt;/&lt;/span&gt;header&gt;&lt;&lt;span style="color: #66cc66;"&gt;/&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;div&lt;/span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;&lt;&lt;span style="color: #66cc66;"&gt;/&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;div&lt;/span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Стоит отметить, что в большинстве браузеров такие элементы, как выделенный текст, ссылки и рисунки, можно перемещать по умолчанию. К примеру, ухватив за логотип гугла на google.com, получим вот такое полупрозрачное изображение:&lt;/p&gt;&lt;center&gt;&lt;p&gt;&lt;img src="http://kron0s.com/demo/dnd/img_drag.png" alt="Многие браузеры поддерживают перетаскивание рисунков по умолчанию." title="Многие браузеры поддерживают перетаскивание рисунков по умолчанию."&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Многие браузеры поддерживают перетаскивание рисунков по умолчанию.&lt;/p&gt;&lt;/center&gt;&lt;p&gt;которое можно бросить на адресную строку, в тэг input или, даже, на рабочий стол. Используя drag-n-drop HTML5, можно добавить этот функционал любому элементу.&lt;/p&gt;&lt;p&gt;Используя немного CSS3 можно сделать наши колонки чуть красивее и удобнее. Добавим курсор: он показывает пользователю, что элемент может быть перемещен.&lt;/p&gt;&lt;pre class="css" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;style&lt;span style="color: #00AA00;"&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #808080; font-style: italic;"&gt;/* не разрешаем выделять перетаскиваемые элементы */&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #00AA00;"&gt;[&lt;/span&gt;draggable&lt;span style="color: #00AA00;"&gt;]&lt;/span&gt; &lt;span style="color: #00AA00;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  -moz-user-select&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #993333;"&gt;none&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  -khtml-user-select&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #993333;"&gt;none&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  -webkit-user-select&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #993333;"&gt;none&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  user-select&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #993333;"&gt;none&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #00AA00;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #6666ff;"&gt;.column&lt;/span&gt; &lt;span style="color: #00AA00;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000000; font-weight: bold;"&gt;height&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #933;"&gt;150px&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000000; font-weight: bold;"&gt;width&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #933;"&gt;150px&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000000; font-weight: bold;"&gt;float&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;left&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000000; font-weight: bold;"&gt;border&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #933;"&gt;2px&lt;/span&gt; &lt;span style="color: #993333;"&gt;solid&lt;/span&gt; &lt;span style="color: #cc00cc;"&gt;#666666&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000000; font-weight: bold;"&gt;background-color&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #cc00cc;"&gt;#ccc&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000000; font-weight: bold;"&gt;margin-right&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #933;"&gt;5px&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  -webkit-border-radius&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #933;"&gt;10px&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  -moz-border-radius&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #933;"&gt;10px&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  border-radius&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #933;"&gt;10px&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  -webkit-box-shadow&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #993333;"&gt;inset&lt;/span&gt; 0 0 &lt;span style="color: #933;"&gt;3px&lt;/span&gt; &lt;span style="color: #cc00cc;"&gt;#000&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  box-shadow&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #993333;"&gt;inset&lt;/span&gt; 0 0 &lt;span style="color: #933;"&gt;3px&lt;/span&gt; &lt;span style="color: #cc00cc;"&gt;#000&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000000; font-weight: bold;"&gt;text-align&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #993333;"&gt;center&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000000; font-weight: bold;"&gt;cursor&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; move&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #00AA00;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #6666ff;"&gt;.column&lt;/span&gt; header &lt;span style="color: #00AA00;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000000; font-weight: bold;"&gt;color&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #cc00cc;"&gt;#fff&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000000; font-weight: bold;"&gt;text-shadow&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #cc00cc;"&gt;#000&lt;/span&gt; 0 &lt;span style="color: #933;"&gt;1px&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  box-shadow&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #933;"&gt;5px&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000000; font-weight: bold;"&gt;padding&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #933;"&gt;5px&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000000; font-weight: bold;"&gt;background&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; -moz-linear-gradient&lt;span style="color: #00AA00;"&gt;(&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;left&lt;/span&gt; &lt;span style="color: #993333;"&gt;center&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt; &lt;span style="color: #993333;"&gt;rgb&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;(&lt;/span&gt;0&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt;0&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt;0&lt;span style="color: #00AA00;"&gt;)&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt; &lt;span style="color: #993333;"&gt;rgb&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;(&lt;/span&gt;79&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt;79&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt;79&lt;span style="color: #00AA00;"&gt;)&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt; &lt;span style="color: #993333;"&gt;rgb&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;(&lt;/span&gt;21&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt;21&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt;21&lt;span style="color: #00AA00;"&gt;)&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;)&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000000; font-weight: bold;"&gt;background&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; -webkit-gradient&lt;span style="color: #00AA00;"&gt;(&lt;/span&gt;linear&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;left&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;top&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;right&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;top&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;                               color-stop&lt;span style="color: #00AA00;"&gt;(&lt;/span&gt;0&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt; &lt;span style="color: #993333;"&gt;rgb&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;(&lt;/span&gt;0&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt;0&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt;0&lt;span style="color: #00AA00;"&gt;)&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;)&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;                               color-stop&lt;span style="color: #00AA00;"&gt;(&lt;/span&gt;0.50&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt; &lt;span style="color: #993333;"&gt;rgb&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;(&lt;/span&gt;79&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt;79&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt;79&lt;span style="color: #00AA00;"&gt;)&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;)&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;                               color-stop&lt;span style="color: #00AA00;"&gt;(&lt;/span&gt;1&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt; &lt;span style="color: #993333;"&gt;rgb&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;(&lt;/span&gt;21&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt;21&lt;span style="color: #00AA00;"&gt;,&lt;/span&gt;21&lt;span style="color: #00AA00;"&gt;)&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;)&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;)&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000000; font-weight: bold;"&gt;border-bottom&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #933;"&gt;1px&lt;/span&gt; &lt;span style="color: #993333;"&gt;solid&lt;/span&gt; &lt;span style="color: #cc00cc;"&gt;#ddd&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  -webkit-border-top-left-radius&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #933;"&gt;10px&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  -moz-border-radius-topleft&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #933;"&gt;10px&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  border-top-left-radius&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #933;"&gt;10px&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  -webkit-border-top-right-radius&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #933;"&gt;10px&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  -moz-border-radius-topright&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #933;"&gt;10px&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  border-top-right-radius&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #933;"&gt;10px&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #00AA00;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;/style&lt;span style="color: #00AA00;"&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Результат (только таскаются, ничего больше):&lt;/p&gt;&lt;div id="columns"&gt;&lt;div class="column" draggable="true"&gt;&lt;header&gt;&lt;p&gt;A&lt;/header&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="column" draggable="true"&gt;&lt;header&gt;&lt;p&gt;B&lt;/header&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="column" draggable="true"&gt;&lt;header&gt;&lt;p&gt;C&lt;/header&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Большинство браузеров, при перетаскивании в примере выше, создадут полупрозрачный рисунок. Но не все, к примеру, для Firefox требуются дополнительный код. Дальше мы сделаем наш пример более интересным, добавив перехватчики событий.&lt;/p&gt;&lt;h2&gt;Ловим событие перетаскивания&lt;/h2&gt;&lt;p&gt;Вот список событий, которые позволяют отслеживать процесс драг-н-дропа:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;dragstart&lt;/li&gt;
&lt;li&gt;drag&lt;/li&gt;
&lt;li&gt;dragenter&lt;/li&gt;
&lt;li&gt;dragleave&lt;/li&gt;
&lt;li&gt;dragover&lt;/li&gt;
&lt;li&gt;drop&lt;/li&gt;
&lt;li&gt;dragend&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Заметьте, что источники этих событий разные: это может быть и сам элемент (когда его перетаскивают), элемент над которым перетаскивают и элемент в котором бросают. Это может быть рисунок, ссылка, файл, кусок HTML, да что угодно. Элемент, в который бросают другой, может задавать тип принимаемых данных. Имейте в виду, что не все элементы могут быть принимающими (например рисунки не могут).&lt;/p&gt;&lt;h3&gt;1. Начинаем перетаскивать&lt;/h3&gt;&lt;p&gt;После того как мы добавили атрибут draggable="true", назначим обработчик события dragstart каждому элементу.&lt;/p&gt;&lt;p&gt;Этот код будет делать перетаскиваемый элемент на 40% прозрачнее:&lt;/p&gt;&lt;pre class="javascript" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; handleDragStart&lt;span style="color: #009900;"&gt;(&lt;/span&gt;e&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #660066;"&gt;style&lt;/span&gt;.&lt;span style="color: #660066;"&gt;opacity&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'0.4'&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #006600; font-style: italic;"&gt;// this/e.target перетаскиваемый элемент&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; cols &lt;span style="color: #339933;"&gt;=&lt;/span&gt; document.&lt;span style="color: #660066;"&gt;querySelectorAll&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#columns .column'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;.&lt;span style="color: #660066;"&gt;forEach&lt;/span&gt;.&lt;span style="color: #660066;"&gt;call&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;cols&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;col&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  col.&lt;span style="color: #660066;"&gt;addEventListener&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'dragstart'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; handleDragStart&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Результат:&lt;/p&gt;&lt;div id="columns-dragStart"&gt;&lt;div class="column"&gt;&lt;header&gt;&lt;p&gt;A&lt;/header&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="column"&gt;&lt;header&gt;&lt;p&gt;B&lt;/header&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="column"&gt;&lt;header&gt;&lt;p&gt;C&lt;/header&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;После события dragstart, его источник станет на 40% прозрачнее, что очень хорошо для создания обратной связи, т.о. пользователь видит, какой элемент он двигает. Теперь надо сделать его не прозрачным, после того, как он будет брошен. Вполне логично, что это делается в обработчике события dragend. Но об этом чуть позже.&lt;/p&gt;&lt;h3&gt;2. dragenter, dragover и dragleave&lt;/h3&gt;&lt;p&gt;События dragenter, dragover и dragleave можно использовать для того, чтобы сделать процесс переноса более наглядным и красивым. Например, можно добавить рамку тому элементу, над которым происходит перетаскивание. Это позволит пользователям увидеть, где можно бросить элемент.&lt;/p&gt;&lt;pre class="css" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;style&lt;span style="color: #00AA00;"&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #6666ff;"&gt;.column&lt;/span&gt;&lt;span style="color: #6666ff;"&gt;.over&lt;/span&gt; &lt;span style="color: #00AA00;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000000; font-weight: bold;"&gt;border&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;:&lt;/span&gt; &lt;span style="color: #933;"&gt;2px&lt;/span&gt; &lt;span style="color: #993333;"&gt;dashed&lt;/span&gt; &lt;span style="color: #cc00cc;"&gt;#000&lt;/span&gt;&lt;span style="color: #00AA00;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #00AA00;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;/style&lt;span style="color: #00AA00;"&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;pre class="javascript" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; handleDragStart&lt;span style="color: #009900;"&gt;(&lt;/span&gt;e&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #660066;"&gt;style&lt;/span&gt;.&lt;span style="color: #660066;"&gt;opacity&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'0.4'&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #006600; font-style: italic;"&gt;// this/e.target перетаскиваемый элемент&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; handleDragOver&lt;span style="color: #009900;"&gt;(&lt;/span&gt;e&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;e.&lt;span style="color: #660066;"&gt;preventDefault&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;    e.&lt;span style="color: #660066;"&gt;preventDefault&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #006600; font-style: italic;"&gt;// Обязательно. Позволяет "бросать" элемент.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  e.&lt;span style="color: #660066;"&gt;dataTransfer&lt;/span&gt;.&lt;span style="color: #660066;"&gt;dropEffect&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'move'&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #006600; font-style: italic;"&gt;// смотри часть про DataTransfer.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #660066;"&gt;addClassName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'over'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; handleDragEnter&lt;span style="color: #009900;"&gt;(&lt;/span&gt;e&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #006600; font-style: italic;"&gt;// this/e.target элемент над которым перетаскивают что-то&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #660066;"&gt;addClassName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'over'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; handleDragLeave&lt;span style="color: #009900;"&gt;(&lt;/span&gt;e&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #660066;"&gt;removeClassName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'over'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #006600; font-style: italic;"&gt;// this/e.target элемент над которым закончили перетаскивать&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; cols &lt;span style="color: #339933;"&gt;=&lt;/span&gt; document.&lt;span style="color: #660066;"&gt;querySelectorAll&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#columns .column'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;.&lt;span style="color: #660066;"&gt;forEach&lt;/span&gt;.&lt;span style="color: #660066;"&gt;call&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;cols&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;col&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  col.&lt;span style="color: #660066;"&gt;addEventListener&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'dragstart'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; handleDragStart&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  col.&lt;span style="color: #660066;"&gt;addEventListener&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'dragenter'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; handleDragEnter&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  col.&lt;span style="color: #660066;"&gt;addEventListener&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'dragover'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; handleDragOver&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  col.&lt;span style="color: #660066;"&gt;addEventListener&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'dragleave'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; handleDragLeave&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Три места в коде, на которые стоит обратить внимание:&lt;br&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;this/e.target различаются, в зависимости от события.&lt;/li&gt;

&lt;li&gt;В случае перетаскивания чего-нибудь вроде ссылки, надо запретить браузеру переходить по ней. Для этого надо вызвать e.preventDefault() в обработчике события. Либо вернуть false. Разные браузеры по разному реализуют это, но если использовать и то и другое - вреда не будет.&lt;/li&gt;

&lt;li&gt;Для переключения класса "over" используется событие dragenter, а не dragover. Если использовать dragover, обработчик будет вызываться очень много раз. Что очень не хорошо. &lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Функции для добавления, удаления, переключения CSS классов:&lt;/p&gt;&lt;pre class="javascript" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;Element.&lt;span style="color: #660066;"&gt;prototype&lt;/span&gt;.&lt;span style="color: #660066;"&gt;hasClassName&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;new&lt;/span&gt; RegExp&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"(?:^|&lt;span style="color: #000099; font-weight: bold;"&gt;\\&lt;/span&gt;s+)"&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"(?:&lt;span style="color: #000099; font-weight: bold;"&gt;\\&lt;/span&gt;s+|$)"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;test&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #660066;"&gt;className&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;Element.&lt;span style="color: #660066;"&gt;prototype&lt;/span&gt;.&lt;span style="color: #660066;"&gt;addClassName&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #339933;"&gt;!&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #660066;"&gt;hasClassName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;    &lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #660066;"&gt;className&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #660066;"&gt;className&lt;/span&gt; &lt;span style="color: #339933;"&gt;?&lt;/span&gt; &lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #660066;"&gt;className&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;.&lt;span style="color: #660066;"&gt;join&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;' '&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;Element.&lt;span style="color: #660066;"&gt;prototype&lt;/span&gt;.&lt;span style="color: #660066;"&gt;removeClassName&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #660066;"&gt;hasClassName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;    &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; c &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #660066;"&gt;className&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;    &lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #660066;"&gt;className&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; c.&lt;span style="color: #660066;"&gt;replace&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;new&lt;/span&gt; RegExp&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"(?:^|&lt;span style="color: #000099; font-weight: bold;"&gt;\\&lt;/span&gt;s+)"&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"(?:&lt;span style="color: #000099; font-weight: bold;"&gt;\\&lt;/span&gt;s+|$)"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"g"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;""&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Подсказка: вместо определения таких вот дополнительных функций или использования таких библиотек, как jQuery, вы можете воспользоваться &lt;a href="https://developer.mozilla.org/en/DOM/element.classList"&gt;Element.classList API&lt;/a&gt;, который уже поддерживается последними сборками FF, WebKit и Chromium.&lt;/p&gt;&lt;h3&gt;3. Бросаем&lt;/h3&gt;&lt;p&gt;Для обработки процесса бросания элемента, надо назначить обработчик событий drop и dragend. В нем надо отменить поведение браузера по умолчанию, т.к. это может быть переход на другую страницу. Вы можете остановить дальнейшую обработку события вызвав e.stopPropagation().&lt;/p&gt;&lt;p&gt;Обработчики этих событий довольно малы, в drop больше ничего не происходит, а в dragend удаляется класс 'over' из всех колонок:&lt;/p&gt;&lt;pre class="javascript" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;...&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; handleDrop&lt;span style="color: #009900;"&gt;(&lt;/span&gt;e&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #006600; font-style: italic;"&gt;// this / e.target это элемент куда "бросают".&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;e.&lt;span style="color: #660066;"&gt;stopPropagation&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;    e.&lt;span style="color: #660066;"&gt;stopPropagation&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #006600; font-style: italic;"&gt;// чтобы браузер не делал редирект.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #006600; font-style: italic;"&gt;// смотри часть про DataTransfer.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; handleDragEnd&lt;span style="color: #009900;"&gt;(&lt;/span&gt;e&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #006600; font-style: italic;"&gt;// this/e.target это источник события.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;.&lt;span style="color: #660066;"&gt;forEach&lt;/span&gt;.&lt;span style="color: #660066;"&gt;call&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;cols&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;col&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;    col.&lt;span style="color: #660066;"&gt;removeClassName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'over'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; cols &lt;span style="color: #339933;"&gt;=&lt;/span&gt; document.&lt;span style="color: #660066;"&gt;querySelectorAll&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#columns .column'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;.&lt;span style="color: #660066;"&gt;forEach&lt;/span&gt;.&lt;span style="color: #660066;"&gt;call&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;cols&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;col&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  col.&lt;span style="color: #660066;"&gt;addEventListener&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'dragstart'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; handleDragStart&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  col.&lt;span style="color: #660066;"&gt;addEventListener&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'dragenter'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; handleDragEnter&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  col.&lt;span style="color: #660066;"&gt;addEventListener&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'dragover'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; handleDragOver&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  col.&lt;span style="color: #660066;"&gt;addEventListener&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'dragleave'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; handleDragLeave&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  col.&lt;span style="color: #660066;"&gt;addEventListener&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'drop'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; handleDrop&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  col.&lt;span style="color: #660066;"&gt;addEventListener&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'dragend'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; handleDragEnd&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Результат:&lt;/p&gt;&lt;div id="columns-dragEnd"&gt;&lt;div class="column"&gt;&lt;header&gt;&lt;p&gt;A&lt;/header&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="column"&gt;&lt;header&gt;&lt;p&gt;B&lt;/header&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="column"&gt;&lt;header&gt;&lt;p&gt;C&lt;/header&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Как вы можете заметить наш пример все еще не обрабатывает бросание элемента. Добавим объект DataTransfer.&lt;/p&gt;&lt;h2&gt;Объект DataTransfer&lt;/h2&gt;&lt;p&gt;В свойстве dataTransfer вся магия drag-n-drop. В нем храниться данные отсылаемые в процессе перетаскивания. dataTransfer задается в событии dragset и используется в событии drop. Вызов e.dataTransfer.setData(format, data) устанавливает mimetype и данные нужные для перетаскивания.&lt;/p&gt;&lt;p&gt;В нашем примере, мы сохраняем исходный код перетаскиваемого элемента:&lt;/p&gt;&lt;pre class="javascript" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; dragSrcEl &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; handleDragStart&lt;span style="color: #009900;"&gt;(&lt;/span&gt;e&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #006600; font-style: italic;"&gt;// this это перетаскиваемый элемент&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #660066;"&gt;style&lt;/span&gt;.&lt;span style="color: #660066;"&gt;opacity&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'0.4'&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  dragSrcEl &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  e.&lt;span style="color: #660066;"&gt;dataTransfer&lt;/span&gt;.&lt;span style="color: #660066;"&gt;effectAllowed&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'move'&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  e.&lt;span style="color: #660066;"&gt;dataTransfer&lt;/span&gt;.&lt;span style="color: #660066;"&gt;setData&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'text/html'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #660066;"&gt;innerHTML&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Свойство dataTransfer имеет функцию getData(format) для получения сохраненных данных. Изменим процесс бросания элемента:&lt;/p&gt;&lt;pre class="javascript" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; handleDrop&lt;span style="color: #009900;"&gt;(&lt;/span&gt;e&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #006600; font-style: italic;"&gt;// this/e.target - перетаскиваемый элемент&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;e.&lt;span style="color: #660066;"&gt;stopPropagation&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;    e.&lt;span style="color: #660066;"&gt;stopPropagation&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #006600; font-style: italic;"&gt;// отменяет переход по ссылке&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #006600; font-style: italic;"&gt;// Если ничего не перетащили - ничего не делаем.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;dragSrcEl &lt;span style="color: #339933;"&gt;!=&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;    &lt;span style="color: #006600; font-style: italic;"&gt;// изменяем исходный код элементов&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;    dragSrcEl.&lt;span style="color: #660066;"&gt;innerHTML&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #660066;"&gt;innerHTML&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;    &lt;span style="color: #000066; font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: #660066;"&gt;innerHTML&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; e.&lt;span style="color: #660066;"&gt;dataTransfer&lt;/span&gt;.&lt;span style="color: #660066;"&gt;getData&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'text/html'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;В глобальной переменной dragSrcEl храниться перетаскиваемый элемент. В handleDragStart() сохраняется значение этой переменной, а в handleDrop() ее содержимое меняется HTML с колонкой в которую бросают перетаскиваемый элемент.&lt;/p&gt;&lt;p&gt;Результат:&lt;/p&gt;&lt;div id="columns-almostFinal"&gt;&lt;div class="column"&gt;&lt;header&gt;&lt;p&gt;A&lt;/header&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="column"&gt;&lt;header&gt;&lt;p&gt;B&lt;/header&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="column"&gt;&lt;header&gt;&lt;p&gt;C&lt;/header&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3&gt;Параметры перетаскивания&lt;/h3&gt;&lt;p&gt;Свойство dataTransfer предоставляет возможность тонкой настройки отображения процесса переноса.&lt;/p&gt;&lt;p&gt;&lt;b&gt;dataTransfer.effectAllowed&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Эффект, поддерживаемый целевым элементом перетаскивания. Как правило, это значение задается обработчиком события dragstart. Может принимать следующие значения: none, copy, copyLink, copyMove, link, linkMove, move, all и uninitialized.&lt;/p&gt;&lt;p&gt;&lt;b&gt;dataTransfer.dropEffect&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Эффект, выбранный пользователем или целевым элементом.  Может принимать следующие значение: none, copy, link, move.&lt;/p&gt;&lt;p&gt;&lt;b&gt;e.dataTransfer.setDragImage(img element, x, y)&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Вместо того чтобы использовать при перетаскивании полупрозрачную картинку по умолчанию, отобразим свою иконку:&lt;/p&gt;&lt;p&gt;var dragIcon = document.createElement('img');&lt;/p&gt;&lt;p&gt;dragIcon.src = 'logo.png';&lt;/p&gt;&lt;p&gt;dragIcon.width = 100;&lt;/p&gt;&lt;p&gt;e.dataTransfer.setDragImage(dragIcon, -10, -10);&lt;/p&gt;&lt;p&gt;Результат (с логотипом гугла, когда перетаскиваете):&lt;/p&gt;&lt;div id="columns-dragIcon"&gt;&lt;div class="column"&gt;&lt;header&gt;&lt;p&gt;A&lt;/header&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="column"&gt;&lt;header&gt;&lt;p&gt;B&lt;/header&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="column"&gt;&lt;header&gt;&lt;p&gt;C&lt;/header&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2&gt;Перетаскивание файлов&lt;/h2&gt;&lt;p&gt;С помощью drag-n-drop можно перетаскивать файлы с рабочего стола в браузер. По крайней мере Google Chrome поддерживает этот функционал.&lt;/p&gt;&lt;h3&gt;Перетаскивание файлов с рабочего стола в браузер&lt;/h3&gt;&lt;p&gt;Перетаскивание файлов происходит почти так же, как и обычный drag-n-drop. Отличие только в обработке бросания файлов. Вместо использования dataTransfer.getData(), данные о файлах хранятся в dataTransfer.files:&lt;/p&gt;&lt;pre class="javascript" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; handleDrop&lt;span style="color: #009900;"&gt;(&lt;/span&gt;e&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  e.&lt;span style="color: #660066;"&gt;stopPropagation&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #006600; font-style: italic;"&gt;// останавливаем дальнейшую передачу события&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  e.&lt;span style="color: #660066;"&gt;preventDefault&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; files &lt;span style="color: #339933;"&gt;=&lt;/span&gt; e.&lt;span style="color: #660066;"&gt;dataTransfer&lt;/span&gt;.&lt;span style="color: #660066;"&gt;files&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066; font-weight: bold;"&gt;for&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; i &lt;span style="color: #339933;"&gt;=&lt;/span&gt; 0&lt;span style="color: #339933;"&gt;,&lt;/span&gt; f&lt;span style="color: #339933;"&gt;;&lt;/span&gt; f &lt;span style="color: #339933;"&gt;=&lt;/span&gt; files&lt;span style="color: #009900;"&gt;[&lt;/span&gt;i&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; i&lt;span style="color: #339933;"&gt;++&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;    &lt;span style="color: #006600; font-style: italic;"&gt;// читаем объекты File из FileList&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;О том как использовать drag-n-drop для перетаскивания файлов в браузер, подробно написано в статье &lt;a href="http://www.html5rocks.com/tutorials/file/dndfiles/"&gt;"Reading local files in JavaScript"&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Перетаскивание из браузера на рабочий стол&lt;/h3&gt;&lt;p&gt;Для того разобраться, как перетаскивать файлы на рабочий стол, смотрите &lt;a href="http://www.thecssninja.com/javascript/gmail-dragout"&gt;"Drag out files like Gmail"&lt;/a&gt; от CSS Ninja.&lt;/p&gt;&lt;h2&gt;Окончательный пример&lt;/h2&gt;&lt;p&gt;Конечный вариант, немного измененный и со счетчиком перемещений:&lt;/p&gt;&lt;div id="columns-full"&gt;&lt;div class="column"&gt;&lt;header&gt;&lt;p&gt;A&lt;/header&gt;&lt;/p&gt;&lt;div class="count" data-col-moves="0"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="column"&gt;&lt;header&gt;&lt;p&gt;B&lt;/header&gt;&lt;/p&gt;&lt;div class="count" data-col-moves="0"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="column"&gt;&lt;header&gt;&lt;p&gt;C&lt;/header&gt;&lt;/p&gt;&lt;div class="count" data-col-moves="0"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="column"&gt;&lt;header&gt;&lt;p&gt;D&lt;/header&gt;&lt;/p&gt;&lt;div class="count" data-col-moves="0"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Самое интересное, что все колонки являются одновременно и перетаскиваемыми элементами и местами, куда можно перетащить. Обычно делается несколько по другому. Примеры можно посмотреть на &lt;a href="http://html5demos.com/drag"&gt;html5demos.com/drag&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Заключение&lt;/h2&gt;&lt;p&gt;Бесспорно, модель drag-n-drop в HTML5 является более сложной, по сравнению с тем же jQuery UI. Однако, если вы можете использовать встроенный в браузер функционал - используйте его! В конце концов, это же и есть цель HTML5, стандартизировать возможности для разработки сложных приложений в браузере. Думаю, популярные библиотеки со временем включат в свой состав поддержку встроенной реализации браузером drag-n-drop.&lt;/p&gt;&lt;p&gt;Ссылки&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd"&gt;Спецификация drag-n-drop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/En/DragDrop/Drag_Operations"&gt;"Drag Operations"&lt;/a&gt; от MDC&lt;/li&gt;
&lt;li&gt;&lt;a href="http://html5doctor.com/native-drag-and-drop/"&gt;"Native Drag and Drop"&lt;/a&gt; статья на html5doctor&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.thecssninja.com/javascript/gmail-dragout"&gt;"Drag out files like Gmail"&lt;/a&gt; от CSS Ninja&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.html5rocks.com/tutorials/dnd/basics/"&gt;оригинал (engl)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;script src="http://kron0s.com/demo/dnd/modernizr-1.7.min.js"&gt;&lt;/script&gt;&lt;br&gt;&lt;script src="http://kron0s.com/demo/dnd/js.js"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4NyFla-Sf-h1O_Ns4WjchVL9a54/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4NyFla-Sf-h1O_Ns4WjchVL9a54/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4NyFla-Sf-h1O_Ns4WjchVL9a54/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4NyFla-Sf-h1O_Ns4WjchVL9a54/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=I_u_1JdLif4:i95wd5j0yCg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=I_u_1JdLif4:i95wd5j0yCg:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=I_u_1JdLif4:i95wd5j0yCg:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=I_u_1JdLif4:i95wd5j0yCg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=I_u_1JdLif4:i95wd5j0yCg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=I_u_1JdLif4:i95wd5j0yCg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=I_u_1JdLif4:i95wd5j0yCg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=I_u_1JdLif4:i95wd5j0yCg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/kron0s/atom/~4/I_u_1JdLif4" height="1" width="1"/&gt;</content><feedburner:origLink>http://blog.kron0s.com/drag-n-drop-in-html5</feedburner:origLink></entry><entry><title>Использование jQuery Deferred</title><link rel="alternate" href="http://feedproxy.google.com/~r/kron0s/atom/~3/gk3Wj0VR86c/jquery-deferred" /><link rel="edit" href="http://blog.kron0s.com/jquery-deferred/atom" /><author><name>kron0s</name><uri>http://blog.kron0s.com</uri></author><id>tag:blog.kron0s.com,2011:jquery-deferred/1297496902</id><updated>2011-02-12T12:52:10+05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-12T12:52:55+05:00</app:edited><published>2011-02-12T12:52:10+05:00</published><category term="javascript" /><category term="jquery" /><category term="deferred" /><content type="html">&lt;p&gt;Если вы перешли к &lt;a href="http://blog.jquery.com/2011/01/31/jquery-15-released/"&gt;jQuery 1.5&lt;/a&gt;, то, наверно, уже слышали о новом функционале, позволяющем сделать следующее:&lt;/p&gt;&lt;pre class="javascript" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; jax &lt;span style="color: #339933;"&gt;=&lt;/span&gt; $.&lt;span style="color: #660066;"&gt;ajax&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  url&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'/some/url'&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;jax.&lt;span style="color: #660066;"&gt;success&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066;"&gt;alert&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"Работает!"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;")&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #3366CC;"&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;&lt;!--more--&gt;&lt;br&gt;Эта штука называется Deferred (отложенные вызовы), и она зачастую намного удобнее использования обратных вызовов. Более подробно можно почитать в &lt;a href="http://api.jquery.com/category/deferred-object/"&gt;документации jQuery&lt;/a&gt; или &lt;a href="http://habrahabr.ru/blogs/jquery/113073/"&gt;здесь&lt;/a&gt; на русском. А здесь я приведу несколько практических примеров, как можно использовать этот новый функционал.&lt;/p&gt;&lt;h2&gt;Более удобное использование setTimeout&lt;/h2&gt;&lt;p&gt;Мне никогда не нравилась setTimeout в Javascript. С помощью Deferred можно очень красиво создать таймаут.&lt;/p&gt;&lt;pre class="javascript" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;$.&lt;span style="color: #660066;"&gt;wait&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;time&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; dfd &lt;span style="color: #339933;"&gt;=&lt;/span&gt; $.&lt;span style="color: #660066;"&gt;Deferred&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  setTimeout&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;    dfd.&lt;span style="color: #660066;"&gt;resolve&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; time&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; dfd&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Теперь, благодаря Deferred, можно создать таймер таким образом:&lt;/p&gt;&lt;pre class="javascript" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;$.&lt;span style="color: #660066;"&gt;wait&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;5000&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;then&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066;"&gt;alert&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"Привет из будущего!"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Это совсем небольшой пример, но он показывает как легко писать приложения с отложенными функциями. Следующий пример чуточку сложнее.&lt;/p&gt;&lt;h2&gt;Красивые обертки&lt;/h2&gt;&lt;p&gt;С помощью jQuery можно делать красивые, небольшие обертки для вызова функций API. Я никогда не любил писать много кода для описания обратных вызовов, с помощью Deferred это делается гораздо проще и лучше.&lt;/p&gt;&lt;pre class="javascript" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;Twitter &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  search&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;query&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;    &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; dfr &lt;span style="color: #339933;"&gt;=&lt;/span&gt; $.&lt;span style="color: #660066;"&gt;Deferred&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;    $.&lt;span style="color: #660066;"&gt;ajax&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;      url&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"http://search.twitter.com/search.json"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;      data&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;q&lt;span style="color: #339933;"&gt;:&lt;/span&gt;query&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;      dataType&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'jsonp'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;      success&lt;span style="color: #339933;"&gt;:&lt;/span&gt;dfr.&lt;span style="color: #660066;"&gt;resolve&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;    &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; dfr&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Как теперь можно использовать поиск Twitter в приложении:&lt;/p&gt;&lt;pre class="javascript" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;Twitter.&lt;span style="color: #660066;"&gt;search&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'intridea'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;then&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066;"&gt;alert&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;data.&lt;span style="color: #660066;"&gt;results&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;0&lt;span style="color: #009900;"&gt;]&lt;/span&gt;.&lt;span style="color: #660066;"&gt;text&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h2&gt;Преимущества Deferred&lt;/h2&gt;&lt;p&gt;Почему я использую отложенные вызовы, вместо обратных? Во-первых, можно назначить несколько обратных вызовов, что делает разработку более гибкой. Кроме того они дают другой способ перехвата ошибок. Если ваш запрос провалился, вы можете поймать это следующим образом:&lt;/p&gt;&lt;pre class="javascript" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; doSomething&lt;span style="color: #009900;"&gt;(&lt;/span&gt;arg&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; dfr &lt;span style="color: #339933;"&gt;=&lt;/span&gt; $.&lt;span style="color: #660066;"&gt;Deferred&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  setTimeout&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;    dfr.&lt;span style="color: #660066;"&gt;reject&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"Увы, что-то пошло не так."&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt; dfr&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;doSomething&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"uh oh"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;done&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066;"&gt;alert&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"А здесь мы поймали ошибку!"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#888;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;fail&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;message&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;  &lt;span style="color: #000066;"&gt;alert&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;message&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Deferred это простой и мощный инструмент, который позволит сделать ваш код более чистым, понятным и более функциональным.&lt;/p&gt;&lt;p&gt;&lt;a href="http://intridea.com/2011/2/8/fun-with-jquery-deferred"&gt;оригинал&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FBpYZvvF60PoIo50TF7kP86Vqqk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FBpYZvvF60PoIo50TF7kP86Vqqk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FBpYZvvF60PoIo50TF7kP86Vqqk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FBpYZvvF60PoIo50TF7kP86Vqqk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=gk3Wj0VR86c:0MplYVALSZw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=gk3Wj0VR86c:0MplYVALSZw:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=gk3Wj0VR86c:0MplYVALSZw:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=gk3Wj0VR86c:0MplYVALSZw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=gk3Wj0VR86c:0MplYVALSZw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=gk3Wj0VR86c:0MplYVALSZw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=gk3Wj0VR86c:0MplYVALSZw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=gk3Wj0VR86c:0MplYVALSZw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/kron0s/atom/~4/gk3Wj0VR86c" height="1" width="1"/&gt;</content><feedburner:origLink>http://blog.kron0s.com/jquery-deferred</feedburner:origLink></entry><entry><title>Распространенные ошибки PHP разработчиков при работе с MySQL</title><link rel="alternate" href="http://feedproxy.google.com/~r/kron0s/atom/~3/gXQITUS6bUc/mysql-mistakes-php-developers" /><link rel="edit" href="http://blog.kron0s.com/mysql-mistakes-php-developers/atom" /><author><name>kron0s</name><uri>http://blog.kron0s.com</uri></author><id>tag:blog.kron0s.com,2011:mysql-mistakes-php-developers/1296807928</id><updated>2011-02-04T13:30:24+05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-04T13:30:51+05:00</app:edited><published>2011-02-04T13:30:24+05:00</published><category term="mysql" /><category term="php" /><category term="ошибки-разработчиков" /><content type="html">&lt;p&gt;База данных это основная часть большинства веб-приложений. А если вы используете PHP, то скорее всего вы так же используете и MySQL - часть стандартного LAMP.&lt;/p&gt;&lt;p&gt;Начать писать на PHP довольно просто, многие начинающие разработчики могут написать работающий код через несколько часов после начала изучения. Однако, создание более сложного приложения требует как времени, так и опыта. Дальше приведены десять самых распространенных ошибок, которые я видел, при работе с MySQL (некоторые могут быть в любом языке/базе данных).&lt;/p&gt;&lt;!--more--&gt;&lt;p&gt;1. Использование MyISAM вместо InnoDB&lt;/p&gt;&lt;p&gt;В MySQL можно использовать разные типы таблиц, наиболее распространены MyISAM и InnoDB.&lt;/p&gt;&lt;p&gt;MyISAM используется по умолчанию. Однако, скорее всего это не правильный выбор! MyISAM не поддерживает внешние ключи и транзакции, очень важны для сохранения целостности данных. К тому же, при создании новой записи или редактировании старой, блокируется вся таблица, что может нехорошо сказаться на производительности.&lt;/p&gt;&lt;p&gt;Решение просто - используйте InnoDB.&lt;/p&gt;&lt;p&gt;2. Использование функций mysql вместо mysqli&lt;/p&gt;&lt;p&gt;PHP предоставляет функции библиотеки MySQL с самого начала (или почти с самого, не важно). Многие приложения используют mysql_connect, mysql_query, mysql_fetch_assoc и т.д., но что написано в &lt;a href="http://uk2.php.net/manual/en/mysqli.overview.php"&gt;мануале PHP&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;"If you are using MySQL versions 4.1.3 or later it is strongly recommended that you use the mysqli extension instead."&lt;/p&gt;&lt;p&gt;mysqli, другая библиотека для работы с MySQL (MySQL improved - улучшенная работа с MySQL), имеет следующие преимущества:&lt;/p&gt;&lt;p&gt;объектно-ориентированный интерфейс&lt;/p&gt;&lt;p&gt;подготовленные выражения (prepared statements) (которые помогают предотвратить SQL-инъекции и улучшить производительность)&lt;/p&gt;&lt;p&gt;множественные операторы и поддержка транзакций.&lt;/p&gt;&lt;p&gt;Так же можно использовать &lt;a href="http://uk2.php.net/manual/en/book.pdo.php"&gt;PDO&lt;/a&gt;, если нужна возможность работы с несколькими базами.&lt;/p&gt;&lt;p&gt;3. Не проверяются данные полученные от пользователя&lt;/p&gt;&lt;p&gt;Правило номер 1: &lt;strong&gt;Никогда не доверяйте данным, введенным пользователем&lt;/strong&gt;. Проверяйте все данные, не полагайтесь на JavaScript. Пример простейшей атаки с SQL-инъекцией:&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$username&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$_POST&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"name"&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$password&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$_POST&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"password"&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #000088;"&gt;$sql&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;"SELECT userid FROM usertable WHERE username='&lt;span style="color: #006699; font-weight: bold;"&gt;$username&lt;/span&gt;' AND password='&lt;span style="color: #006699; font-weight: bold;"&gt;$password&lt;/span&gt;';"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// выполняем запрос&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Такой запрос легко сломать - переда в поле username значение “admin'; --”. В результате будет выполнен следующий запрос:&lt;/p&gt;&lt;pre class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="color:#222;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"&gt;SELECT userid FROM usertable WHERE username&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'admin'&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;И хитрый хакер получит доступ к админскому аккаунту, так как проверка пароля будет закомментирована.&lt;/p&gt;&lt;p&gt;4. Не используется UTF-8&lt;/p&gt;&lt;p&gt;Используя CP-1251, KOI-8 и других кодировок, вы забываете о символах из других кодировок, которые используются в других языках, например японский или арабский.&lt;/p&gt;&lt;p&gt;UTF-8 решает многие проблемы с интернационализацией. Хотя нормальной поддержки UTF-8 в PHP не будет до версии 6.0, никто не мешает использовать ее в базе данных.&lt;/p&gt;&lt;p&gt;5. Использование PHP, там где нужна MySQL&lt;/p&gt;&lt;p&gt;Если вы только начинаете работать с MySQL, очень заманчиво использовать возможности языка программирования для решения каких-либо возникающих проблем. Это может привести к ненужному и медленному коду. Например, вместо использования цикла на PHP для расчета среднего значения, нужно воспользоваться функцией MySQL &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_avg"&gt;avg()&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Так же не стоит делать запросы в цикле. Более эффективно сделать запрос и пройтись результату циклом.&lt;/p&gt;&lt;p&gt;В общем, используйте сильные стороны базы данных. Знание SQL сильно поможет в этом.&lt;/p&gt;&lt;p&gt;6. Не оптимизируются запросы&lt;/p&gt;&lt;p&gt;99 проблем из 100 с производительностью PHP вызваны не правильной работой с базой данных и использование не оптимальных запросов. Используйте &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/using-explain.html"&gt;EXPLAIN&lt;/a&gt; перед SELECT для профилирования запроса.&lt;/p&gt;&lt;p&gt;7. Используются неправильные типы данных&lt;/p&gt;&lt;p&gt;MySQL предлагает широкий выбор типов данных: строки, числа, время. Если хотите хранить дату используйте тип DATE или DATETIME. Использование STRING вместо INTEGER сделает запросы более сложными, а иногда и вовсе невыполнимыми.&lt;/p&gt;&lt;p&gt;Часто кажется заманчивым использовать новый формат данных, например, сериализовать PHP объект в строку и сохранить. Хорошо подумайте, так ли это необходимо, и не будет ли потом проблем с кодом и базой.&lt;/p&gt;&lt;p&gt;8. Используются * в запросах&lt;/p&gt;&lt;p&gt;Никогда не используйте * в запросах. Это лень: ведь вам нужно извлечь только необходимы данные. Даже если сейчас вам нужные все поля, таблица может и измениться в будущем.&lt;/p&gt;&lt;p&gt;9. Недостаточное или избыточное индексирование&lt;/p&gt;&lt;p&gt;Общее правило - индексы должны быть созданы на все поля использующиеся в WHERE и JOIN.&lt;/p&gt;&lt;p&gt;К примеру, у нас есть таблица пользователей с полями id (первичный ключ) и email. При входе в систему, MySQL должен найти id соответствующий введенному email. При использовании индекса, MySQL может применить быстрый алгоритм поиска, выдав результат почти мгновенно. Без индекса будет проходиться вся таблица, пока не найдется нужная запись.&lt;/p&gt;&lt;p&gt;Заманчиво добавить индекс к каждой колонке, но они генерируются заново при каждой операции INSERT и UPDATE. Это скажется на производительности; добавляйте индексы только там где они нужны.&lt;/p&gt;&lt;p&gt;10. Не делаются бэкапы&lt;/p&gt;&lt;p&gt;Редко, но базы данных падают. Жесткие диски ломаются. Сервера выходят из строя. Хостинги банкротятся. А потеря данных из вашей базы может стать катастрофой, если вы не делаете регулярные бэкапы.&lt;/p&gt;&lt;p&gt;11. Дополнительно - смотрите и на другие СУБД.&lt;/p&gt;&lt;p&gt;MySQL наиболее широко используемая PHP-разработчиками база данных, но это ведь не единственный вариант. &lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt; и &lt;a href="http://www.firebirdsql.org/"&gt;Firebird&lt;/a&gt; - ближайшие конкуренты MySQL: и та и другая open-source и развиваются сообществом разработчиков. Microsoft предоставляет &lt;a href="http://www.microsoft.com/express/Database/"&gt;SQL Server Express&lt;/a&gt;, Oracle - &lt;a href="http://www.oracle.com/technetwork/database/express-edition/overview/index.html"&gt;10g Express&lt;/a&gt;, оба продукта имеют бесплатную версию. Для маленьких или встраиваемых приложений может быть использована &lt;a href="http://www.sqlite.org/"&gt;SQLite&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;А у вас были эти ошибки?&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.sitepoint.com/2010/11/19/mysql-mistakes-php-developers/"&gt;Оригинал&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zEUJpfIeiCshjuxlGHTP3GdEzVU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zEUJpfIeiCshjuxlGHTP3GdEzVU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zEUJpfIeiCshjuxlGHTP3GdEzVU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zEUJpfIeiCshjuxlGHTP3GdEzVU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=gXQITUS6bUc:YhMCMyvKUOM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=gXQITUS6bUc:YhMCMyvKUOM:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=gXQITUS6bUc:YhMCMyvKUOM:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=gXQITUS6bUc:YhMCMyvKUOM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=gXQITUS6bUc:YhMCMyvKUOM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=gXQITUS6bUc:YhMCMyvKUOM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?i=gXQITUS6bUc:YhMCMyvKUOM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/kron0s/atom?a=gXQITUS6bUc:YhMCMyvKUOM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/kron0s/atom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/kron0s/atom/~4/gXQITUS6bUc" height="1" width="1"/&gt;</content><feedburner:origLink>http://blog.kron0s.com/mysql-mistakes-php-developers</feedburner:origLink></entry></feed>

