Press "Enter" to skip to content

我对PHP5.4的一个改进

插播个消息, 今天, 我终于获得了Zend的维护权限, Zend是PHP源代码中最为核心的部分, 也是最为敏感的地方, 对于这部分的权限控制的一直很严格. 但也是我加入PHP开发组以后, 一直想得到的权限. 🙂
好了, 言归正传, 今天对PHP5.4的Zend引擎做了一个改进, 改进了参数不兼容的报警信息. 具体的来说:
对于如下的例子:

<?php
class Sub implements ArrayAccess {
    public function offsetSet() {
    }
}
?>

在目前大家一定会得到类似如下的错误信息:

PHP Fatal error:  Declaration of Sub::offsetSet() must be compatible
with that of ArrayAccess::offsetSet()

这里有个问题, 错误信息并没有告诉我们, 正确的参数应该是什么样子, 我们除了去查手册(或者看源代码), 没办法得知.
于是, 在开发组经过提议, 讨论之后, 我今天做了一个改进, 改进之后, 将会得到如下的错误信息:

Fatal error: Declaration of Sub::offsetSet() must be compatible with
ArrayAccess::offsetSet($offset, $value)

当然, 这个对用户自定的类也是有效的, 如下:

<?php
class Foo {
}
Abstract Class Base {
    abstract public function test(Foo $foo, array $bar,
              $option = NULL, $extra = 16777215) ;
}
class Sub extends Base {
    public function test(Foo $foo, array $bar) {
    }
}
?>

将会得到如下的错误信息:

PHP Fatal error:  Declaration of Sub::test() must be compatible with
Base::test(Foo $foo, array $bar, $option = NULL, $extra = 16777215)

reversion: http://svn.php.net/viewvc?view=revision&revision=317206

35 Comments

  1. 林正英
    林正英 September 13, 2016

    这个改动我们没必要去理解吧

  2. FxYCarl
    FxYCarl April 2, 2013

    PHP5.4好像重写了php_output.h吧,原来的OG的结构体变化了,貌似OG里没有php_body_write这些成员了吧,那还怎么hack OG(php_body_write) 来获得zend_execute之后的结果呢.

  3. seven
    seven November 24, 2012

    希望能夠改進一下錯誤捕捉的部份,其實js在這方面就很強.
    另外php啥時候能做win32或智慧型手機的程式啊?

  4. imsuper
    imsuper November 19, 2012

    鸟哥威武!

  5. pitaya
    pitaya July 31, 2012

    碉堡

  6. phenix
    phenix May 8, 2012

    向您学习。

  7. PHPer
    PHPer January 1, 2012

    崇拜一下你呗,向你学习

  8. Kyli
    Kyli October 20, 2011

    基本上PHP里你是我的偶像了

  9. funlake
    funlake October 9, 2011

    这算是小试牛刀。
    好戏应还在后头。
    鼓掌!

  10. joysk
    joysk October 7, 2011

    表示对大牛的膜拜一下!
    哈哈

  11. rainkid
    rainkid October 7, 2011

    我去http://pecl.php.net/package/yaf下载了最新的版本
    重新编译OK了,非常感谢!

  12. rainkid
    rainkid October 7, 2011

    php-config -v
    显示的版本是:5.3.5-1ubuntu7.2

  13. rainkid
    rainkid October 7, 2011

    这个应该不会,我下了5.3.6的源码在看,但没有编译过,本地安装的了5.3.5的,我找了一下phpize和php-config都只有一个,应该不存在您说的问题。

  14. 雪候鸟
    雪候鸟 October 6, 2011

    @rainkid 没道理啊, 代码中对于5.3以上都会注释掉getPrevious的逻辑, 你是不是编译的时候, 用错了phpize和php-config?

  15. rainkid
    rainkid October 6, 2011

    补充一下,我的系统是ubuntu 64bit

  16. rainkid
    rainkid October 6, 2011

    这个问题好像找到了,是之前安装你的yaf框架,我去掉这个扩展就没有这个错误了,我这已经更新到最新版本了,楼主帮忙看看

  17. rainkid
    rainkid October 6, 2011

    恭喜恭喜,我的环境下面一直报这个错误,但不知道是什么问题,laruence能帮忙看一下么
    PHP Fatal error: Cannot override final method Exception::getPrevious() in Unknown on line 0

  18. wclssdn
    wclssdn September 30, 2011

    @xLight 很久以前就支持了吧- -. 5.0以后?
    嗯. 不错~~ 有了这个提示还是蛮人性化的…. 能省好多键盘鼠标… (脾气不好的程序员总砸键盘…. 或者摔鼠标….

  19. asy
    asy September 27, 2011

    我的偶象,支持国产PHPER

  20. 神仙
    神仙 September 27, 2011

    这个很实在

  21. 怪物宝
    怪物宝 September 26, 2011

    厉害啊,佩服

  22. 戴韬_雪心
    戴韬_雪心 September 24, 2011

    5.3就已经支持指定传入参数变量的类型了……很隐蔽的方式,嗯

  23. xLight
    xLight September 24, 2011

    如果我没理解错,看来5.4已经支持指定传入参数变量的类型了啊。
    good news

  24. lanisle
    lanisle September 23, 2011

    群管比群主给力多了,摸泄天天没正经的~

Leave a Reply

Your email address will not be published. Required fields are marked *