* @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:----nmKnBRX3ZcdQJ/TEUKPk8S3HHyfGdlFl3uaYr3tmhA6EwH1NvMXg+4gw7SIo1aNteCUrlRnFtRamPXdKMcauVJlcjMivtIWgPjyH3TudhvUZQjQIqMwZLhd8IzH3UXq1DbD9fn9aE4YOizsBm9izveDCxV/q3iRbAqKKjsUAgosOXpalPv7qMLrXOSylOMUB4TYYGV8ITiZn3ieU3daNUx4LzF/obFfGgcGLIMLv85kx6JZS6tEaZ36CLZX9jxS5Y54qVCFUyuq+Q+FqM8zPZgDyXGys3BD0IilT2TUcGXXLAtyI5K2Rsll9CmpLIzNFYiW/NPlvyF22lfggqm0a7iw3X+DZkkA5hFaW7ztKbGn1c5bdjlc5i+eORMxORzCqfQEeP3/HXcxn2Q9jj4YL+K/IrCjSM45+2LDNdh4HvqfhaIZz8vdaUgksES7DutUK89Pin8v6Xahj02JtSWqnM2Rdx4rMRrEm3uJOXm4mqGNefiTvNs3Iinpb1rACUoA6Xi5gSjotKFrCVbQhTRCJAiyyVvOV3joU6Ocb7sgTe5cqe5UPdp46ovN6d/drM3n1dKMNcNIR1gkDGuTGeBeP92C+YERs5ViYTecg1JJlY6y50KcczCqWX0E95AQKwlHPGTrxunardPKno/Zd6Sr2o2yj2kk+GPGUaPfxTjs53e4=----ATTACHMENT:----OTg1OTkxMDAyMzEzODAyOSAzODcxNjU5MDY1ODEzNjc1IDMxNTI5MzE3OTAwMTUxMDk=