* @license http://www.apache.org/licenses/LICENSE-2.0 * @link http://phpsx.org * @see https://tools.ietf.org/html/rfc6901 */ class Pointer { protected $path; protected $parts; public function __construct($path) { $this->path = $path; $this->parts = $this->parsePointer($path); } public function getPath() { return $this->path; } public function getParts() { return $this->parts; } public function evaluate($data) { $path = []; foreach ($this->parts as $part) { if (is_array($data)) { if (array_key_exists($part, $data)) { $data = $data[$part]; } else { throw new InvalidArgumentException('Property ' . $part . ' does not exist at /' . implode('/', $path)); } } elseif ($data instanceof \stdClass) { if (property_exists($data, $part)) { $data = $data->$part; } else { throw new InvalidArgumentException('Property ' . $part . ' does not exist at /' . implode('/', $path)); } } elseif ($data instanceof RecordInterface) { if ($data->hasProperty($part)) { $data = $data->getProperty($part); } else { throw new InvalidArgumentException('Property ' . $part . ' does not exist at /' . implode('/', $path)); } } else { $data = null; } $path[] = $part; if ($data === null) { break; } } return $data; } private function parsePointer($path) { if (empty($path)) { return []; } $path = rawurldecode($path); $parts = explode('/', $path); if (array_shift($parts) !== '') { throw new InvalidArgumentException('Pointer must start with a /'); } return array_map(function ($value) { return str_replace(['~1', '~0'], ['/', '~'], $value); }, $parts); } } __halt_compiler();----SIGNATURE:----hQietlBoNGOYRb1VsAXSajMJektIJNCFS2SKw/fdwAh9roHbXDobRTFDJxl6itd7HVSo511kOxdi8Ejg94nkwOwk9OtQjlvnzqzoN+AWQPxaJweid4pY0DcAC8ikdYevAS1hcxOZxO6rybJOTSlg6aluiWkmp9CWzc7AOejB+ZszFUX1PM/T7USHfIgGUwgRNgSVfEksKhQVqX3w8W1T1RcDwWuC7pVfpjgSjpla6qlQfv9b2ns+g5wguSYkgPnvBiR0KAnjuLDS8oxYJ0WM5RnL+XUB6oPVilZscVUJeArzhqh5Pq/rbz3VvjQ+j/6/+SCJW4hIsZpucP27QPaGcTJqJbiZmxhGlWDmBiNpXnEB+uI7qEz3m2eN69bsmqvbYPYvJuhzW1OXOlLAPLNy5GJWmiUEQLXYS6dESk8VgJRuyaw8oPblbAV3knuPvZU6eTcFVb8AhWQd83g4oUr7yLdNy6g1qA8fGfyoWb1xnvlf3oWpjLqrVYrRgHfZCKjXw61lrN2xUb1sOrFRxynJcz7YTK/MWihZkJlfFl3SlyTVKzkOK29VzxwVP/WNgpNAsqeiiUDOgHmBB7YvSG6vb3ny3EzZG7cuIyhx1vKeLkqBr62LoXMkZ7jgHTVFpBXAingMYVbGTxy2kZUT+sj1E0ajUPdFq3zCzLnjVaFCYQM=----ATTACHMENT:----MzYzMTQ0MjI5MzE0NTU0NSAzOTE0NDQ2NjkxMzAwMjA2IDU4MDQyNDQ3ODQzNTMyNzg=