<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Memory;
use ArrayAccess;
use Countable;
/**
* String value object
*
* It's an OO string wrapper.
* Used to intercept string updates.
*/
class Value implements ArrayAccess, Countable
{
/**
* Value
*
* @var string
*/
private $value;
/**
* Container
*
* @var Container\Movable
*/
private $container;
/**
* Boolean flag which signals to trace value modifications
*
* @var bool
*/
private $trace;
/**
* Object constructor
*
* @param string $value
* @param \Zend\Memory\Container\Movable $container
*/
public function __construct($value, Container\Movable $container)
{
$this->container = $container;
$this->value = (string) $value;
/**
* Object is marked as just modified by memory manager
* So we don't need to trace followed object modifications and
* object is processed (and marked as traced) when another
* memory object is modified.
*
* It reduces overall number of calls necessary to modification trace
*/
$this->trace = false;
}
/**
* Countable
*
* @return int
*/
public function count()
{
return strlen($this->value);
}
/**
* ArrayAccess interface method
* returns true if string offset exists
*
* @param int $offset
* @return bool
*/
public function offsetExists($offset)
{
return $offset >= 0 && $offset < strlen($this->value);
}
/**
* ArrayAccess interface method
* Get character at $offset position
*
* @param int $offset
* @return string
*/
public function offsetGet($offset)
{
return $this->value[$offset];
}
/**
* ArrayAccess interface method
* Set character at $offset position
*
* @param int $offset
* @param string $char
*/
public function offsetSet($offset, $char)
{
$this->value[$offset] = $char;
if ($this->trace) {
$this->trace = false;
$this->container->processUpdate();
}
}
/**
* ArrayAccess interface method
* Unset character at $offset position
*
* @param int $offset
*/
public function offsetUnset($offset)
{
unset($this->value[$offset]);
if ($this->trace) {
$this->trace = false;
$this->container->processUpdate();
}
}
/**
* To string conversion
*
* @return string
*/
public function __toString()
{
return $this->value;
}
/**
* Get string value reference
*
* _Must_ be used for value access before PHP v 5.2
* or _may_ be used for performance considerations
*
* @internal
* @return string
*/
public function &getRef()
{
return $this->value;
}
/**
* Start modifications trace
*
* _Must_ be used for value access before PHP v 5.2
* or _may_ be used for performance considerations
*
* @internal
*/
public function startTrace()
{
$this->trace = true;
}
}