Комментарии 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";
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";
НЛО прилетело и опубликовало эту надпись здесь
> Динамически создавать константы можно будет только в PHP6.
Можно и счас. Есть такое расширение, runkit.
Можно и счас. Есть такое расширение, 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 в каждом потомке
Стоит волноваться, и очень сильно.
[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 в каждом потомке
Без примеров статья немного лишена смысла. Те кто знаю как использовать подобные строки или слышали о патернах, скорее всего уже используют. А среди остальных только пара человек найдет куда это воткнуть.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Рекурсия при помощи self