为什么PHP函数签名如此不一致?[关闭]


17

我正在查看一些PHP函数,但我不禁注意到以下内容:

<?php
function foo(&$var) { }

foo($a); // $a is "created" and assigned to null

$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)

$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>

注意array_key_exists()property_exists()功能。在第一个中,属性名(数组的键)是第一个参数,而在第二个中,属性名是第二个参数。凭直觉,人们会期望它们具有相似的签名。这可能会导致混淆,并且通过进行此类更正可能会浪费显影时间。

PHP或任何与此相关的语言是否不应该考虑使相关功能的签名保持一致?


2
+1 bravo,这是我注意到的关于php的第一件事,并且总是令人讨厌
Kevin

嗯 使用IDE。
Ben Dubuisson

Answers:


10

您建议的实质上是将签名更改为许多现有功能。想一想,这会对现有代码产生什么影响。现在假设PHP组已经发布了PHP版本N,该版本更改了30%的功能的签名。现在想象一下,您必须编写同时在PHP vN和PHP v。{N-1}上运行的代码-那会带来多少乐趣?

现在,假设您是托管服务商或公司数据中心经理-您将有什么动力来支持PHP vN,前提是一旦您切换,所有代码都将被破坏并且用户将带着干草叉和火把来到您的办公室?


4
+1一旦以错误的方式开始尝试,就很难了,但是在当前状态下拥有如此庞大的用户群。
安迪·弗莱明

4
那是个很好的观点。我实际上已经意识到了这一点,但是我的主要观点是他们应该首先意识到这一点。
Shamim Hafiz 2010年

7
@Shamim True,这就是为什么PHP信誉不好的原因之一;)
Andy Fleming 2010年

1
PHP就像很多东西一样,最初只是一个解决小问题的小工具,如果一个人可以对它进行“适当”的设计,那么它可能会比它更好,但也许并没有达到目的,所以没人会使用它...还有另一个小工具“ won”,一种具有不同不一致的工具...
johannes

3
这就是为什么存在过时的原因。您创建了新的标准化名称,并弃用了旧的“ salad-bar”功能名称,但将其保留了几个版本。在某个广为人知的点上,您推出了一个新的主版本,该版本不再支持它们。这就是这样做的方式。在PHP开发人员方面,他们没有做到这一点纯属怯ward。他们的入门门槛低,使PHP领先于其他Web语言,并且他们因此而获得了成功,因此他们不必不断改进核心语言。
丹·雷

10

因为PHP是没有任何规范的语言。

实际上,每个人都可以添加几个功能,一开始就没有一致性的问题。所以,一团糟。


并非每个人都可以添加功能
StasM 2010年

@StasM:DEV组谁可以?我可以找到该小组如何运作的任何链接吗?
Shamim Hafiz 2010年

@StasM:好的,我有点夸张了。真正的问题是自开始以来缺乏约定,或者一个人负责代码凝聚。现在为时已晚。我怀疑如果不从字面上分叉PHP作为另一种语言是否可以更改它。
ts01 2010年

@Shamim Dev组的操作原则是两个:共识和信心。这很酷,但恐怕不足以促进良好的语言发展
ts01 2010年

@Shamim:从php.net和wiki.php.net开始。
StasM 2010年

4

大多数优秀的语言都在努力做到一致。

这只是PHP状态的现实。正如StasM所提到的,事实发生后尝试进行类似的转换将是一场噩梦。这会影响太多现有代码。PHP通常会简单地弃用函数并创建更新的更好的函数,这些函数更加一致,但这会花费很多时间。

我认为成功的PHP程序员要么记住特定的语法,要么使用自动告诉他们语法的软件。


弃用功能是一回事,容易做到这一点。更改参数顺序更加困难
ts01 2010年

@ ts01解决了基本问题。仅使用位置参数,就无法知道您的现有参数foo(a,b)现在是foo(b,a)因为有人更改了foo的签名。
Frank Shearar 2010年

@ ts01,@Frank:您也必须更改函数的名称……对于诸如“ property_exists”之类的东西来说,这不是一个特别好的主意,因为没有其他合适的名称。就个人而言,我希望看到数组变成实际的对象,所以您可以说,$array->key_exists('whatever')但是:-)
Dean Harding 2010年

实际上,任何PHP开发人员都可以做的就是创建自己的新函数来包装这些函数。还请注意,isset()对于上述两个示例均具有通用语法,但它们并不作为已编译规范的一部分而被弃用。
user1122069 '16

3

不一致的主要根源是,内置函数中的许多PHP(大多数?)实际上是一些C库的包装器。最初的想法是“我包装了C函数xxxx,因此我应该保持参数顺序相同”。在编写“纯PHP”函数时,这种想法已扩展为“ xxxx接受文件和选项,新函数接受了文件名和选项,因此让yyyy以相同的顺序接受相同的参数是有意义的。

这里最大的缺陷是底层的C库一开始就非常不一致。


他们还保留了在某些情况下要包装的C函数名(特别是str函数),而与其他函数名的C命名约定(如它们)大相径庭。
丹·雷

2

(a?)原因是要与以前的PHP版本保持兼容。无需更改会破坏许多应用程序的功能名称,而保留功能。但是,凭直觉,对于新语言,应该考虑一致的函数命名。

对于开发时间的浪费,我必须不同意您的看法。学习PHP可能需要花费更长的时间来理解某些函​​数的命名,但是一旦掌握(或至少意识到),这将成为一个问题。

兼容性>一致性(至少对于PHP)


1
其他语言,我可以编写而无需不断引用文档。PHP我总是要担心...这个函数的拼写是“ str_”还是仅仅是“ str”?是“ array_”之类的东西,还是我们不提及数组?给定字符串时,“ length()”会做什么?噢,天哪,不,我真正想要的是“ strlen()”……是“针,干草堆”还是“干草,针”?没有其他语言能使我理解所有这一切。
丹·雷

像您一样,我一直被@DanRay困扰。现在,我已经开始使用NetBeans PHP IDE,它为我提供了在编辑器中所需的确切信息。
deed02392
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.