+++ /dev/null
-<?php
-
-interface TStringFunc
-{
- public function substr($str, $start, $length = null);
- public function strlen($str);
-}
-
-class TStringFunc_Core
-implements TStringFunc {
- public function substr($str, $start, $length = null)
- {
- // specifying a null $length would return an empty string
- if ($length === null) {
- return substr($str, $start);
- }
-
- return substr($str, $start, $length);
- }
-
- public function strlen($str)
- {
- return strlen($str);
- }
-}
-
-class TStringFunc_Mbstring
-implements TStringFunc {
- public function substr($str, $start, $length = null)
- {
- /**
- * We need to set the charset parameter, which is the second
- * optional parameter and the first optional parameter can't
- * be null or false as a "magic" value because that would
- * cause an empty string to be returned, so we need to
- * actually calculate the proper length value.
- */
- if ($length === null) {
- $length = $this->strlen($str) - $start;
- }
-
- return mb_substr($str, $start, $length, '8bit');
- }
-
- public function strlen($str)
- {
- return mb_strlen($str, '8bit');
- }
-}
-
-class TStringFuncFactory
-{
- private static $_instance;
-
- /**
- * Get the Singleton instance of TStringFunc implementation that is
- * compatible with the current system's mbstring.func_overload settings.
- *
- * @return TStringFunc
- */
- public static function create()
- {
- if (!self::$_instance) {
- self::_setInstance();
- }
-
- return self::$_instance;
- }
-
- private static function _setInstance()
- {
- /**
- * Cannot use str* functions for byte counting because multibyte
- * characters will be read a single bytes.
- *
- * See: http://us.php.net/manual/en/mbstring.overload.php
- */
- if (ini_get('mbstring.func_overload') & 2) {
- self::$_instance = new TStringFunc_Mbstring();
- }
- /**
- * mbstring is not installed or does not have function overloading
- * of the str* functions enabled so use PHP core str* functions for
- * byte counting.
- */
- else {
- self::$_instance = new TStringFunc_Core();
- }
- }
-}