getHookContainer() ); if ( !$hookRunner->onUserArrayFromResult( $userArray, $res ) ) { return new ArrayIterator( [] ); } return $userArray ?? new UserArrayFromResult( $res ); } /** * @note Try to avoid in new code, in case getting UserIdentity batch is enough, * use {@link \MediaWiki\User\UserIdentityLookup::newSelectQueryBuilder()}. * In case you need full User objects, you can keep using this method, but it's * moving towards deprecation. * * @param array $ids * @return UserArrayFromResult|ArrayIterator */ public static function newFromIDs( $ids ) { $ids = array_map( 'intval', (array)$ids ); // paranoia if ( !$ids ) { // Database::select() doesn't like empty arrays return new ArrayIterator( [] ); } $dbr = MediaWikiServices::getInstance()->getConnectionProvider()->getReplicaDatabase(); $res = User::newQueryBuilder( $dbr ) ->where( [ 'user_id' => array_unique( $ids ) ] ) ->caller( __METHOD__ ) ->fetchResultSet(); return self::newFromResult( $res ); } /** * @note Try to avoid in new code, in case getting UserIdentity batch is enough, * use {@link \MediaWiki\User\UserIdentityLookup::newSelectQueryBuilder()}. * In case you need full User objects, you can keep using this method, but it's * moving towards deprecation. * * @since 1.25 * @param array $names * @return UserArrayFromResult|ArrayIterator */ public static function newFromNames( $names ) { $names = array_map( 'strval', (array)$names ); // paranoia if ( !$names ) { // Database::select() doesn't like empty arrays return new ArrayIterator( [] ); } $dbr = MediaWikiServices::getInstance()->getConnectionProvider()->getReplicaDatabase(); $res = User::newQueryBuilder( $dbr ) ->where( [ 'user_name' => array_unique( $names ) ] ) ->caller( __METHOD__ ) ->fetchResultSet(); return self::newFromResult( $res ); } /** * @return User */ abstract public function current(): User; /** * @return int */ abstract public function key(): int; } /** * Retain the old class name for backwards compatibility. * @deprecated since 1.41 */ class_alias( UserArray::class, 'UserArray' );