Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中面向对象的字符串/数字?_Php_Oop - Fatal编程技术网

PHP中面向对象的字符串/数字?

PHP中面向对象的字符串/数字?,php,oop,Php,Oop,我在看Ruby,它有一个非常好的OO结构,不像PHP有类似C的字符串函数。我想知道是否有一个扩展可以将字符串转换成对象,这样您就可以像这样使用它们: $str = "sometext"; echo "len:" . $str->length; //would print 'len: 8' 如果愿意,您可以创建自己的字符串包装器类,该类包含您可能需要的所有基于字符串的方法和计算属性。编辑:与Java为某些数据类型提供包装类的方式相同。看看这个 该类支持mbstring和iconv扩展,以

我在看Ruby,它有一个非常好的OO结构,不像PHP有类似C的字符串函数。我想知道是否有一个扩展可以将字符串转换成对象,这样您就可以像这样使用它们:

$str = "sometext";
echo "len:" . $str->length; //would print 'len: 8'

如果愿意,您可以创建自己的字符串包装器类,该类包含您可能需要的所有基于字符串的方法和计算属性。编辑:与Java为某些数据类型提供包装类的方式相同。

看看这个

该类支持mbstring和iconv扩展,以及PHP-UTF8包。它为每种方法选择了最佳可用函数。此外,它还提供了许多新方法。其中一些是:子串之间,拼接,开始,结束和挤压。也可以使用PHP内部函数或自定义函数来操作字符串

示例代码:

<?php

include('string.php');

$str = new String('sometext');
echo $str->length; //prints 8
echo $str->getLength(); //prints 8

?>


我以前从未使用过这个类,但通过查看它的文档,它有一些非常有趣的方法。大写、字符、比较、包含等。但它在PHP5.3中还不可用。我怀疑它是否有用,因为它没有任何有用的方法。也许可以在此基础上再接再厉。但那只适用于字符串。PHP是建立在标量上的,现在完全面向对象使用它是不可能的。

虽然Jose Vega为您的问题提出了一个很好的解决方案,但这种方法存在一个非常小的性能问题。我为此做了一个测试。虽然每种解决方案在实际应用中都表现良好,但也存在差异

编辑:不管怎样,因为这既不是Ruby,也不是Java,也不是Smalltalk,所以您最好使用提供的工具,而不是尝试改变语言以满足您的期望。主要是出于性能原因(因为本机工具通常是用C编写的,或者级别很低,对性能的影响很小,尽管这并不总是正确的),以及可读性:社区习惯于看到mb_strlen()或strlen()以及其他与字符串相关的函数

以下是我用于基准测试的代码:

结果:

====> Test run 0
And here are the results:
Test with {} = 0.00097203254699707
Test with strlen() = 0.0030488967895508
Test with mb_strlen() = 0.0031669139862061
Test with String1 object = 0.012485027313232
Test with String object = 0.036020040512085


====> Test run 1
Test with {} = 0.00095200538635254
Test with strlen() = 0.0029759407043457
Test with mb_strlen() = 0.0031669139862061
Test with String1 object = 0.012346982955933
Test with String object = 0.036028146743774


====> Test run 2
Test with {} = 0.0009617805480957
Test with strlen() = 0.0029959678649902
Test with mb_strlen() = 0.0031518936157227
Test with String1 object = 0.012416124343872
Test with String object = 0.037784099578857


====> Test run 3
Test with {} = 0.00081610679626465
Test with strlen() = 0.0025439262390137
Test with mb_strlen() = 0.0027410984039307
Test with String1 object = 0.010634183883667
Test with String object = 0.030903100967407


====> Test run 4
Test with {} = 0.00081205368041992
Test with strlen() = 0.0025379657745361
Test with mb_strlen() = 0.0027129650115967
Test with String1 object = 0.010583162307739
Test with String object = 0.031081914901733


====> Test run 5
Test with {} = 0.000823974609375
Test with strlen() = 0.0025639533996582
Test with mb_strlen() = 0.0026860237121582
Test with String1 object = 0.010586023330688
Test with String object = 0.030833959579468   

现在是2014年,SplString在PHP中仍然不是默认值。我想看看:


这是一个扩展,所以你必须安装它。

我玩游戏有点晚了,但我正在寻找一个像这样的库,遇到了这个问题。经过更多的调查,我在GitHub找到了最棒的

我查阅了文档和源代码,它看起来非常可靠。我建议您看看是否需要PHP字符串包装器类来简化字符串操作。请注意,此代码不是PHP扩展,这意味着没有本机操作,它只是一个包装器

支持多字节的PHP字符串操作库。与PHP5.3+、PHP7和HHVM兼容

举几个例子:

s('Upper Camel-Case')->upperCamelize(); // 'UpperCamelCase'
s('What are your plans today?')->truncate(19, '...'); // 'What are your pl...'
s('foo & bar')->containsAll(['foo', 'bar']); // true
s('Ο συγγραφέας είπε')->countSubstr('α'); // 2

我怀疑这是可能的,因为PHP的工作方式。正确的?。。。然后您将编写
mb_strlen($str)
,因为
->length
不会返回字符串的实际UTF-8长度简短回答:这在纯PHP中是不可能的,但是在一些特殊的类中,它包装了一个字符串变量,这在默认情况下是不可能实现的。数组也是一样……实际上,Java中并没有原始字符串类型——所有字符串都是
Java.lang.string
类的对象。@casablanca这是一个PHP问题,而不是Java问题。我的答案中的PHP部分仍然有效吗?或者根据我的坏例子,答案应该被否决吗?我可能脑子里一直在想char,然后就糊涂了。对不起,不是我否决了你。事实上,我现在给你一个+1来否定否决票,也是因为你确实回答了OP的问题。但是我如何使它“abc”创建一个新类?$str=新字符串('abc'),一旦你在代码中包含该类。但我想像使用普通字符串一样使用它。这就是重点,我希望所有的字符串都是对象。据我所知,这并不多,这是你将要得到的最接近的结果。这个答案与PHP7.0不兼容,由于
String
是一个保留名称:
PHP致命错误:无法使用“String”作为类名,因为它是保留的
您在每个循环的for循环中创建了一个新的String对象,但是当您使用本机String类型时,您只需在测试开始时定义一次。这当然会对性能产生影响。