it-swarm.cn

您想在PHP中拥有哪些功能?

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

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

有人有美好的祝愿吗?

Mod编辑: Stanislav Malyshev 是一个核心PHP开发人员。

88
StasM

我不介意命名参数。

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开发人员 把这个想法记下来 已经。

119

取消引用:

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?
93
Annika Backstrom

与PHP)一起工作了大约13年,并且与JS一起工作了大约4年之后,我认为有几件事PHP :

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)当前提供的解决方案令人困惑,并且常常表现不佳。 PHP程序员。

感谢您的询问!

72
Funkatron

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

  1. 数组的语法较短。 PHP数组由于具有灵活性而成为该语言最强大的功能之一,但是编写some_array_method($argity, array('key' => $value));却很费力。我认为很遗憾,该建议已在PHP邮件列表中删除。
  2. finally support
  3. 属性/注释。这些允许您以允许代码重用的方式向方法中添加自定义行为。例如,在MVC框架中,可以定义AuthorizeAttribute,该__ $$ var__表示控制器或操作方法需要授权用户。框架本身将负责查找属性并相应地对其进行操作。我相信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
davidtbernal

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

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

48
Keyo

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

40
Nick Berardi

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

38
ruurd

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

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

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

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

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

34
Emil Stenström

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

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

等等.

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

32
rjmunro

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

2)如果您曾经使用过Ruby,以及最近使用过的节点,那么它们都具有出色的交互式Shell(IRB)。我希望PHP拥有一个实际上有用的。

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

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

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

24
Jakefolio

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

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

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

签,

大师B

ps:不要听别人在这里说的话,我一年四季都很好

20
GrandmasterB

针对未定义常量的E_ERROR的ini指令,而不是假定它是E_NOTICE的字符串。

18
Annika Backstrom

通过深思熟虑的命名约定对新来者有意义的规范化全局名称空间!

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

14
David Murdoch

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)常量(全局和类)的docblock注释的支持,以及(b)对将类似PHPDoc的注释解析为合理的数据结构的支持。有一个名为“ docblock”的PECL软件包试图做到这一点,但作者似乎并没有走得太远。

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

13
Ryan Parman

字符串 应该是对象

13
Kemo

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

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

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

新主意!!

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

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

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

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

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

它的阴和阳都知道!

12
Dave B.

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

12
sfrench

我最大的两个希望是成为一名铁杆PHP程序员:

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

语言语法pihipiphpreboot 有一些很好的线索表明开发人员对什么感兴趣(尽管phpreboot成为JS太过分了)。

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

个别功能:之前已经提到过一些,但是我会很高兴在这里烧掉一些业力,以防钝器:

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

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

9
mario

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

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

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

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

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

7
geekbrit

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

7
pestaa

http://php.net 上清除“用户提供的注释”。有时它们确实是一团糟,但总体上还是很有价值的。

6
bobah

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通常用于列表类型数据结构操作,并且在其中具有全套工具考虑会很有用。

5
Orbling

运算符重载:

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

大文件支持。好吗?

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

4
Don MacAskill

添加异常而不是生成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” ...当我发现它确实发生时,我以为是愚人节。

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

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

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

4
Mchl

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

通过正确地编写人员代码,可以防止XSS和SQL注入攻击。

4
rjmunro

PHP的注释会很棒,一个功能将在未来几年中脱颖而出。该功能将有助于编写具有清晰代码的大型框架。

3
user10916

我希望看到elsewhileforforeach子句。例如。:

while (/*condition*/) {
   /* display each result */
}
else {
   /* condition was never true; display "no results found" message */
}

仅当else的条件为从不 true时,才执行while块。

这样就可以了,因此您无需跟踪布尔标志,也许可以帮助您考虑边界情况和可能的错误情况。

3
Macneil

不要摆脱短的开放标签,特别是回声一个=(。这:

<?=$myvar?>

...比这更好:

<?php echo $myvar;?>
3
dukeofgaming
  1. 我希望有一天可以看到数据类型,但是我也很喜欢不必处理数据类型的简单性,这对我来说是一把双刃剑。
  2. 命名空间
  3. 使用不同方法签名重载函数调用
  4. PHPUnit是对单元测试和代码注入的更好支持,它是一个了不起的工具,Symfony代码注入框架也确实产生了奇迹……但是它们都有自己的学习曲线。
3
cdnicoll

似乎没有人提到可选类型安全

能够编写如下代码将是很棒的:

<?php
$someVariable = 123;
$someVariable = "Hello World";

int $anotherVariable = 123;
////$anotherVariable  = "Hello"; // This must cause runtime exception.
////int $lastVariable = "World"; // This must cause it too.
?>

另一个例子:

<?php
// Current style (which must remain).
function SayHello($howManyTimes)
{
    if (!is_int($howManyTimes))
    {
        throw new Exception('Argument $howManyTimes is invalid. An integer was expected, instead of ' . gettype($howManyTimes) . '.');
    }

    echo str_repeat('Hello', $howManyTimes);
}

// New, optional, style, allowing to have a shorter code.
function SayWorld(int $howManyTimes)
{
    echo str_repeat('World', $howManyTimes);
}

SayHello(123);
SayHello("Hello World");

SayWorld(123);
////SayWorld("Hello World"); // This must cause runtime exception.
?>
2
Arseni Mourzenko

允许通过include调用为文件命名空间,如下所示

include('mytemplate.php', 'MyNamespace');

要么

include 'mytemplate.php' use MyNamespace;

并开始允许我们导入(“使用”)没有前缀的名称空间:

use OtherNamespace as self;

(而不是必须导入每个单独的类才能在没有名称空间前缀的情况下使用它)

2
user11122
  • 非阻塞SQL查询(例如插入一些日志,但不要等待查询结果)
  • 并行SQL查询

只是个梦

2
Erlango

发电机。与Python中一样,具有收益。

2
ts01

能够在__destructor或__toString中引发异常。而且,实际上,有什么解释为什么不可能做到这一点?

2
ts01

允许在方法中将参数的原始类型(布尔型,整数型,浮点型,双精度型,字符串型,对象型)设置为数组,那就太好了。

例:

  • 当前:

    class HttpResponse {
    public function __construct($version, $statuscode = HttpStatus::OK, HttpResponseHeaders $headers = array(), $body = '');
    

    }

  • 希望:

    class HttpResponse { public function __construct($version, integer $statuscode = HttpStatus::OK, HttpResponseHeaders $headers = array(), string $body = ''); }
    

我认为也可以使用一个Assert静态类。

2
user11251

支持所有类型的类型提示,并为每种可能的类型提供_toXXX魔术方法。 (php常用用法会导致恕我直言,而不是限制类型的杂耍/带有一些例外,例如转换float <-> int /)

2
ts01

绝对可以使用类型提示来区分方法签名,从而实现方法重载。更进一步,我希望看到某种ASP.NET样式的“属性”,以便我在PHP MVC框架)中的控制器动作如下所示:

/* [HttpGet] */
public function login() {}

/* [HttpPost] */
public function login() {}
2
TaylorOtwell

PHP需要一个不变的Unicode字符串类。确保输入字符串是有效的,标准化的UTF-8,并且保持有效应该是不重要的。

$str = new Utf8String('āll īs ōk');
$str = $str->ucwords(); // Āll Īs Ōk
$str = $str->strtolower()->toAscii(); // all is ok
(string) $str; // UTF-8 bytes

我基于 PHP-UTF8 做了 prototype

2
Steve Clay

本地正则表达式文字,Perl风格的_qw{}_,_qq{}_和_q{}_引号。

所有对象的链接方法调用:$object{ ->method1(); ->method2(); ->getPerson()->getName(); }

语句表达式:_({echo $a; $a = $a + 1; $a})_

一致,不可配置,无法关闭_short_open_tags_。如果它们不是可配置的,则PHP代码将更可移植。请参见包括 [〜#〜] erb [〜#〜] 样式标记的代码

1
Ming-Tang
  • 我希望看到一种本机方式,可以根据域名自动在虚拟主机中设置open_basedir,而不必为每个主机配置一个指令(类似于Jason Greene补丁,但本机)。

  • 请,应用程序范围的全局变量!一旦初始化,应用程序全局变量将可用于所有php脚本。

  • 在不关闭其他线程的情况下释放会话的某种方法:

 session_start(); 
 $ _ SESSION ['favcolor'] ='white'; 
 session_flush(); //会话现在已解除阻塞,因此其他线程可以使用它
 //巨大的循环... 
 $ _ SESSION ['taste'] ='sweet'; //会话会再次自动阻止
 session_close(); 
  • 也许某些磁盘缓存会很好,所以我们可以手动预编译php脚本以加快执行速度。与内存缓存类似,但是具有磁盘上的文件和手动生成的文件(可能使用一些新的文件扩展名)。

  • 另外,类似于<?php = $ variable?>的东西,作为<?php echo $ variable的快捷方式; ?>会很好(与asp标记中一样,但是禁用了short/asp标记)。

1
Bacco

显然是get_shutdown_functions()和unregister_shutdown_function()。目前尚无办法。更一般地说,是对回调堆栈的一些抽象支持-统一spl_autoloads,关闭函数,错误处理程序(当前无法堆栈,但可能...)等。诸如此类的register_callback($ callback,$ stack)等由php或用户本身调用的预定义堆栈(“自动加载”,“关闭”,“错误” ...)。

1
ts01

为使用资源(curl,ftp,Gd2 ...)的扩展添加对象包装。喜欢

 $oFtp = new Ftp();

 $oFtp->connect();

 $oFtp->close();
1
ts01
  • lambda的词法范围(使用另一个关键字,然后使用函数)(或使用块语法创建适当的词法范围?)
  • 使对象属性中的lambda可调用
  • 总是用分号括起来的冒号
  • 他妈的添加use()正常功能!
  • 特质
  • 拦截instanceof/is_a()的能力
  • 发电机
  • 打开用于运行时修改的异常
  • 无需执行即可检查接口的功能
1
alan blaire

我的前两个烦恼与PHP无关,但与它的隐含用法约定有关。

  1. 库代码(例如PEAR/Horde/Zend/etc。)的文件扩展名应以_.phps_而不是_.php_结尾。这样做的好处是,它可以清楚地区分要运行的代码和要包含的代码,并且可选地,所有(您的)代码都可以从服务器上很好地读取/浏览。另外,spl_filename_extensions()可以在自动装带器中使用,以方便其他人使用。

  2. 约定(在文档中)是_::_同时用于静态方法和实例方法,如果它们将_::_用于静态方法并将_->_用于实例方法,我将不胜感激。作为一个好的约定,在解释方面仍然会有错误的余地,但是至少更清楚了。

仅举几例,我还希望看到以下内容:

  1. Reflection *的getDocComment(或名称或自变量的另一个变体)应该更加自由,并且仅获得上述类型上方的第一个注释(直到空格)。换句话说:我不喜欢冗长的(阅读:吃线)文档,而我实际上只是想能够以任何一种注释类型提供最低限度的内容:_//_,_#_或_/* ... */_。

  2. 使用的名称空间列表,例如getdefinednamespaces()

  3. 未定义常量的行为应通过ini指令更改,例如空字符串或致命错误。但是,永远不要将其隐式转换为字符串! (就像javascript中的;一样)。

  4. 常量___CLASS___也应该像这样(称为静态)_stdClass::__CLASS__ == '\stdClass'_自动工作。换句话说,我不想使用字符串来引用类,而是要使用类及其魔术常数___CLASS___来引用它。 (是的,这是一个idefix)

  5. 类型转换和魔术方法__fromType($instancetype)__toType($type)。因此,可以将一个对象强制转换为整数:$y = (int) $x或另一个对象$y = (BeanWrap) $x。不过,执行此操作意味着在涵盖八种不同类型的十二个可用转换中,这些转换的名称不再可用作类名(例如,int,binary,boolean)。

1
23JUL

当我看到此主题时,我认为提到我遇到的一些文章会很有用。

  1. Groovy的Groovy的?。 PHP中的运算符: http://justafewlines.com/2009/10/groovys-operator-in-php-sort-of/
  2. 改善封闭性: http://justafewlines.com/2009/10/whats-wrong-with-php-closures/
1
Alexey Shein

足够明智地not打破向后兼容性。我已经很困难地了解到goto作为关键字的存在,我将其用作方法名称,因此php 5.3的代码更新花费了2到3个小时。

类的角色之类的东西可以很好地添加到对象系统中。没什么复杂的。

class abc { use xyz::method; use uvw::__all; }

这将从类xyz中选择方法方法,并从类uvm中选择所有方法。

构造函数调用应在创建后立即用作对象。

new goodie()->youp();
1
giftnuss
  1. 让标量像对象一样对待。如果我尝试执行$ scalar-> toLower();为什么告诉我我错了?为什么不只是暂时将其强制转换为“标量”对象类型,然后移至“未定义的方法”(也许不将其设置为null)?

  2. 从用户空间删除资源。 PHP现在有对象。现在,作为资源的所有内容都可以放在对象包装中,将其隐藏为私有属性。可能需要为__sleep()和__wakeup()添加功能。大多数资源可以轻松地以“类似”状态重新创建。即使它们不能,PDO对象也不能序列化:我认为其他对象也可以做到这一点。

  3. 让实际的[PHP社区对其代码进行投票:允许我们重新定义现有的方法,类和函数。坏代码会腐烂,就像Javascript一样。它将使使用PHP的人们知道他们需要什么,而不必一直猜测。最可能需要考虑使用/替代的功能。

    这还具有使PHP社区涉及UTF(希望是UTF-8)问题的副作用。 PHP开发人员不必使用系统范围的设置来打开或关闭unicode,而是可以覆盖仅适用于其应用程序的功能。

  4. 使_为隐式名称空间分隔符。自PHP5以来,人们一直在使用它,因此如果PHP 5.3,则使人们无需编写代码即可构建代码。我不知道它的复杂性。我知道最初对使用类名称如Zend_Exception的代码有所考虑:允许它,开发人员将始终必须以Zend_Exception或\ Zend\Exception的方式对其进行访问,而从不使用Exception。将其视为全名,而不只是一部分。

  5. 面向对象:从Javascript/Actionscript/Python中获取一些提示。特性看起来很有前途,但是在运行时动态更改类型会很棒。

  6. 属性:我看到有关属性的讨论正在进行中,请动态实现它们。 PHP应该是一种动态语言。我们应该能够在运行时定义属性(几乎所有内容)。

  7. 将常量视为它们的用途:全局变量。类/函数/命名空间都符合此要求。也许当每个人都开始意识到自己现在都是全局变量时,将会有更多的想法来解决存在如此多的全局变量/常量的问题。

  8. JIT编译:JavaScript可以做到,而且速度超快。 PHP是此脚本中为数不多的几个之一。

  9. PHP应该针对“超文本”进行了优化,但是没有简单的方法可以避免此类输出。就个人而言,我将重新定义“打印”以执行htmlspecialchars()。总体而言,它可能只需要是printh或echoh。

  10. 简化php.ini。 php.ini适用于系统管理员,而非开发人员。删除短标签的不兼容之处,修复它们或将其删除。系统管理员无法为整个系统打开/关闭语言功能,这很烦人。尝试分发软件时,请解决它们。

  11. 在请求周期结束后(对于FastCGI和Apache),允许PHP开发人员存在。通过API公开它。允许系统管理员禁用或限制此设置。 (要求php程序在10秒内将控制权返回给调度程序,否则它将失去其持久状态)。

  12. 使PHP为通用编程语言。 <?php标签很烦人:当您检测到!#/ ...时,不需要它.

  13. 创建对象{}和arrays []的缩写,Taje看一看 PiHiPi ,他们实现了这一点以及许多其他简单的语法糖。

    14:允许[]访问对象的属性和功能。功能和类现在是一等公民,对吗?使[]是事实上的方法(例如javascript/actionscript),用于动态访问对象上的内容。

  14. 允许PHP代码为PHP模块。我不必只是学习C就可以在多个进程中使我的库在系统范围内可用。让PHP社区进一步弄清楚这一点。

  15. 与其从Java/C中汲取灵感,不如从Java,Actionscript和Python等动态语言中汲取更多灵感。下面列出了更具体的功能。

  16. 致命错误:为什么大多数错误仍然无法恢复?我喜欢在日志文件中记录错误的概念(在非常高的级别上实现)。我不喜欢总是听到有关“白页”的信息。为了避免这些情况,我在代码中做了很多检查和声明:但是当有人向我的函数传递null而不是对象时,上帝禁止PHP可以从这种灾难中恢复,而无需让我执行is_null()我自己。当然,这是一个错误,大多数其他语言都称其为NullReferenceError/Exception似乎很愚蠢,可以处理和呈现的不只是白屏。

    至少,不要添加致命错误。我可以升级很多运行PHP 5.2的服务器,但是我不能:因为我没有时间去检查每台服务器上的〜200个站点来修复旧代码。您添加的新的致命错误越少,就越有可能使人们开始使用新版本的PHP。

    尽可能多地从语言中删除致命错误。 PHP应该是一种动态语言:为什么其他所有语言都可以从大多数错误中恢复PHP认为是致命的?程序员可以解决错误,但如果程序在大多数语言认为NullReferenceException之后被强制终止,则无法解决。

  17. 使异常可恢复。因此,我们可以更轻松地混合异常和错误。

  18. (最耗时且不太可能)将语言讨论,API /模块讨论和解释器讨论分开。他们不应该像现在这样整合。当前解释器的问题应在最后解决。 Pypy/Parrot/JVM全部支持多种语言。 V8不能,但是它的速度足够快,以至于有些人正在努力将其他语言编译成JavaScript以在V8上运行并利用其功能。

    作为解释器/运行时/ vm,开发目标与语言略有不同。使用PHP,感觉好像它们是同一个人。因此,在将所有语言设计讨论与PHP解释器讨论混在一起时,尝试开发其他解释器的人很难跟上讨论的步伐。

    作为口译员,我认为口译员支持的语言越多越好。为什么我们不能使用<?python或<?javascript或<?actionscript。我已经厌倦了用另一种语言重写代码,因此可以在那里使用它。有些人已经在尝试这样做,这可能会得到社区其他领域的支持。

1
Reece45

我的第一特点是

运算符重载

在我看来,可以通过创建自己的包装器类来解决此处要求的一种重复功能,即将本机类型作为对象。我为我的项目开发了一个arrayData对象,一个stringData对象,一个intData对象,等等……这解决了:

  • 强类型化:由于这些是自定义类,因此可以强制执行
  • 类型重载:我可以向arrayData类添加所需的任何方法
  • 类型转换:我的每个类都有-> toArray(),-> toInt(),-> __ toString()方法,依此类推
  • html在模板中转义(字符串是扩展stringData类的userStringData类)。
  • 除非另有说明,否则值始终通过引用传递
  • 创建一个intData('string')会引发异常。
  • 等(福利列表仍然非常长)

恕我直言,这比作为对象的本机类型更有利,因为您可以拥有所需数量的确切方法,并可以按自己的喜好调用它们。

但是我非常想念的是在对象上使用本机运算符的能力。感谢arrayAccess,我可以使用[]运算符。但是我不能使用“ +”,“-”等。如果可以的话,我可以使用stringData + stringData(相当于$ string。$ string)或stringData-stringData(相当于str_replace($ str,' ',$ string)),或将我的类型与“>”和“ <=” ...
我当前的实现使用$ intData-> add($ n),$ intData-> substract($ n)等。繁琐,特别是在您可能期望本机int或intData对象的函数中。这意味着我必须在每个函数中检查instanceOf。

换句话说,尽管我的类已经准备好,已经优化并且很不错,但是在我可以重载运算符之前,它们不过是概念的证明而已。在实际项目中使用它们很烦人。

0
Xananax

公开zval参考计数。 (是的,我们可以使用 xdebug_debug_zval ,但是在活动站点上启用Xdebug,请点击。)用例:活动记录对象存储-您具有与外部资源(例如数据库行)相对应的模型,并且负责修改这些资源。对于同一个资源具有两个单独的对象表示形式将很糟糕(由于冲突的写入等导致数据丢失),因此我们需要某种类型的缓存,如果已经加载了所请求的资源,则可以返回该模型。但是,那会杀死垃圾回收:对模型对象的最后引用将始终保留在缓存中,因此,在诸如大型数据库查询或大型目录之类的大量资源中进行迭代将很快耗尽内存。如果可以检查对象存储库是否只有一个对存储对象的引用(存储库本身),并在这种情况下销毁它,则可以避免这种情况。

0
Tgr

我需要php中的一些erlang功能:

  • 热门代码加载
  • 原子数
  • 模式匹配(包括函数名称,匹配语句,例如:case)

使用字节码:保存,加载,删除等...

灵活的嵌入系统

0
Dan

我喜欢最近几天的php进度和可伸缩性。

Java)中引入的新功能只会使事情变得复杂,而使其变得简单。

请求1:db-connection-pool工具作为附加库。

要求2:

我要求反向ajax或Comet编程或RTMP工具作为内置库。这些已经为.net,Java,python和Perl由dojo Foundation开发

我们在php中有类似的事情,但是还没有完整的解决方案。

  1. SPL中也支持观察者模式。但没有正确记录。
  2. Xajax框架(很好,但需要重新设计应用程序)

暂时再见。

0
Shashank

一些让我开心的事情

  • Sane内置函数的命名约定。
  • 输入字符串和数字的提示
  • 返回类型提示
  • E_STRICT预设为开启
  • 特性,mixin和多重继承
  • 一切都是对象(即像Ruby一样的纯净)
  • 向命名空间添加::支持
  • 更好的Windows支持
  • 开箱即用的测试
  • 有关exec()工作不足的更好文档
  • 通过实时搜索重新设计php.net
  • 像Xdebug这样的功能
  • PEAR可移植性的改进-Ruby gem的用户应该知道
0
Grayson

我真的很想有注释。afaik RFC已被删除。

0
crystal88_
  • UTF-8支持
  • 使语言完全面向对象,借用Ruby和Python概念是一切都是对象。我有点喜欢自动装箱rfc。)但是它给了太多的自由对于开发人员来说,这不是很好,但是由于某些限制,它可能是语言发展的不错的补充。

$ x = array(5,60,50,50); $ x-> map(function($ i){return $ i * 2;})-> Push(10);

$ p =“某些字符串”; $ q = $ p-> substring(0,10);

等等.

我认为这可以在不破坏当前全局功能的情况下完成。但是,它们中的大多数将变得无用,并且随着时间的推移可能会被弃用。

  • 数组的简短表示法会很不错,但对于语言而言并不重要。
0
Josh Scott

能够使用在foreach循环中扩展了iterable的类是很不错的,您可以在其中传递对循环的引用:

 foreach(&$ myclass as $ me){
 echo $ me; 
} 

我没有花很多时间研究为什么它目前不起作用,这可能与可迭代的工作方式有关,我没有做太多的研究,而不仅仅是注意到它不起作用。

0
gabe.

更快的函数调用

我们有call_user_func($f,$a1,$aN),但已被$f($a1,$aN)取代。但是,call_user_func_array($f,$args)没有这样的东西。

我的建议是为此创建特定的语言语法,例如_$f{$args}_。每个人都应远离_call_user_func*_的原因是,从某种意义上说,他们有更好的选择,他们的速度极其缓慢且难看。

对象清除语法

现在,要即时创建对象,您需要:_(object)array('prop'=>'value');_。按照约定,我们还应该有object('prop'=>'value');。此外,类似于JSON,短语法也很方便。

所有类型的万物魔术方法

现在,我们有了__toString(),还有许多建议的___toInt_/___toFloat_/etc。我的建议是实现__toType()__typecast(),这是第一个参数,传递了所需的数据类型,例如:

_class Test {
    public function __toType($type){
        switch($type){
            case 'integer':
                return (int)$this->age;
            case 'string':
                return $this->age.' years';
            default:
                throw new EUnsupportedTypeException();
        }
    }
}
_

如果我们想更具体一点,可以在$ type之后添加另一个参数,即$ class。因此,您可以:if($class=='person')return new Person($this->age);

在foreach中指定数据类型

当前,您可以指定PHP函数参数的数据类型,如下所示:

_public function say_hello_to(UserClass $user){
    $this->say('Hello, '.$user->name.'!');
}
_

在foreach中也可以做到这一点:

_public function on_enter_office(){
    foreach($users as UserClass $user) // <- See UserClass here?
        $user>say_hello_to($this);
}
_

当前的“修复”正在使用闭包,如下所示:

_public function on_enter_office(){
    $users->each(function(UserClass $user){
        $user>say_hello_to($this);
    });
}
_

该修补程序需要更多的资源,更多的文字并弄乱了范围,因此,为什么本机解决方案比当前的修补程序更容易,更干净,甚至更快。

视情况而定

对于许多人来说,这可能不是一个有用的功能,但这是使正在运行的代码保持在最低限度的好方法,即使它与旧系统兼容也可以使执行速度更快。考虑以下代码:

if(!function_exists('json_encode')){function json_encode($ value,$ options = 0){//遗留代码}}

  • _// legacy code_部分仍被解析,因此其中的任何错误都将导致PHP退出)。
  • 解析它也会使PHP=)变慢,即使根本不需要它也是如此。
  • 该代码对开发人员不直观
  • 任何IDE)解析引擎都会感到困惑,因为它们会忽略if语句并最终将函数列出两次。

解决办法?条件编译:

_#if PHP_VERSION<5.2
function json_encode($value, $options=0){
    // legacy code
}
#endif
_
0
Christian

包括更好的超文本链接支持,即可用于更改浏览器当前uri的函数/类方法。或创建一个全新的。使用$ _SERVER ['REQUEST_URI'] || $ _SERVER ['PATH_INFO']了解请求的资源。这可能使开发REST应用程序的工作变得更容易。 (根据rfc的UriScheme及其默认方案实现,也许可以实现扩展UriBase的其他UriSchemes)

提供类似UriResource类的东西,以一种也可以使客户端的HTTP请求受益的方式启用小的功能片段请求。

制作一个可以在模板之前和之后调用的函数,从而在这两个函数调用之间启用短标签。在这些函数调用之间,唯一可用的变量是那些传递给第一个函数调用的变量(作为关联数组(使用extract))。这可能会简化php本身(无框架框架)中的模板开发。无框架PHP MVC框架

总而言之,我认为许多php框架具有某些相似之处,可以很容易地以一种通用方式将它们集成到php中。

但是whoami :)

0
immeëmosol
  1. 不可变值对象
  2. 匿名类和/或作为对象的类
  3. 等效于字符串数据类型的内置对象(前面提到)
  4. 注释或类似Python的装饰器
  5. 像Scala中的Singleton对象
  6. 默认错误为例外(前面已提到)
  7. UTF8支持
  8. 去除全局等
  9. 统一访问原则-一种调用对象方法和操作属性的方法(请参阅Scala)
0
sokzzuka