类文档

POMO_Reader

💡 云策文档标注

概述

POMO_Reader 是 WordPress 中用于处理 PO/MO 文件流的基类,提供读取 32 位整数、设置字节序等核心功能。它支持 PHP5 构造函数,并包含字符串操作方法的优化实现。

关键要点

  • 类包含属性如 $endian(字节序)、$_pos(位置)和 $is_overloaded(mbstring 重载检测)。
  • 主要方法包括 readint32() 和 readint32array() 用于从流中读取整数,setEndian() 设置字节序。
  • 字符串处理方法如 substr()、strlen() 和 str_split() 自动适配 mbstring 重载以提高兼容性。
  • PHP4 构造函数 POMO_Reader() 已弃用,建议使用 __construct()。
  • 类被 POMO_FileReader 和 POMO_StringReader 继承,用于文件或字符串流操作。

代码示例

// 示例:读取 32 位整数
$reader = new POMO_Reader();
$reader->setEndian('little');
$int = $reader->readint32(); // 返回整数或 false

// 示例:读取整数数组
$array = $reader->readint32array(5); // 读取 5 个整数

注意事项

  • 使用 readint32() 或 readint32array() 时需确保流中有足够字节,否则返回 false。
  • setEndian() 方法接受 'big' 或 'little' 参数,影响 unpack 操作。
  • 字符串方法在 mbstring.func_overload 启用时使用 mb_* 函数,确保 ASCII 编码处理。
  • PHP4 构造函数在 WordPress 5.4.0 后弃用,调用会触发 _deprecated_constructor。

📄 原文内容

Methods

Name Description
POMO_Reader::__construct PHP5 constructor.
POMO_Reader::close
POMO_Reader::is_resource
POMO_Reader::POMO_Reader PHP4 constructor. — deprecated
POMO_Reader::pos
POMO_Reader::readint32 Reads a 32bit Integer from the Stream
POMO_Reader::readint32array Reads an array of 32-bit Integers from the Stream
POMO_Reader::setEndian Sets the endianness of the file.
POMO_Reader::str_split
POMO_Reader::strlen
POMO_Reader::substr

Source

class POMO_Reader {

	public $endian = 'little';
	public $_pos;
	public $is_overloaded;

	/**
	 * PHP5 constructor.
	 */
	public function __construct() {
		if ( function_exists( 'mb_substr' )
			&& ( (int) ini_get( 'mbstring.func_overload' ) & 2 ) // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated
		) {
			$this->is_overloaded = true;
		} else {
			$this->is_overloaded = false;
		}

		$this->_pos = 0;
	}

	/**
	 * PHP4 constructor.
	 *
	 * @deprecated 5.4.0 Use __construct() instead.
	 *
	 * @see POMO_Reader::__construct()
	 */
	public function POMO_Reader() {
		_deprecated_constructor( self::class, '5.4.0', static::class );
		self::__construct();
	}

	/**
	 * Sets the endianness of the file.
	 *
	 * @param string $endian Set the endianness of the file. Accepts 'big', or 'little'.
	 */
	public function setEndian( $endian ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid
		$this->endian = $endian;
	}

	/**
	 * Reads a 32bit Integer from the Stream
	 *
	 * @return mixed The integer, corresponding to the next 32 bits from
	 *  the stream of false if there are not enough bytes or on error
	 */
	public function readint32() {
		$bytes = $this->read( 4 );
		if ( 4 !== $this->strlen( $bytes ) ) {
			return false;
		}
		$endian_letter = ( 'big' === $this->endian ) ? 'N' : 'V';
		$int           = unpack( $endian_letter, $bytes );
		return reset( $int );
	}

	/**
	 * Reads an array of 32-bit Integers from the Stream
	 *
	 * @param int $count How many elements should be read
	 * @return mixed Array of integers or false if there isn't
	 *  enough data or on error
	 */
	public function readint32array( $count ) {
		$bytes = $this->read( 4 * $count );
		if ( 4 * $count !== $this->strlen( $bytes ) ) {
			return false;
		}
		$endian_letter = ( 'big' === $this->endian ) ? 'N' : 'V';
		return unpack( $endian_letter . $count, $bytes );
	}

	/**
	 * @param string $input_string
	 * @param int    $start
	 * @param int    $length
	 * @return string
	 */
	public function substr( $input_string, $start, $length ) {
		if ( $this->is_overloaded ) {
			return mb_substr( $input_string, $start, $length, 'ascii' );
		} else {
			return substr( $input_string, $start, $length );
		}
	}

	/**
	 * @param string $input_string
	 * @return int
	 */
	public function strlen( $input_string ) {
		if ( $this->is_overloaded ) {
			return mb_strlen( $input_string, 'ascii' );
		} else {
			return strlen( $input_string );
		}
	}

	/**
	 * @param string $input_string
	 * @param int    $chunk_size
	 * @return array
	 */
	public function str_split( $input_string, $chunk_size ) {
		if ( ! function_exists( 'str_split' ) ) {
			$length = $this->strlen( $input_string );
			$out    = array();
			for ( $i = 0; $i < $length; $i += $chunk_size ) {
				$out[] = $this->substr( $input_string, $i, $chunk_size );
			}
			return $out;
		} else {
			return str_split( $input_string, $chunk_size );
		}
	}

	/**
	 * @return int
	 */
	public function pos() {
		return $this->_pos;
	}

	/**
	 * @return true
	 */
	public function is_resource() {
		return true;
	}

	/**
	 * @return true
	 */
	public function close() {
		return true;
	}
}