keys = $keys; foreach ( $keys as $key ) { foreach ( $sources as $source ) { if ( $source instanceof Config ) { if ( $source->has( $key ) ) { $this->options[$key] = $source->get( $key ); continue 2; } } else { if ( array_key_exists( $key, $source ) ) { $this->options[$key] = $source[$key]; continue 2; } } } throw new InvalidArgumentException( "Key \"$key\" not found in input sources" ); } } /** * Assert that the list of options provided in this instance exactly match $expectedKeys, * without regard for order. * * @param string[] $expectedKeys */ public function assertRequiredOptions( array $expectedKeys ) { if ( $this->keys !== $expectedKeys ) { $extraKeys = array_diff( $this->keys, $expectedKeys ); $missingKeys = array_diff( $expectedKeys, $this->keys ); Assert::precondition( !$extraKeys && !$missingKeys, ( $extraKeys ? 'Unsupported options passed: ' . implode( ', ', $extraKeys ) . '!' : '' ) . ( $extraKeys && $missingKeys ? ' ' : '' ) . ( $missingKeys ? 'Required options missing: ' . implode( ', ', $missingKeys ) . '!' : '' ) ); } } /** * @param string $key * @return mixed */ public function get( $key ) { if ( !array_key_exists( $key, $this->options ) ) { throw new InvalidArgumentException( "Unrecognized option \"$key\"" ); } return $this->options[$key]; } }