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


可以实际完成的事情(不是:“我希望PHP能够猜测我的代码的含义并为我修复错误”或“我希望任何代码都可以执行不到5毫秒”)
不需要将PHP更改为另一种语言的东西(不是:“我希望他们放下$符号并使用空格而不是花括号”或“我希望PHP已编译,静态类型化并具有#代表名称”)
不需要破坏所有现有代码的东西(不是:“让我们重命名500个函数并更改它们的参数顺序”)
确实可以改变语言或某些有趣方面的东西其中的一个(不是:“我希望扩展到支持XYZ协议”或“我希望Bug#12345最终得到修复”)
有些事情比不了(不是:“我希望PHP不会糟透了”)

每个人都有美好的祝愿吗?

模块编辑:Stanislav Malyshev是一名核心PHP开发人员。

评论

@Stan:就像您想避免这种评论一样,无论如何您都会得到它。人们在使用PHP时遇到的问题主要是您在帖子中要排除的问题。 [...]

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

@Fishtoaster:如果PHP与您的脸部被击中联系在一起,则一定要远离它。您绝对对改进它不感兴趣。即使有人,也是如此。本主题是给他们的,而不是给你的。我相信这个网站也有很多主题可供您选择,这只是其中之一。

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

@Fishtoaster:令人惊讶的是,并不是每个人都讨厌PHP-我一直都喜欢它。非常灵活,快捷(编码)。

#1 楼

我不介意命名参数。

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开发人员已经否定了这个想法。

评论


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

– StasM
2010-12-18 17:21

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

– Keyo
2010-12-18 17:21

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

–埃里克·范·布拉克尔(Erik van Brakel)
2010-12-18 21:52



@Erik:这也不是一个坏选择,我是说为什么要在使用较小的数组包装程序已经可以将这种混乱情况添加到一种语言中时呢?

–乔什·K(Josh K)
2010-12-18 22:04

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

–乔什·K(Josh K)
2010-12-25 20:47

#2 楼

更多的取消引用:

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

echo something_that_returns_array()[4];


评论


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

– StasM
2010-12-18 22:44

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

–巴拉·克拉克(Bala Clark)
2010-12-19 8:22

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

–Bleep Bloop
2010-12-23在0:27

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

– Annika Backstrom
2011年5月21日在1:55

@DisgruntledGoat:()->语法的问题是,它仅在返回对象时才起作用,更糟糕的是,甚至要求该对象具有指定名称的属性/方法,该属性/方法可以最佳地执行什么操作您希望它会这样做,同时接受您已给它的参数,并祈祷它不再需要...等等。

–phant0m
2011年7月23日在23:44

#3 楼

在使用PHP大约13年之后,以及使用JS大约4年之后,我认为PHP可以借鉴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';
更容易编写和清理
br />
我听说有人提出了一些有关潜在混乱的担忧,但实际上,这比Heredoc表示法更令人困惑吗?我认为,至少在PHP中创建stdClass对象足够冗长,不鼓励这种做法。

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


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

谢谢提问!

评论


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

– StasM
2010-12-18 23:06

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

– Funkatron
2010-12-18 23:21

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

– Mercutio
2010-12-19 9:55

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

–迪恩·哈丁(Dean Harding)
2010-12-19 22:15

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

– Joeri Sebrechts
2010-12-27 19:40



#4 楼

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


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


#5 楼

使PHP真正面向对象。 PHP的slap on another global function演变需要结束。

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个函数并更改它们的参数顺序。


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

评论


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

– StasM
2010-12-18 17:24

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

– Keyo
2010-12-18 17:28



不,别傻了。那是dog_wake_up($ dog); bark_dog($ dog);

–马图
2010-12-24 18:24

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

– rjmunro
2011年1月6日23:39



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

– rjmunro
2011年4月17日0:00

#6 楼

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

评论


使参数化查询更容易的任何事情都将赢得我的投票!

–迪恩·哈丁(Dean Harding)
2010-12-18 14:57

我认为标准化数据库访问实际上是诸如LINQ之类的一个非常重要的好处,因为我认为它使使用数据库对象的模拟进行单元测试更加容易(因为您正在模拟PHP代码而不是SQL查询)。

– davidtbernal
2010-12-18 19:42

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

–极光
2011年6月3日7:21

#7 楼

哦。基本类型的提示。那就好了。

评论


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

–麦克风
2010-12-18 22:26

“类型提示”是非常不幸的名称,因为它不是“提示”,而是严格的键入。我认为原始的严格类型输入在像PHP这样的动态语言中会不合适。强制键入(内部函数也可以执行此操作-尝试strlen(123))可能还可以。

– StasM
2010-12-18 22:42

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

–菲尔St鱼
2010-12-21 11:54

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

–丹尼尔·宾汉(Daniel Bingham)
2010-12-28 17:15

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

–丹尼尔·宾汉(Daniel Bingham)
2010-12-28 21:33

#8 楼

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


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

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

大多数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-12-18 22:38

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

– StasM
2010-12-18 23:31

我真的希望默认情况下会启用intl扩展,这样需要UTF-8的人(不是所有人吗?)不必与主机争吵就可以使字符串函数表现出预期的效果。

– EmilStenström
2010-12-19 12:19

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

– EmilStenström
2010-12-19 12:20

这绝对是我希望看到的一个改进领域。

–内森·奥斯曼(Nathan Osman)
2010-12-27 at 0:27

#9 楼

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

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


等。

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

评论


,这正是我的目标。

– Kemo
2010-12-18 22:44

subject-> verb(object),使参数顺序更容易记住。

–唐明
2010-12-30 4:09

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

–心怀不满的山羊
2011年1月6日17:22

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

– Tgr
11年4月16日在16:37

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

– rjmunro
2011年4月16日23:50

#10 楼

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

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

3)特性/杂项,但我听说这些正在发展中。

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

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

评论


我讨厌不得不创建一个create()方法,该方法对解决#1并没有什么特别的作用!

–艾伦·皮尔斯(Alan Pearce)
2010-12-20 11:30

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

–dukeofgaming
2010-12-21在2:23



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

–菲尔St鱼
2010-12-21 11:52

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

– kguest
2010-12-25 22:55

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

– StasM
2012年4月13日19:44

#11 楼

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

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

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

签名,

GrandmasterB

ps:不要听跟这里其他人说的一样,我一年四季都很友善

评论


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

–乔什·K(Josh K)
2010-12-17 22:46

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

– geekbrit
2010-12-18 19:23

3没有意义-对于MVC框架中的任何V,都必须嵌入标签。

– Alex
2010-12-18 23:05

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

–斯蒂芬
2010-12-21 22:50



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

–安德鲁(Andrew)
2011-1-28 14:50

#12 楼

E_ERROR的ini指令基于未定义的常量,而不是假设它是带有E_NOTICE的字符串。

评论


顺便说一句,类常量就是这样做的。

– StasM
2010-12-18 22:40

严重的是,我不明白为什么他们让PHP使用未加引号的字符串。这是有史以来最愚蠢的事情。我会选择E_ERROR或E_PARSE。

– BoltClock
2010-12-18 23:02



#13 楼



引用我们深爱的Jeff Atwood:PHP很烂,但这并不重要!

评论


我原则上同意,但不知道在实践中如何做:)

– StasM
2010-12-18 22:47

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

–MichałT
2010-12-20 15:15

#14 楼

字符串应该是对象

评论


我希望我可以不止一次投票。

– EricBoersma
11年6月24日在20:54

#15 楼

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)停止进行奇怪的自动类型转换。例如,如果不首先将其显式类型转换为字符串,就不能对SimpleXMLElement对象进行echo。或至少在发生时(例如,在严格模式下或error_reporting(-1)处于何种模式下)抛出一些东西。

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

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

11)官方支持的交互式PHP shell,例如IRB。 Facebook有一个用Python编写的名为phpsh,但它缺乏我想看到的润色。

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

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

评论


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

–极光
2011年6月3日7:24



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

–瑞安·帕曼(Ryan Parman)
2011年6月10日21:27

#16 楼

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'视为真实

评论


我认为对于(1)用迭代器和闭包烹饪的东西会更好。

– StasM
2010-12-18 23:02

+1恕我直言,它应该包含在所有语言以及迭代器中。它们只是不使用有用的方法。

–伊文·普莱斯
2011年1月12日15:30

empty()与if($ x)在逻辑上相反,因此可以理解empty('0')为true,因为if('0')为false。唯一的区别是,如果未设置变量,则empty()不会发出通知。

–安德鲁(Andrew)
2011-1-28 14:55



#17 楼

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

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

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

New Idea !!

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

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

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

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

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

阴和阳都知道!

评论


+1决赛。需要说明的是:final表示变量的值可以在运行时设置(与常量不同,常量必须是常量表达式),但是只能设置一次。另请参见C#的只读。

– davidtbernal
2010-12-18 19:45

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

– StasM
2010-12-18 22:45

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

–心怀不满的山羊
2011年1月6日17:24

#18 楼

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


评论


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

– StasM
2010-12-18 22:59

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

–MichałT
2010-12-20在16:16



#19 楼

语言语法:pihipi和phpreboot中有一些开发人员感兴趣的线索(尽管phpreboot远远超过了JS)。

开发方法:如果使用以下方法,它将大大提高PHP.net的寿命实际上已经考虑了此类调查。

不要再做出下午下午的IRC会话语法决定了。

个人功能:之前已经提到过一些功能,但是我会很高兴在这里烧掉一些因果报应,从而更加直白:


Unicode字符串类型。
Bigint(请参阅Python)。
内置的Runkit可以删除/重命名/覆盖内置的函数和类,而这些函数和类并非总是设计得很好。 >现代的OOP

多重继承(而不是复杂性以支持很少的具有笨拙特征语法的边缘情况)
标量可以兼作对象(请参阅Python),例如array()用作ArrayObject,或字符串用作SplString(需要可用的方法,所有字符串函数都应作为str::toupper()可用)。




废弃糟糕的\命名空间语法,修复解析器,并采用::作为替代。您知道的,就像一种真正的语言。
LINQ的任何变体(尽管我不相信你们都设计出了明智的语法)
或XML常量。
摆脱php.ini运行时行为和语义转换。它确实消除了一些激动,但确实会使开发人员和用户受益。
是的,magic_quotes还没有消失。
将Zend Engine字节码转换为PBC

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

评论


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

– StasM
2010-12-19 9:46



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

–马里奥
2010年12月19日10:00

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

–MichałT
2010-12-20在16:29

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

–马里奥
2010-12-20在16:39



+ 1000000用于多重继承。

–ts01
2010-12-25 1:25

#20 楼

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

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

评论


引擎中已经对此提供了支持,许多扩展程序都在使用它。您也可以使用set_error_handler()和ErrorException轻松地做到这一点。不过请注意E_STRICT / E_NOTICE / E_DEPRECATED ...

– StasM
2010-12-18 22:56

我很清楚这些方法,而且它们确实很hacky。我喜欢一种统一的方式-包括E_STRICT / E_NOTICE的方式。

– Alex
2010-12-22在20:47

#21 楼

PHP非常适合我,因为它可以用来打开中小型网站。我必须有点想像力,我唯一想出的回应这个问题的方法是使它可以更好地适应高流量的站点。

我在思考产生的问题进程转移到其他内核,例如在一个进程中更新数据库,而在另一个进程中创建输出页面。谷歌快速搜索表明可以模拟,但是目前尚不直接在php中支持。

评论


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

– StasM
2010-12-17 21:40

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

– geekbrit
2010-12-17 21:41



#22 楼

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

评论


是的,请输入类型转换的魔术方法。

–MichałT
2010-12-18 23:57

#23 楼


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


评论


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

–杰里米
2010-12-20 21:49

#24 楼

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

评论


某种形式的投票/否决功能以及链接到回复中原始评论的功能肯定会很好。

– Tgr
11年4月16日在16:54

#25 楼

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通常用于列表类型数据结构的操作和在这方面拥有一整套工具将很有用。

评论


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

– kguest
2010-12-25 23:14



#26 楼

运算符重载:

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


评论


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

– BoltClock
2010-12-18 23:07

也许应该通过魔术方法完成,例如__add($ obj),__ times($ obj)等。

–MichałT
2010-12-20 16:20

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

– Xananax
2011年6月22日13:45

#27 楼

添加异常而不是生成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和字符串嗅探已产生的错误(权限,错误的文件名或其他任何内容;我不介意此处的其他错误源),以便引发正确的异常。

我还没有解释为什么它很重要。当我发现它确实发生时,我以为是愚人节。

评论


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

– Reece45
2011年1月1日,0:15

#28 楼


巩固对象模型-使所有对象扩展基本的Object类。 Object类将(除其他事项外)实现所有魔术方法(因此它们不再是魔术!)
将扩展名移动到其自己的名称空间-整理全局名称空间
$conn = new \MySQLi\Connection();
Un -削弱spl_autoload()功能!认真地说,这可能是PHP的最大功能之一,同时也是最无用的功能。 spl_autoload是默认的自动加载器,支持名称空间和多个文件扩展名,但由于某些未知原因,要求文件名小写。对此有一个错误报告,但是工作人员答复说,由于向后兼容,他们不会修复它。是的...并不是每个框架都附带有它自己的自动加载器,因为默认的自动加载器已损坏!


#29 楼

大文件支持。很高兴吗?

请参阅http://bugs.php.net/bug.php?id=27792(尽管可能还有更多需要注意的领域/功能)。

#30 楼

将taint支持升级到最新版本并将其包含在标准版本中,最好在默认配置中启用http://wiki.php.net/rfc/taint

这将防止XSS和SQL注入攻击通过使人们正确编码。