您想在PHP中拥有哪些功能?[关闭]


88

既然现在是假期,每个人都在许愿,我想知道-您希望PHP将添加哪些语言功能?我对这种语言的一些实用建议/希望很感兴趣。实际上,我的意思是:

  1. 可以实际完成的操作(不是:“我希望PHP猜出我的代码的含义并为我修复错误”或“我希望任何代码都可以在5毫秒内执行”)
  2. 不需要将PHP更改为另一种语言的东西(不是:“我希望他们放弃$符号并使用空格而不是花括号”或“我希望PHP被编译,静态键入并以#命名”)
  3. 不需要破坏所有现有代码的东西(不是:“让我们重命名500个函数并更改它们的参数顺序”)
  4. 东西改变语言或它的一些有趣的方面(不是:“我希望有扩展XYZ协议,支持”或“我想了bug#12345终于固定”)
  5. 不仅仅是喧嚣的东西(不是:“我希望PHP不会糟透了”)

有人有美好的祝愿吗?

国防部编辑:Stanislav Malyshev是一名核心PHP开发人员。


9
@Stan:就像您想避免这种评论一样,无论如何您都会得到它。该问题 的人 用PHP在很大程度上是在你在帖子中排除的东西的类别。[...]
Fishtoaster 2010年

24
[...]你是在说:“我们如何才能在不实际打中你的情况下改善打人的体验?” 我的意思是,是的,当我们被打中脸时免费喝咖啡可能会很好,因为它并不能解决很多潜在的潜在问题。因此,虽然我希望您在这里能得到一些有用的答案(已经看起来像),但不要为那些毫无用处的答案感到惊讶。
Fishtoaster 2010年

5
@Fishtoaster:如果PHP与您被击中脸有关,请务必远离它。您绝对对改进它不感兴趣。即使有人,也是如此。本主题是给他们的,而不是给你的。我敢肯定,这个网站也有很多主题供您选择,这只是其中之一。
StasM 2010年

5
我以面对别人的例子为例-表面改善并不那么重要;当大多数人的问题出在根本问题上时。我什至没有敲响您为这些表面上的改进寻求建议的尝试-我只是指出在这种情况下为什么您可能会得到一些无益的答案。
Fishtoaster 2010年

6
@Fishtoaster:令人惊讶的是,并不是所有人都讨厌PHP- 我一直都很喜欢。非常灵活,快捷(编码)。
2010年

Answers:


119

我不介意命名参数。

getData(0, 10, filter => NULL, cache => true, removeDups => true);
// instead of:
getData(0, 10, NULL, true, true);

// or how about:
img(src => 'blah.jpg', alt => 'an albino platypus', title => 'Yowza!');

不幸的是,PHP开发人员已经否定了这个想法


1
这是2005年的清单。许多想法被关闭,然后重生。实际上,如果有一个好的实施方案,那么它就会被接受的可能性很大。
StasM 2010年

21
这是我最喜欢的python功能。使代码非常易于记录。
Keyo 2010年

7
@Josh K:可能不错,但是如果愿意的话,'array'调用是无用的垃圾。它只会混淆您真正想做的事情。另一种选择是数组的简写语法:make_img(['src'=>'blah.jpg',...]);
Erik van Brakel 2010年

2
@Erik:这也不是一个不好的选择,我是说为什么要在使用较小的数组包装器就已经可以将这种混乱情况添加到语言中的时候。
乔什(Josh K)2010年

4
@Erik:更轻松的数组语法(如JavaScript的[]运算符)将是一个值得赞赏的功能。
乔什(Josh K)2010年

93

取消引用:

echo something_that_returns_array()[4];

其他人提到了命名参数和较短的数组语法。我也不会介意较短的对象语法。

$a1 = array(1, 2, 3, 4);
$a2 = [1, 2, 3, 4];

$b1 = (object)array('name' => 'foo');
$b2 = {'name' => 'foo'}; // or something?

18
()[]语法已在主干中。不幸的是,数组快捷方式被拒绝了,但是我希望能够复活。
StasM 2010年

2
我很喜欢这个功能。为什么我们可以拥有something_that_returns_object()-> 4,但不能使用数组?
巴拉·克拉克

4
像数组和对象符号这样的Javascript会摇摇欲坠。作为前端开发人员,这是让我最困扰的php代码。
Bleep Bloop

1
@DisgruntledGoat它确实可以看到:function something_that_returns_array() { return array( 'a', 'b', 'c', 'd', 'e' ); }
Annika Backstrom

2
@DisgruntledGoat:()->语法的问题是,它仅在返回对象时才有效,更糟糕的是,甚至要求该对象具有指定名称的属性/方法,该属性/方法最佳地执行了您希望它执行的操作虽然接受你给它的参数,并祈祷它不需要任何更多...等等等等
phant0m

72

与PHP一起工作了大约13年,与JS一起工作了大约4年之后,我认为有几件事可以很好地借鉴JS:

1)数组和对象的简写符号。我相信这可能已经在Internals上进行了讨论并被否决了(所以我听说–我不喜欢看香肠的制作方法),但是我确实非常发现JS中数组和对象的字面意义很大生产力的胜利。

例如:

$arr     = [1,2,3,4];
$assoc   = [foo=>'bar', baz=>'boo'];
$stdobj  = {foo->'bar', baz->'boo'};

(IMHO)的书写和清洁程度比

$arr     = array(1,2,3,4); // not too bad
$assoc   = array("foo"=>'bar', baz=>'boo'); // not too bad either
$stdobj  = new stdClass; // this gets pretty rough
$stdobj->foo = 'bar';
$stdobj->baz = 'boo';

我听说有人提出了一些关于潜在混乱的担忧,但实际上,这比Heredoc表示法更令人困惑吗?我认为,至少在PHP中创建一个stdClass对象足够冗长,以至于不鼓励这种做法。

2)能够重新定义先前定义的函数和方法将非常有用。这将特别简化扩展类和实例化新类的情况,这些情况过于复杂或不切实际。我确实认为我们应该避免重新定义核心/非用户空间功能和方法。


除了这两个之外,我认为PHP 必须透明地支持unicode。对于开发人员来说,这已成为越来越多的问题,而PHP当前提供的解决方案令人困惑,并且常常表现不佳。开箱即用地使所有标准字符串功能对unicode友好都将是PHP程序员的巨大胜利。

感谢您的询问!


(2)看一下runkit。(3)unicode很难,特别是因为外界大多数情况都不是unicode。我们要么不得不牺牲性能,要么要求人们做很多额外的工作(就像Java一样)。这就是为什么无法使用php6 unicode的原因。
StasM 2010年

8
至于unicode:这可能很困难,但是会非常有用(肯定开发PHP本身很困难,但是它提供了很多好处,是吗?)也许一种解决方案是通过具有可理解的perf折衷的扩展来启用透明的unicode,很像XHP?再次感谢。
Funkatron 2010年

5
$ object =(object)array(“ foo” =>'bar',baz =>'boo');
mercutio 2010年

3
我看不到如何看到“大多数外部环境不是unicode”?您在谈论人吗?或者是其他东西?因为世界上绝大多数人(极大地)讲的语言最好用Unicode表示。
迪恩·哈丁2010年

1
绝对支持Unicode。没有它,运送任何种类的全球使用的应用程序都是不可能的。PHP开发人员是否认为在体面的unicode支持方面进行工程设计容易还是不容易。人们需要它,并且他们正在绕过该平台的失败之处进行破解。Delphi通过添加另一种字符串类型并将其设置为默认值(使用隐式强制转换)和全局开关以恢复旧行为来实现此目的。为什么PHP不能以同样的方式做到这一点?
Joeri Sebrechts 2010年

48

作为一名长期的PHP辩护者,我想要做的事情:

  1. 数组的语法较短。PHP数组由于其灵活性而成为该语言最强大的功能之一,但这是编写的麻烦some_array_method($argity, array('key' => $value));。我认为不幸的是,该建议已在PHP邮件列表中删除。
  2. finally 支持
  3. 属性/注释。这些允许您以允许代码重用的方式向方法中添加自定义行为。例如,在MVC框架中,可以定义,AuthorizeAttribute它表示控制器或操作方法需要授权用户。框架本身将负责查找属性并相应地对其进行操作。我相信PHPUnit已经通过将它们放入docblock注释中来使用某种属性,可以使用反射来读取它们,但是将实际功能放入docblock注释中无疑是一种技巧。
  4. 更短的lambda语法。不必写东西function($x){ return $x*2;},也许我可以写$x => return $x*2东西。这再次使使用此功能变得有些拖累。例如,“ $results = array_filter(array(1,2,3), function($a) { return $a % 2; }):vs $results = array_filter(array(1,2,3), $a => return $a % 2 );前者”的功能更多,基本上与您要完成的实际工作无关。
  5. Decimal通过普通的运算符支持数学运算的内置式(定点数学)会很不错,因为我们没有运算符重载。
  6. 摩尔魔术方法。魔术方法很棒。我可以看到PHP通过魔术方法添加了运算符重载(我知道这基本上是不会发生的。)但是,总的来说,它们提供了一种非常不错的方法来连接该语言并完成出色的工作。

48

使PHP真正面向对象。slap on another global functionPHP 的发展需要结束。

array_merge(array_filter(array_intersect_key($arr1, $arr2), "is_int"), $arr3);

这对我来说很难读。我必须建立自己的思想栈,并自己进行编译。基本上应该反过来读。$dog->wakeup()->bark();比较容易阅读bark(wakeup($dog))

$arr1->array_intersect_key($arr2)->array_filter("is_int")->array_merge($arr3);

您已朝着启用对象/方法支持迈出了一步,请在实际的核心PHP函数中使用它。

让我们重命名500个函数并更改它们的参数顺序。

将此功能转换为方法将使它们能够使用一致的方式进行重命名。如果字符串和数组具有自己的方法,是否会破坏向后兼容性?


3
我认为数组不是对象类型是PHP中的一个大错误。导致各种麻烦。不幸的是,这是一个进化的过程。您可以通过扩展名或用户空间在此处执行所需的操作。很适合SPL。
StasM 2010年

3
相同的参数适用于字符串。我是指总体上缺乏方法。诸如Java,Python,C#等语言都具有可读性强的代码。我想您正在寻找功能,但是修复IMO损坏的组件会更好。
Keyo

6
不,别傻了。这是dog_wake_up($dog); bark_dog($dog);
Matchu 2010年

2
恕我直言,任何新的字符串方法都应该期望并发出UTF-8,如果输入无效的UTF-8,则抛出异常。这将大大减少对unicode支持进行重大修改的需要。
rjmunro 2011年

1
@luiscubal否。额外的参数表示如果我们发明新的东西添加到函数中,我们以后将无法添加参数。例如,如果$ string => trim()仅做空格(如4.1.0之前),那么您的系统会说$ string => trim('ISO-8859-1')修剪了ISO-8859-1字符串中的空格。如果然后我们希望能够修剪不是空格的内容,则除非我们让人们首先指定编码,否则我们将无法为其添加参数。我们应该鼓励人们相信任何非UTF-8的文本都是错误的
rjmunro 2011年

40

语言集成的查询引擎会很棒。有点像.NET中可用的称为LINQ的东西。这将有助于对大量数据进行排序,并使数据库访问标准化,从而减少成功的SQL注入攻击。


2
使参数化查询更容易的任何事情都将赢得我的投票!
院长哈丁2010年

1
我认为标准化数据库访问实际上是诸如LINQ之类的一个非常重要的好处,因为我认为它使使用数据库对象的
模拟

我不认为这样的事情应该成为核心。它最好适合pecl扩展
harald,2011年

38

哦。类型提示为基本体。那样就好了。


1
尽管我喜欢PHP的KISS原理(在某种程度上),但我还是坚决赞成。原因是,如果您想真正防御,则最终在每个 setter方法中使用相同的类型检查代码。如果语言本身支持,我们可以轻松地删除它。
MicE 2010年

4
“类型提示”是非常不幸的名称,因为它不是“提示”,而是严格的键入。我认为原始的严格类型输入在像PHP这样的动态语言中会不合适。强制输入(与内部函数相同-尝试strlen(123))可能没问题。
StasM 2010年

6
为此+1。函数声明中的类型提示(或严格键入)将非常有用,并且可以减少每个方法中的if(!is_int())废话。
菲尔·斯特金

5
@StasM我不同意。在动态语言的范围内,它非常适合使用户选择以静态类型的方式使用该语言。这样可以更好地捕获错误。如果您不想使用它,则不必使用它,但就我个人而言,我已经受够了将字符串传递到我想要的int位置,然后不得不搜索代码以找出愚蠢的字符串从何处传递。否则,请始终输入所有内容。
丹尼尔·宾厄姆

2
@StasM绝对没有理由要引入完全静态类型的变量。是的,您将在代码中转移错误。这就是重点。该错误将在函数调用时而不是在函数内部发生-这使您不知道错误实际上在哪里发生。至于类型转换错误,该错误将在函数调用时发生-在运行时是。通过在那里直接转换为正确的类型来解决问题。比在期望int且不知道从哪里知道的函数中显示字符串要好得多。
丹尼尔·宾厄姆

34

我真希望开箱即用更好的unicode支持。大多数语言都朝着这个方向发展,但是PHP仍然到处都是奇怪的命令。

PHP字符串只是纯字节数组。它们的内容不可移植,因为它取决于当前的默认编码。

这同样适用于通过序列化构建的表示形式。它包含字符串的长度前缀的字节表示形式,而没有实际存储任何编码信息。

大多数PHP(字符串)函数都不了解Unicode。有关包括每个功能的风险级别的详细列表,请参阅:http : //www.phpwact.org/php/i18n/utf-8

http://blog.ginkel.com/2010/03/php-unicode-support-or-the-lack-thereof/


事实证明,对Unicode的支持比想象中要难得多。这就是为什么php6的努力停滞了的原因。目前,我们拥有utf-8,我认为最好的方法是为字符串函数添加utf-8支持,这可能是intl扩展的一部分。
StasM 2010年

3
顺便说一句,报价不正确。PHP字符串是字节数组,但是它们的内容随您的需要而具有可移植性,并且不依赖于“默认编码”-它只是字节数组,您希望它们在utf8中,放在utf8中,想要在utf16中-放在utf16中。phpwact.org链接似乎已死。
StasM 2010年

1
我真的希望默认情况下会启用intl扩展,这样需要UTF-8的人(不是所有人吗?)不必与主机争斗就可以使字符串函数按预期运行。
EmilStenström,2010年

另外,感谢您对字符串的说明。我离开PHP已经有一段时间了,所以我有点生锈。相反,我与Python进行了unicode战争,该问题与PHP相似,但在Python 3中解决了这些问题。以瑞典语“ö”为名的情况
很糟

这绝对是我想看到的改善的一个领域。
内森·奥斯曼

32

使字符串成为对象,并使用内置方法替换名称和参数不一致的非对象。例如

$subject->replace($search,$replace);
$string->split($separator);
$string->trim();

等等

编辑:还有一点:这些方法应该始终期望并发出UTF-8,除了专门用于处理编码的方法。如果输入无效的UTF-8,则即使该函数的输出不受编码影响,也应引发异常。


就是我的目标。
Kemo

1
subject->verb(object),使参数顺序更容易记住。
Ming-Tang 2010年

+1我一直在创建自己的字符串类来完成这种事情,它使编码变得如此容易,而且您永远不会忘记参数的顺序。
DisgruntledGoat

2
那么会is_object($string)返回什么呢?这可能会大大破坏向后兼容性,或者导致引入真正不直观的几乎但并非相当对象。
Tgr

@Tgr:is_object()应该被弃用-不应有“不是对象”之类的东西。在短期内,它必须是可以关闭任何对象的属性,默认的字符串构造函数将其关闭。
rjmunro 2011年

24

1)我希望新实例化的对象返回“ $ this”,所以我可以使用方法链,$ user = new User('john')-> setLastName('Doe')-> save();

2)如果您曾经使用过ruby,并且最近使用过node,那么它们具有出色的交互式外壳(IRB)。我希望PHP具有一个实际上有用的工具。

3)特质/杂讯,但我听说这些都在路上。

4)我想第二个短数组$ myArray = ['my','array'];

5)一致的命名/顺序(即针堆)


我讨厌必须创建一种create()仅解决#1并没有什么特别的方法!
艾伦·皮尔斯

我做同样的事情,但是使用后期静态绑定和对象超类,那样,扩展我的超类的每个类都具有该方法,例如:SomceClass扩展SuperObject {};。SomeClass :: create()-> somemethod();
dukeofgaming 2010年

看看github.com/philsturgeon/php-ps这只是一个开始,但是在一些帮助下它可能会非常有用。
菲尔·斯特金

1
还有一个PEAR软件包,它提供了一个交互式外壳程序,用于用PHP编写快速的实验代码-pear.php.net/package/PHP_Shell
kguest 2010年

(新的Foo())-> bar()是5.4的一部分。3)和4)也是。
StasM 2012年

20

1)请摆脱include()。对其他文件的引用应该是引用,而不是将一个源代码文件的内容实际放置到另一个文件中。太多的PHP程序员使用include()作为函数调用的一种,而不是一种引用库的方法。这导致可变状态和不稳定代码中的各种歧义。将其替换为类似Perl的“使用”命令。

2)请提供开箱编译PHP应用到一个单一的分配字节码文件或可执行的方法。这将大大增强PHP作为商业开发语言的吸引力。这应该是语言的基本组成部分。不用担心用于应用程序GUI的html文件,因为...

3)请摆脱将PHP标签嵌入HTML的功能。或至少提供“不嵌入”模式。这绝对是一团糟,并且通过将应用程序逻辑和表示混合在一起来鼓励不良的设计。开发人员应该使用模板进行显示,而不是将PHP文件拍在一起,并希望达到最佳效果。

签,

大师B

ps:不要听别人在说什么,我一年四季都很好


37
1)。包括很棒。一切都包括在内。2)。很好 3)模板化是PHP的最强功能。强迫您使用其他一些模板化的废话将是非常糟糕的举动。
乔什(Josh K)2010年

8
我喜欢(1)和(2),但(3)似乎是倒退的一步。PHP提供了模板功能,是否明智使用取决于您。
geekbrit 2010年

11
3没有任何意义-对于MVC框架中的任何V,都必须嵌入标签。
亚历克斯(Alex)2010年

9
我将这个答案读为“亲爱的圣诞老人,请使PHP不再是PHP。”
斯蒂芬,2010年

1
3是正确的,因为PHP 一种模板语言。
安德鲁


14

通过深思熟虑的命名惯例对新来者有意义的全局命名空间!

引用我们心爱的Jeff Atwood的话:PHP很烂,但这没关系


1
我原则上同意,但是在实践中不知道该怎么做:)
StasM 2010年

3
@StasM:我想第一步是将新版本的库命名为命名空间,并允许程序员(通过ini设置)禁用当前的全局库。我认为兼容性包应该适合较旧的版本,但是编写起来应该并不困难。
米哈尔Ť


13

1)较短的数组/对象语法,如JavaScript(如前所述)

2)允许const变量像计算一样允许计算结果define()

3)直接从构造函数链接: new User()->name('Ryan');

4)数组解引用: something_that_returns_array()[4];

5)扩展了SPL支持。SPL在将字符串和数组函数(除其他事项外)重新想象为对象方面做得不错。扩展SPL可以解决很多关于这种语言过于僵硬的问题。

6)使用ArrayObject()应与使用一样透明array()。您应该能够不做array_filter($array_object_instance)任何事情array_filter($array_object_instance->getArrayCopy())。当然更好$array_object_instance->filter()

7)完整的Unicode会很好。

8)停止进行奇怪的自动类型转换。例如,如果echo不首先将其显式类型转换为字符串,就不能使用SimpleXMLElement对象。或者至少在事情发生时抛出一些东西(例如,在严格模式下或任何模式下error_reporting(-1))。

9)支持多个线程,或某种事件/异步回调。在尝试通过cURL上传大文件时,这一点最为重要。代替老式的线程,像Apple的Grand Central Dispatch这样的东西会更好。甚至是类似JavaScript的东西,您都可以在其中发出异步请求并定义回调。

10)一致的命名/顺序(即针堆)会很好,但是我认为使用SPL可以更好地解决。

11)官方支持的交互式PHP Shell,例如IRB。Facebook有一个phpsh用Python编写的调用,但它缺乏我想看到的修饰。

12)对于Reflection API,添加对(a)常量(全局和类)的文档块注释的支持,以及(b)对将类似PHPDoc的注释解析为合理的数据结构的支持。有一个名为“ docblock”的PECL软件包试图做到这一点,但作者似乎并没有走得太远。

编辑:13)我也很想看看使用!?在函数名称中的能力-像Ruby一样。


我同意,array_ *函数应支持arrayobject。但是如果考虑arrayobject的子类,那么对诸如“ array_merge”之类的东西的预期结果是什么?只允许您合并相同类的实例,array_merge返回什么?一个PHP数组或arrayobject的实例(分别是其子类)?
哈拉尔德2011年

我会争辩说,由于数据内部是一个数组,并且ArrayObject使用功能将其包装,所以即使ArrayObject的子类也将在内部使用数组。我希望能够合并另一个标准数组或ArrayObject(或子类)。至于它返回的内容,我认为它也应该返回一个新的ArrayObject,但是要遵循simplexml_load_string()设置的先例,在这里您可以指定结果应作为其实例的类的名称。
瑞安·帕曼

12

1)采用Python列表理解方式的数组理解:

$newlist = array($x->something for $x in $oldlist);

//with short array syntax:
$newlist = [$x->something for $x in $oldlist];

2)短数组语法

$newlist = [1,2,3,4,...];

3)使empty()不将字符串“ 0”视为真实


2
我认为对于(1)从迭代器和闭包中煮出来的东西会更好。
StasM 2010年

+1恕我直言,所有语言以及迭代器都应包含此代码。它们只是不使用有用的方法。
Evan Plaice

empty()是的逻辑对立面if ($x),因此empty('0')之所以正确if ('0')是因为是错误的。唯一的区别是,empty()如果未设置变量,则不会发出通知。
安德鲁

12

我想看看创建/定义常量数组的合法方法。有几种方法可以模拟这种功能,但是如果它只是PHP的直接功能,那将很好。如果您能以类似于Java的“最终”声明的方式创建数组,那将是很好的。

我创建了一个可以快速设置的登录系统。您要做的就是更改文本文件中数组的内容,以指定要用于用户信息的字段。使用一堆for循环,它可以处理从表单生成和输入敏感化到数据库调用的所有内容,但它们都依赖于此原始数组。

具有阵列的文件已被权限锁定,但是一旦阵列在以太中移动,它就可变了。尽管我认为该系统非常安全,但我不希望有任何机会。最终确定数组的方法对于这种情况非常有用。

新主意!!

哦,我想到了我在PHP中真正想要的其他东西。我想要某种系统来控制php文件操作和目录操作,类似于.htaccess的工作方式。

.phpaccess文件应触发某种相同的域/相同来源策略。

例如,如果我用虚拟主机托管许多站点,则我可以在目录中拥有一个.phpaccess文件,该文件将告诉php检查正在尝试在受保护目录上运行的所有脚本的原始记录。如果脚本不是来自该目录或其子目录,则文件操作或套接字操作将被拒绝。

我认为像这样的系统将使虚拟托管环境更加安全。如果您可以将其中之一放置在每个虚拟主机的顶部,则可以减少某人找到从相邻虚拟主机潜入的方法的机会。

同样,最好有一种相反的方法来固定它。即,将脚本在单个目录中的访问范围限制为该目录。

它的阴和阳都知道!


为+1 final。需要说明的是:final意味着变量的值可以在运行时设置(与常量不同,常量必须是常量表达式),但是只能设置一次。另请参见C#readonly
davidtbernal,2010年

1
有一个建议,建议干线的getter / setter取代只读等。虽然不可变数组可能很难做到。
StasM 2010年

关于phpaccess,PHP已经具有执行您所描述的“安全模式”。
DisgruntledGoat

11

作为一名顽固的PHP程序员,我最大的两个愿望是:

  1. 终于支持。虚构地通过标志或类似的方法来解决这个问题是很麻烦的。
  2. 我希望看到对getter和setter的C#语法的支持。当您有大量的getter和setter时,像C#这样的简单语法会大大提高性能,而不是像Java那样编写并编写getter和setter方法。在要动态创建成员的情况下(例如,如果要给模板渲染器使用一些变量),魔术方法非常有用,但是对于希望IDE自动完成并知道它们的普通属性并没有好处。类型,等等。这将有助于使代码更小,更易读和易于使用。

1
1.不幸的是,这很难做到,但是绝对是一个很好的待办事项。2. wiki.php.net/rfc/propertygetsetsyntax
StasM 2010年

@StasM:如何通过注释进行操作?类似于:/ ** @get getFoo; @set setFoo; * /私人$ foo;
米哈尔Ť

9

语言语法:在pihipiphpreboot中,有一些关于开发人员感兴趣的好线索(尽管phpreboot远远超过了JS)。

开发方法:如果实际考虑这样的调查,它将大大延长PHP.net的寿命。不要再做出任何随意的下午IRC会话语法决定。

个别功能:之前已经提到过一些功能,但是我会很高兴在这里烧掉一些因果报应,以至于变得更加直白:

  • Unicode字符串类型。
  • Bigint(请参阅Python)。
  • 内置Runkit可以删除/重命名/覆盖内置函数和类,这些函数和类并非总是设计得很好。
  • 现代面向对象
    • 多重继承(而不是复杂性,以很少支持具有笨拙特征语法的边缘情况)
    • 标量可以作为对象(请参见Python)加倍,例如array()作为ArrayObject,或字符串作为SplString(需要可用的方法,所有字符串函数都应作为提供str::toupper()
  • 弃用糟糕的\名称空间语法,修复解析器,然后采用::替代方法。你知道,就像一种真实的语言。
  • LINQ的任何变体(尽管我不相信你们确实设计了明智的语法)
  • 或XML文字。
  • 摆脱php.ini运行时行为和语义开关。确实消除了一些激动,但会使开发人员和用户群受益。
  • 是的,magic_quotes还没有消失。
  • 将Zend Engine字节码转换为PBC

虽然,如果这不是很明显,我会很乐意资助其他人去做后者,并杀死php.net作为主要实现。:P
哦,刚注意到,这是社区Wiki。因此,您实际上并非真正出于业障而已,而是真正的兴趣所在。如果是这样,请查看严重损害语言的<b>问题</ b>(Directoritis)。


5
我讨厌\名称空间语法,但这是一个漫长而可悲的故事,为什么它变得如此并且它可能不会改变...可能如果我能只改变PHP中的一件事,那将是我的主要候选人。但是它就是这样啊。
StasM 2010年

@StasM:非常感谢您的反馈,也对您对PHP的一些事情不礼貌感到抱歉,但是我确实很关心PHP;不过,因此很固执。-我已经读了一些有关推理的信息。反斜线难题不是一个很大的问题,但是到明年图书馆广泛传播时,它将变成一个问题。因此,我希望有人编写一个解析器,将\ cargo \ cult \ class \ names改写为下划线方案。
mario 2010年

也许我很傻,但是对于命名空间使用'::'还是'\'有什么区别?
米哈尔Ť

@Pies:::对于任何C / C ++语法关闭语言而言,这将更为自然。而且\不仅在所有编程语言中都是异常的,而且具有未经测试的含义。之前的一些讨论:stackoverflow.com/questions/238550/…developers.slashdot.org/article.pl?sid=08/10/26/1610259reddit.com/r/programming/comments/79cut/…-但在特别是在没有反馈的情况下做出决定,并向开发人员社区发出信号,这并不是很受欢迎的举动。
mario 2010年

1
+ 1000000用于多重继承。
ts01 2010年

8

我很乐意将错误和异常统一到一个概念(异常)中。能够捕获异常并将其写入日志,以这种方式查找和修复错误真是太好了。但是,如果在很少遇到的代码路径中存在根本上的错误(阅读:PHP错误),则没有很好的方法将该信息集中到相同的问题数据库中。

圣诞老人,请在php.ini中引入一个开关,它将所有错误都变成异常-理想情况下,我可以在代码中捕获到异常。


1
引擎中已经对此提供了支持,许多扩展程序都在使用它。您也可以使用set_error_handler()和ErrorException轻松地做到这一点。尽管提防E_STRICT / E_NOTICE / E_DEPRECATED
StasM 2010年

我很了解这些方法,而且它们确实很hacky。我喜欢一种统一的方式-包括E_STRICT / E_NOTICE的方式。
亚历克斯

7

PHP非常适合我,因为它可以打开中小型网站。我必须是没有想象力的,我唯一想到的是可以解决此问题的方法,可以使其在高流量站点上更好地扩展。

我在考虑将进程衍生到其他核心,例如在一个进程中更新数据库,而在另一个进程中创建输出页面。快速谷歌搜索表明,这是可以模拟的,但目前尚不直接在PHP中支持。


1
实际上,考虑得更多,卸载数据库似乎是一个有趣的场景,因此在+1 :)
StasM 2010年

1
@Stasm,我假设您的意思是单独的请求作为单独的进程运行。我说的是一个复杂的页面,需要页面生成和后台计算。我可能是错的,但是我认为没有办法在单独的过程中产生(例如)数据库更新操作。这样做的原因是将页面更快地发送到请求者,而不是必须等待与直接生成页面没有直接关系的所有处理。PS ..感谢您的更新!
geekbrit 2010年

7

我真的很想念标量类型不会被视为对象,并且实际对象不能像任何其他类型或对象一样工作(由于__toString()而导致的字符串除外)。


是的,请使用魔术方法进行类型转换。
米哈尔Ť

7
  • 支持枚举(例如Java 1.5+)
  • 能够在接口和类中定义方法返回类型
  • 支持对属性和方法的注释/元数据定义。
  • 能够对方法标量参数进行严格的类型提示。

+1正如我想在PHP中看到所有这些东西。
杰里米

6

http://php.net上清理“用户贡献的笔记” 。有时它们确实是一团糟,但总体上还是很有价值的。


1
某种投票赞成/反对赞成的功能以及链接到回复中原始评论的能力肯定会很好。
Tgr

5

PHP中有一些相当不错的数组函数,提供列表处理能力,回调和create_function()基本的lambda演算。

它的主要问题是,它在PHP中过于冗长,速记系统将非常出色,尤其是在涉及map / reduce命令的地方。

更重要的是,列表功能并不完全完整:

  • 没有foldr功能,array_reduce()提供foldl
  • array_map()应该通过第二个参数的关键,因为array_walk()
  • 一个array_map_keys()可能对密钥修改有用
  • 列表理解很笨重,range()array_fill()array_fill_keys()只能处理这么多的情况下,并且array_filter()是独立的

我的目标不是使PHP成为Haskell的对象,但是PHP通常用于列表类型数据结构的操作,在这方面拥有一整套工具将很有用。


1
我的一位同事还认为可能/应该在与数组相关的功能中添加一些其他功能;在他的github帐户上提到的:这些是​​缺少array_all()和array_any(),它们检查*回调表示的条件是否适用于数组中的所有或任何元素。 gist.github.com/44350
kguest 2010年

5

运算符重载:

$result = $MatrixA + $MatrixB * $MatrixC;

1
不确定PHP作为一种动态类型的语言,单击效果如何。
BoltClock

5
也许它应该通过神奇的方法,比如__add($ OBJ),__times($ OBJ)等来完成
米哈尔牛逼

它已经作为PECL扩展名存在:pecl.php.net/package/operator。将其与主要资源合并应该不是太多的工作
Xananax

4

添加异常而不是生成E_WARNING ...我不能使用诸如以下的代码,这非常令人讨厌:

try{
   $f = fopen('asd', 'r');
   flock($f, LOCK_SH);

   while(!feof($f)){
       echo fread($f, 512);
   }

   fclose($f);

}catch(IOException $ex){
   echo 'Oops, something wrong: '.$ex->getCode();
}

当然,目前尚不实用,但是收到它却很烦人:

警告

警告

警告

而且我无法编写自己的error_handler和字符串嗅探来控制已生成的错误(权限,错误的文件名或其他任何内容;在这里我不介意其他错误源)以引发正确的异常,从而无法控制代码流。

我希望我没有解释为什么它很重要。

PHP早在一段时间以前就成为面向对象的,并且使用PHP的程序员一直在期待OO功能,而不是引入“ goto” ...当我发现它确实发生时,我以为是愚人节。


除非捕获,否则异常将终止脚本。生产服务器上的警告将被记录,并且永远不会显示给用户。现在更改此功能将破坏很多脚本,因为它们不是为了抓住它们而设计的。(请注意,我编写了错误处理程序以自行引发异常)。现在,PDO会引发警告或异常:程序员在运行时决定。该功能可能是应该添加到更多模块中的功能。
Reece45 2011年

4
  1. 巩固对象模型-使所有对象扩展基本Object类。Object类将(除其他事项外)实现所有魔术方法(因此它们将不再是魔术!)

  2. 将扩展移动到自己的名称空间-整理全局名称空间 $conn = new \MySQLi\Connection();

  3. 取消削弱spl_autoload()功能!认真地说,这可能是PHP的最大功能之一,同时也是最无用的功能。spl_autoload是默认的自动加载器,支持名称空间和多个文件扩展名,但是由于某些未知原因,要求文件名小写。对此有一个错误报告,但工作人员答复说,由于向后兼容,他们不会修复它。是的...并不是每个框架都附带有它自己的自动加载器,因为默认的自动加载器已损坏!



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.