Pull to refresh

Comments 11

Замечательный обзор "вглубь", спасибо. Некоторые вещи настолько просты, что надо обладать талантом их видеть.
Вы съели мой мозг. Пост в избранное, однозначно.
Кстати, а пример «Это я или не я?» точно будет работать? Если «да» — можете пояснить как именно?
Да, спасибо, Вы правы unserialize не выкидывает исключение. Счас исправлю в статье. Может быть этот пример лучше пояснит, как оно отработает:


class Spadar_Core_Object
{
protected $sIndex = 'Object';

public function parseObject($sInfo)
{
$mInfo = $sInfo;
$mInfo = @unserialize($sInfo);

if ($mInfo instanceof self)
{
return $mInfo;
}

return $this;
}

public function __toString()
{
return $this->sIndex;
}

public function setIndex($sIndex)
{
$this->sIndex = $sIndex;
}
}

$oObject = new Spadar_Core_Object();
$oObject->setIndex('Second');
$sSerializedObject = serialize($oObject); // Создаем сериализованную строку

$oSecondObject = new Spadar_Core_Object();

// Возвращается восстановленный объект из териалтзованной строки
echo 'Check: '.$oSecondObject->parseObject($sSerializedObject)."
\r\n";
echo 'Check Something Else: '.$oSecondObject->parseObject('Something Else')."
\r\n";
UFO just landed and posted this here
В моих примерах конструкторы надежно защищены многоточиями;)
> Динамически создавать константы можно будет только в PHP6.

Можно и счас. Есть такое расширение, runkit.
> Теперь за имя класса волноваться не стоит. Однако в этом случае, особой пользы от такого объявления мы не получаем.

Стоит волноваться, и очень сильно.

[code]
class A
{
static protected $_instance = null;

public function __construct()
{
echo 'call A constructor';
}

public function getInstance()
{
if ( is_null(self::$_instance) )
self::$_instance = new self();

echo 'Call getInstance - ' . get_class(self::$_instance);
return self::$_instance;
}
}

class B extends A
{
public function __construct()
{
echo 'call B constructor';
}

public function init()
{
echo 'call init method';
}

}


$B = B::getInstance(); // call A constructor. Call getInstance - A

$B->init(); // Fatal error: Call to undefined method A::init()
[/code]

Как видим self содержит имя того класса, в коде которого оно расположено, тоже самое с __CLASS__

И чтобы избежать этого - придется переопределять метод getInstace в каждом потомке
Да, вы правы. Причем на разработчики PHP не считают это багом. А костыльный вариант, с помощью которого это работает корректно пишется с использованием debug_backtrace();
Без примеров статья немного лишена смысла. Те кто знаю как использовать подобные строки или слышали о патернах, скорее всего уже используют. А среди остальных только пара человек найдет куда это воткнуть.
Эта статья не о паттернах, а о недокументированных возможностях ПХП.
Кстати, а что вы имели ввиду под примерами?
Например я у Вас спрашивал про кусок кода именно потому, что не понял как его можно будет применить
Sign up to leave a comment.

Articles