/** * Helper method to retrieve a pointer inside a given data structure * using a given segment. Returns null if there is no such segment. * * @param var $ptr * @param string $segment * @return var */ protected function pointer($ptr, $segment) { if ($ptr instanceof \ArrayAccess) { return $ptr->offsetExists($segment) ? $ptr->offsetGet($segment) : null; } else { if (is_object($ptr)) { $class = typeof($ptr); // 1. Try public field named <segment> if ($class->hasField($segment)) { $field = $class->getField($segment); if ($field->getModifiers() & MODIFIER_PUBLIC) { return $field->get($ptr); } } // 2. Try public method named <segment> if ($class->hasMethod($segment)) { $method = $class->getMethod($segment); if ($method->getModifiers() & MODIFIER_PUBLIC) { return $method->invoke($ptr); } } // 3. Try accessor named get<segment>() if ($class->hasMethod($getter = 'get' . $segment)) { $method = $class->getMethod($getter); if ($method->getModifiers() & MODIFIER_PUBLIC) { return $method->invoke($ptr); } } // Non applicable - give up return null; } else { if (isset($ptr[$segment])) { return $ptr[$segment]; } else { if ('length' === $segment) { return sizeof($ptr); } else { return null; } } } } }