浅论php5.4 的一些不足

在刚接触php 的时候, 我十分喜欢这种脚本语言, 因为它学习成本很低, hosting 也很方便. 但是我渐渐发觉, php 作为一种低端的脚本语言, 性能也不是很突出, 过程化的设计存在诸多缺陷, 而且在oop 之路上跌跌撞撞多年无甚建树. 与javascript 比较起来, php 至少在以下方面让我感到很不爽:

  1. 在设计之初就把”.” 号用于连接字符串, 导致对象成员只能用”->” 来调用.
  2. 变量要以”$” 开头, 使用不便而易出错.
  3. 不彻底的oop 设计, 导致众多内置函数名杂乱无章, 离开了手册就没法写东西.
  4. 不能省略句末”;” .
  5. 不能使用”[]” 和”{}” 等字面量来定义数组和对象 (php5.4 起可以使用[]).
  6. 函数不是一种数据类型 (php5.4 起函数可以作为数据类型).
  7. 函数与变量的命名过度割裂.

也许在php5.4 之前的版本里, 这最后一点不那么突出, 但是php5.4 开始把函数作为一种数据类型, 函数与变量之间的界限已经非常模糊了. 在这种情况下php 还继续用两种标准来限制函数名和变量名, 这显得非常滑稽可笑.

< ?php
	function a(){} //Works
	a = function(){}; //Error, illegal variable name.
?>
< ?php
	$a = function(){}; //Works
	function $a(){} //Error, illegal function name.
?>

< ?php
	$a = function(){};
	function a(){}
	var_dump($a); //Works
	var_dump(a); //Failed to access function a.
?>

我说, 这种命名限制对于一种语言来说到底有什么意义? 最后一个例子尤为可笑, php5.4 这种不彻底的革命, 把两种定义函数的方式区别对待, 目的是要让开发者们抛弃传统的 “function a(){}”, 转而使用更灵活的”$a = function(){};” ?

php5.4 在学习javascript 上所做出的改变值得肯定, 但仅仅这些不彻底的改变是不够的. 我希望php 能早日抛弃那些老旧的传统, 从下一个版本开始全面贯彻javascript 的设计思想.

本站文章除注明转载外,均为本站原创编译
转载请注明以下信息
文章转载自:鲁夫的爱 [ https://opengg.me/ ]
本文标题:浅论php5.4 的一些不足
本文地址:https://opengg.me/792/php54-not-perfect/

《浅论php5.4 的一些不足》有4个想法

  1. 在设计之初就把”.” 号用于连接字符串, 导致对象成员只能用”->” 来调用.
    ==>c++中没有用.来连接字符串,但依然使用的是->和::,PHP受c/c++的影响是非常严重的
    变量要以”$” 开头, 使用不便而易出错.
    ==>恰恰相反,我认为这是PHP中一个非常灵活的地方,给两个例子。
    $a = ‘b’; $b = 123; echo $$a; //123

    function hw(){ echo 123;}
    $a = ‘hw’;
    $a(); //123

    不彻底的oop 设计, 导致众多内置函数名杂乱无章, 离开了手册就没法写东西.
    ==>PHP4的OOP的确很不完善,但PHP5基本上都能实现了,只不过不是强制性的而已。函数命名很乱是PHP的一个遗留性问题,也是一个非常让人厌恶的问题,但似乎和OOP无关。

    不能省略句末”;” .
    ==>JS中虽然可以声落句末的;,但一直以来是不被推荐这么做的。

    p.s. 变量命名的函数可以被重新定义,但直接定义的不行。
    p.s.2 如果不支持lambda式的函数定义,我更倾向于变量名称和函数名称的标准分开,这样子看上去一目了然。

    1. 写惯了java 和js, 还真的很难接受-> .

      Variable variables 这个设计我很少用到, 我认为它会让人迷惑, 毕竟写代码的时候不能直接看到$$a 里的$a 到底是什么东西, 使用起来要非常小心.
      而且现在引入了lambda 之后, $a() 就很让人困惑了, 它到底是’func_name'() 还是(function some_func () {})() 呢?

      另一方面lambda 比之前的function_exists() create_function() 等更直观, 作为参数传递的时候你不用再考虑该不该加引号.

      php 预置的函数名为php 程序员养成了比较不好的命名习惯, 我更喜欢js 式的lower camel case 命名法; 而且php 的基本数据类型没有方法, 我说它oop 设计不彻底就是这个原因:strings, arrays, integers 是否也应该看作是objects 呢? 两个缺点让人很难离线写php.

      不省略; 当然是一个好习惯, 但php 本可以把这个作为warning 而不是error. 当然各语言有不同的处理方法, 在此不多说.

      应该避免命名冲突, 而不是依赖冲突. 我在上一篇文章中提到的module 就是一种避免命名冲突的方法. 而且现在我写php 尽量用js 的方法来定义工具函数.
      $UTIL = [
      ‘a’ => function(){ echo 1;},
      ‘b’ => function(){ echo 2;}
      ];
      $UTIL[‘a’]();

      变量和函数名除了$ 之外可以用其他方式来区分, 而不是在语言设计上人为设置障碍.

发表评论

电子邮件地址不会被公开。 必填项已用*标注