<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Разработка &#187; php 5.3</title>
	<atom:link href="http://www.job-blog.bullgare.ru/tag/php-5-3/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.job-blog.bullgare.ru</link>
	<description>о программировании и работе</description>
	<lastBuildDate>Fri, 03 Feb 2012 09:42:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Новое в PHP 5.3: новое в синтаксисе</title>
		<link>http://www.job-blog.bullgare.ru/2009/08/%d0%bd%d0%be%d0%b2%d0%be%d0%b5-%d0%b2-php-5-3-%d0%bd%d0%be%d0%b2%d0%be%d0%b5-%d0%b2-%d1%81%d0%b8%d0%bd%d1%82%d0%b0%d0%ba%d1%81%d0%b8%d1%81%d0%b5/</link>
		<comments>http://www.job-blog.bullgare.ru/2009/08/%d0%bd%d0%be%d0%b2%d0%be%d0%b5-%d0%b2-php-5-3-%d0%bd%d0%be%d0%b2%d0%be%d0%b5-%d0%b2-%d1%81%d0%b8%d0%bd%d1%82%d0%b0%d0%ba%d1%81%d0%b8%d1%81%d0%b5/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 09:39:49 +0000</pubDate>
		<dc:creator>bullgare</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[goto]]></category>
		<category><![CDATA[mysqlnd]]></category>
		<category><![CDATA[NOWDOC]]></category>
		<category><![CDATA[php 5.3]]></category>
		<category><![CDATA[__callStatic()]]></category>
		<category><![CDATA[тернарный оператор]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=155</guid>
		<description><![CDATA[В PHP 5.3 немного обновился синтаксис &#8211; добавилось несколько полезных и удобных инструкций. NOWDOC (соотносится с HEREDOC так же, как строка в одинарных кавычках со строкой в двойных). Тернарный оператор (?:): теперь можно опустить второй оператор, при этом если первое выражение приводится к значению TRUE, то оно и будет использовано далее. Пример &#60;?php echo 1 [...]]]></description>
			<content:encoded><![CDATA[<p>В PHP 5.3 немного обновился синтаксис &#8211; добавилось несколько полезных и удобных инструкций.<br />
<span id="more-155"></span></p>
<ol>
<li>
<a href="http://php.net/nowdoc">NOWDOC</a> (соотносится с <a href="http://ru2.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc">HEREDOC</a> так же, как строка в одинарных кавычках со строкой в двойных).
	</li>
<li>
<a href="http://ru.php.net/ternary">Тернарный оператор (?:)</a>: теперь можно опустить второй оператор, при этом если первое выражение приводится к значению TRUE, то оно и будет использовано далее.</p>
<blockquote><p>Пример</p></blockquote>
<pre class="code">
&lt;?php
echo 1 ?: 0; //вывод: 1
?&gt;
</pre>
</li>
<li>
<a href="http://ru2.php.net/goto">Оператор <strong>GOTO</strong></a>. Применяется для перевода выполнения программы в другую точку программы. В PHP 5.3 поддерживается ограниченный <strong>goto</strong>: можно переходить только внутри одного файла, внутри одного контекста (нельзя прыгать из функции в функцию), нельзя таким образом входить внутрь циклов или условных операторов (выходить можно).<br />
Предполагается его использование вместо многоуровневых операторов <strong>break</strong>.</p>
<blockquote><p>Пример</p></blockquote>
<pre class="code">
&lt;?php
for($i=0,$j=50; $i<100; $i++) {
  while($j--) {
    if($j==17) goto end;
  }
}
echo "i = $i";
end:
echo 'j совпало с 17';
?&gt;
вывод: j совпало с 17
</pre>
</li>
<li>
<a href="http://ru.php.net/__callstatic">__callStatic</a> вызывается, когда встречается ссылка на несуществующий метод в статическом контексте (аналог __call для объектного контекста).</p>
<pre class="code">
__callStatic  ( string $name  , array $arguments  )
</pre>
</li>
</ol>
<p>Также наконец-то появился нативный MYSQL-драйвер (<a href="http://ru2.php.net/mysqli.mysqlnd">mysqlnd</a>). Теперь нет проблем с лицензированием, и поддержка MYSQL по умолчанию снова включена. Плюс к этому ускорилась (что очевидно), скорость работы, меньше памяти отъедает соединение. Также теперь возможно постоянное соединение (для этого нужно дописать префикс "p:", к примеру, <strong>$host="p:localhost";</strong>).<br />
При этом всё осталось прозрачным для программиста - всё будет работать как прежде, за одним исключением:<br />
при работе через <strong>mysqlnd </strong>добавился новый API <a href="http://ru2.php.net/manual/en/mysqli-result.fetch-all.php">mysqli_fetch_all()</a>.</p>
<p><a href="http://php.net/releases/5_3_0.php">Полный список изменений</a><br />
<a href="http://habrahabr.ru/blogs/php/59876/">На русском коротко</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2009/08/%d0%bd%d0%be%d0%b2%d0%be%d0%b5-%d0%b2-php-5-3-%d0%bd%d0%be%d0%b2%d0%be%d0%b5-%d0%b2-%d1%81%d0%b8%d0%bd%d1%82%d0%b0%d0%ba%d1%81%d0%b8%d1%81%d0%b5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Новое в PHP 5.3: замыкания (лямбда-функции)</title>
		<link>http://www.job-blog.bullgare.ru/2009/08/%d0%bd%d0%be%d0%b2%d0%be%d0%b5-%d0%b2-php-5-3-%d0%b7%d0%b0%d0%bc%d1%8b%d0%ba%d0%b0%d0%bd%d0%b8%d1%8f-%d0%bb%d1%8f%d0%bc%d0%b1%d0%b4%d0%b0-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%b8/</link>
		<comments>http://www.job-blog.bullgare.ru/2009/08/%d0%bd%d0%be%d0%b2%d0%be%d0%b5-%d0%b2-php-5-3-%d0%b7%d0%b0%d0%bc%d1%8b%d0%ba%d0%b0%d0%bd%d0%b8%d1%8f-%d0%bb%d1%8f%d0%bc%d0%b1%d0%b4%d0%b0-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%b8/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 07:50:28 +0000</pubDate>
		<dc:creator>bullgare</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[php 5.3]]></category>
		<category><![CDATA[анонимная функция]]></category>
		<category><![CDATA[замыкание]]></category>
		<category><![CDATA[лямбда-функция]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=141</guid>
		<description><![CDATA[Замыкания (closures, лямбда-функции, анонимные функции) есть функция, не привязанная к конкретному имени функции. Их удобно использовать в качестве callback-параметра в функциях. Пример1 &#60;?php echo preg_replace_callback('~-([a-z])~', function ($match) { return strtoupper($match[1]); }, 'hello-world'); // вывод: helloWorld ?&#62; Замыкание может быть значением переменной. В таком случае переменная становится экземпляром встроенного класса Closure (&#171;замыкание&#187;). Присваивание значения при этом [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BC%D1%8B%D0%BA%D0%B0%D0%BD%D0%B8%D0%B5_%28%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%29">Замыкания</a> (<a href="http://en.wikipedia.org/wiki/Closure_%28computer_science%29">closures</a>, лямбда-функции, анонимные функции) есть функция, не привязанная к конкретному имени функции.<br />
<span id="more-141"></span><br />
Их удобно использовать в качестве callback-параметра в функциях.</p>
<blockquote><p>Пример1</p></blockquote>
<pre class="code">
&lt;?php
echo preg_replace_callback('~-([a-z])~', function ($match) {
    return strtoupper($match[1]);
}, 'hello-world');
// вывод: helloWorld
?&gt;
</pre>
<p>Замыкание может быть значением переменной. В таком случае переменная становится экземпляром встроенного класса <a href="http://ru2.php.net/manual/en/reserved.classes.php#reserved.classes.closure">Closure</a> (&laquo;замыкание&raquo;). Присваивание значения при этом ничем не отличается от обычного присваивания значения (включая и точку с запятой в конце).</p>
<blockquote><p>Пример2</p></blockquote>
<pre class="code">
&lt;?php
$greet = function($name)
{
    printf("Hello %s\r\n", $name);
};

$greet('World');// вывод: hello World
$greet('PHP');// вывод: hello PHP
?&gt;
</pre>
<p>Замыкания имеют доступ к переменным из родительского контекста. Для этого такая переменная должна быть объявлена в заголовке анонимной функции с использованием ключевого слова <strong>use</strong>. Это не то же самое, что и глобальные переменные. Глобальные переменные объявлены в глобальном контексте, который не меняется в зависимости от вызванной функции. Родительский контекст для замыкания ограничен функцией, в которой замыкание объявлено (но не функцией, вызвавшей его).</p>
<blockquote><p>Пример3. Контексты.</p></blockquote>
<pre class="code">
&lt;?php
// Простая продовольственная корзина, содержащая список продуктов
// и количество каждого. Включает метод подсчёта общей
// стоимости товаров в корзине с использованием
// замыкания в качестве callback-функции.
class Cart
{
    const PRICE_BUTTER  = 1.00;
    const PRICE_MILK    = 3.00;
    const PRICE_EGGS    = 6.95;

    protected   $products = array();

    public function add($product, $quantity)
    {
        $this->products[$product] = $quantity;
    }

    public function getQuantity($product)
    {
        return isset($this->products[$product]) ? $this->products[$product] :
               FALSE;
    }

    public function getTotal($tax)
    {
        $total = 0.00;

        $callback =
            function ($quantity, $product) use ($tax, &#038;$total)
            {
                //тут надо бы использовать defined()
                $pricePerItem = constant(__CLASS__ . "::PRICE_" .
                    strtoupper($product));
                $total += ($pricePerItem * $quantity) * ($tax + 1.0);
            };

        array_walk($this->products, $callback);
        return round($total, 2);
    }
}

$my_cart = new Cart;

// Добавим несколько продуктов в корзину
$my_cart->add('butter', 1);
$my_cart->add('milk', 3);
$my_cart->add('eggs', 6);

// Выведем общую стоимость с учётом 5% налога с продаж.
print $my_cart->getTotal(0.05) . "\n";
// вывод: 54.29
?&gt;
</pre>
<p>Внутри замыканий можно использовать функции func_num_args(), func_get_arg() и func_get_args().</p>
<p><a href="http://ru2.php.net/manual/en/functions.anonymous.php">Документация</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2009/08/%d0%bd%d0%be%d0%b2%d0%be%d0%b5-%d0%b2-php-5-3-%d0%b7%d0%b0%d0%bc%d1%8b%d0%ba%d0%b0%d0%bd%d0%b8%d1%8f-%d0%bb%d1%8f%d0%bc%d0%b1%d0%b4%d0%b0-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%b8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Новое в PHP 5.3.0: Позднее статическое связывание</title>
		<link>http://www.job-blog.bullgare.ru/2009/08/%d0%bd%d0%be%d0%b2%d0%be%d0%b5-%d0%b2-php-5-3-0-%d0%bf%d0%be%d0%b7%d0%b4%d0%bd%d0%b5%d0%b5-%d1%81%d1%82%d0%b0%d1%82%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%be%d0%b5-%d1%81%d0%b2%d1%8f%d0%b7%d1%8b%d0%b2/</link>
		<comments>http://www.job-blog.bullgare.ru/2009/08/%d0%bd%d0%be%d0%b2%d0%be%d0%b5-%d0%b2-php-5-3-0-%d0%bf%d0%be%d0%b7%d0%b4%d0%bd%d0%b5%d0%b5-%d1%81%d1%82%d0%b0%d1%82%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%be%d0%b5-%d1%81%d0%b2%d1%8f%d0%b7%d1%8b%d0%b2/#comments</comments>
		<pubDate>Wed, 05 Aug 2009 14:45:19 +0000</pubDate>
		<dc:creator>bullgare</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[php 5.3]]></category>
		<category><![CDATA[позднее связывние]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=126</guid>
		<description><![CDATA[Поздним называется потому, что использование static:: будет означать вычисление класса/объекта, к которому будет относиться вызов, в момент вызова этой конструкции. А статическим &#8211; потому что работает и для статических методов (но не только для них). Для self:: и __CLASS__ всё по-старому &#8211; они ссылаются на класс, в котором определён метод. Пример 1. Раннее связывание &#60;?php [...]]]></description>
			<content:encoded><![CDATA[<p>Поздним называется потому, что использование static:: будет означать вычисление класса/объекта, к которому будет относиться вызов, в момент вызова этой конструкции.<br />
А статическим &#8211; потому что работает и для статических методов (но не только для них).<br />
<span id="more-126"></span><br />
Для self:: и __CLASS__ всё по-старому &#8211; они ссылаются на класс, в котором определён метод.</p>
<blockquote><p>Пример 1. Раннее связывание</p></blockquote>
<pre class="code">
&lt;?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        self::who();
    }
}

class B extends A {
    public static function who() {
         echo __CLASS__;
    }
}

B::test();//вывод: A
?&gt;
</pre>
<p><strong>Использование позднего статического связывания</strong><br />
В отличие от предыдущего примера, использование позднего статического связывания (при помощи static::) позволяет попробовать обратиться к методу первоначально вызванного класса на этапе выполнения.<br />
Таким образом, предыдущий пример превращается в:</p>
<blockquote><p>Пример 2. Простой пример позднего статического связывания</p></blockquote>
<pre class="code">
&lt;?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // Here comes Late Static Bindings
    }
}

class B extends A {
    public static function who() {
         echo __CLASS__;
    }
}

B::test();//вывод: B
?&gt;
</pre>
<p>Надо заметить, что static:: &#8211; не то же самое для класса, что и $this-> для объекта ($this-> следует правилам наследования, а static:: &#8211; нет).</p>
<blockquote><p>Пример 3. Использование в нестатическом контексте</p></blockquote>
<pre class="code">
&lt;?php
class TestChild extends TestParent {
    public function __construct() {
        static::who();
    }

    public function test() {
        $o = new TestParent();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}

class TestParent {
    public function __construct() {
        static::who();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}
$o = new TestChild;//вывод: TestChild
$o->test();//вывод: TestParent
?&gt;
</pre>
<p>Позднее статическое связывание не пойдёт выше, к предкам, а остановится на вызове метода инициировавшего его класса, тогда как self:: и parent:: будут всети себя согласно правилам наследования.</p>
<blockquote><p>Пример 4. Переадресуемые и непереадресуемые вызовы</p></blockquote>
<pre class="code">
&lt;?php
class A {
    public static function foo() {
        static::who();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}

class B extends A {
    public static function test() {
        A::foo();
        parent::foo();
        self::foo();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}
class C extends B {
    public static function who() {
        echo __CLASS__."\n";
    }
}

C::test();
//вывод:
//A
//C
//C
?&gt;
</pre>
<p><a href="http://php.net/lsb">Документация</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2009/08/%d0%bd%d0%be%d0%b2%d0%be%d0%b5-%d0%b2-php-5-3-0-%d0%bf%d0%be%d0%b7%d0%b4%d0%bd%d0%b5%d0%b5-%d1%81%d1%82%d0%b0%d1%82%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%be%d0%b5-%d1%81%d0%b2%d1%8f%d0%b7%d1%8b%d0%b2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Новое в PHP 5.3.0: Неймспейсы (пространства имён)</title>
		<link>http://www.job-blog.bullgare.ru/2009/08/%d0%bd%d0%be%d0%b2%d0%be%d0%b5-%d0%b2-php-5-3-0/</link>
		<comments>http://www.job-blog.bullgare.ru/2009/08/%d0%bd%d0%be%d0%b2%d0%be%d0%b5-%d0%b2-php-5-3-0/#comments</comments>
		<pubDate>Wed, 05 Aug 2009 10:52:28 +0000</pubDate>
		<dc:creator>bullgare</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[php 5.3]]></category>
		<category><![CDATA[неймспейс]]></category>
		<category><![CDATA[пространство имён]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=116</guid>
		<description><![CDATA[Неймспейсы Служат для разрешения проблемы коллизий имён переменных/функций/классов. Пример1 &#60;?php namespace my\name; // определяем неймспейс (до объявления ничего вставлять нельзя) class MyClass {} function myfunction() {} const MYCONST = 1; $a = new MyClass; $c = new \my\name\MyClass; // доступ через глобальное пространство имён $a = strlen('hi'); // see "Using namespaces: fallback to global // [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ru.wikipedia.org/wiki/Namespace">Неймспейсы</a><br />
Служат для разрешения проблемы коллизий имён переменных/функций/классов.</p>
<p><span id="more-116"></span></p>
<blockquote><p>Пример1</p></blockquote>
<pre class="code">

&lt;?php
namespace my\name; // определяем неймспейс (до объявления ничего вставлять нельзя)

class MyClass {}
function myfunction() {}
const MYCONST = 1;

$a = new MyClass;
$c = new \my\name\MyClass; // доступ через глобальное пространство имён

$a = strlen('hi'); // see "Using namespaces: fallback to global
                   // function/constant" section

$d = namespace\MYCONST; // see "namespace operator and __NAMESPACE__
                        // constant" section
$d = __NAMESPACE__ . '\MYCONST';
echo constant($d); // see "Namespaces and dynamic language features" section
?&gt;
</pre>
<blockquote><p>Пример2. Объявление нескольких неймспесов в файле</p></blockquote>
<pre class="code">

&lt;?php
namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}

namespace AnotherProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}

namespace { // в глобальном пространстве имён
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?&gt;
</pre>
<blockquote><p>Пример3. Импортирование неймспесов и создание алиасов</p></blockquote>
<pre class="code">
&lt;?
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // инстанцирует объект класса My\Full\Classname
NSname\subns\func(); // вызывает функцию My\Full\NSname\subns\func

namespace foo {
use \ArrayObject;
$a = new ArrayObject(array(1)); // инстанцирует объект класса ArrayObject.
// без строки "use \ArrayObject" пытался бы инстанцировать
//объект класса foo\ArrayObject
}
?&gt;
</pre>
<p>Если не указан неймспейс, то внутри неймспейса поиск имени переменной/функции сначала производится внутри текущего пространства имён.<br />
Вводится константа __NAMESPACE__ (равна &laquo;&raquo; в глобальном пространстве имён).</p>
<p><a href="http://ru.php.net/namespaces">Документация</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2009/08/%d0%bd%d0%be%d0%b2%d0%be%d0%b5-%d0%b2-php-5-3-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

