繁体   English   中英

是否可以更改PHP函数的默认参数?

[英]Is it possible to change PHP functions' default parameters?

例如, trim()不会删除U + 3000(中文中使用的空格字符)。 更改trim()每个实例以包含U + 3000将很麻烦。 是否可以修改trim()的默认参数?

同样,PHP的正则表达式\\s也与U + 3000不匹配。 是否可以使\\s匹配U + 3000?

不幸的是trim()不是mbstring函数集( mb_* )的一部分。 否则,您可以简单地启用mbstring的Function Overloading Feature

但是由于使用了PHP的名称空间后备策略 ,因此可以:

对于函数和常量,如果没有命名空间的函数或常量,PHP将退回到全局函数或常量。

也就是说,您可以覆盖trim()不是 \\trim() )。 您必须使用名称空间并进行修整,而不必显式为全局名称空间添加前缀(即,没有\\前缀)。

namespace myns;

function trim($str, $charlist="  ") {
    $pregCharacters = preg_quote($charlist);
    return preg_replace("/^[$pregCharacters]+|[$pregCharacters]+$/", '', $str);
}

var_dump(trim(" a b c "));

对该RegExp没想太多。 它仅应说明trim()重写。

AFAIK您唯一需要注意的是\\myns\\trim()的定义应该在您第一次调用trim()之前进行。 这是在单元测试中模拟time()一种非常有吸引力的技术。


关于第二个问题,如果打开u -switch(PCRE_UTF8)\\s将匹配U + 3000:

var_dump(preg_match("/\s/u", " "));

不,如果不修改C源代码,就不可能修改trim()函数的内部工作方式。 但是,您可以创建一个新函数,例如customTrim() ,然后编写代码以删除所有要删除的字符。 仅当您事先知道这些字符串中可能出现的空白字符时才有可能。

如果需要使用preg_replace()进行此操作,则可以使用以下命令:

$str = preg_replace('/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $str);

正则表达式来自此博客条目 它将删除所有空格字符(包括与\\s匹配的空格),控制字符。 它还将删除Unicode字符“ IDEOGRAPHIC SPACE”(U + 3000)。

测试用例:

$str = ' ';
$str = preg_replace('/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $str);
var_dump($str, mb_strlen($str));

输出:

string(0) ""
int(0)

我认为您无法在PHP中重载函数(但长期以来没有PHP)。 相反,您可以根据需要编写自己的函数,首先调用trim。 然后看一下str_replace()函数; 您可能可以用“一个空字符”(即“”)“替换”中文Unicode空格字符。 如何在代码中编写代码似乎取决于字符编码,另请参见替换unicode字符

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM