PHPEye开源社区 » PHP技术讨论区 » 升级到PHP5的理由
《Programming PHP》第二版上市
2007-7-26 15:40 Haohappy
升级到PHP5的理由

[url]http://blog.joshuaeichorn.com/slides/CoolThingsInPHP5/[/url]

[b]A little History of PHP5[/b]

    * July 13th 2004, PHP 5.0 released
    * Nov 2006, PHP 5.2 released
    * Go-php5.org
    * December 31 2007, PHP4 EOL
    * Upgrade Time

[b]Lots of reasons to upgrade[/b]

    * Better OO
    * Better XML
    * Better Webservices
    * Better Database libraries
    * Userland code that acts like core constructs
    * Faster

[b]Better OO[/b]

    * Standard Reason for PHP 5
    *
          o public/private/protected
          o Unified constructor name __construct()
          o Destructor __destructor()
          o Interfaces
          o instanceof operator
          o final methods/classes
          o Explicit object cloning
          o Class constants
          o Static members/methods
          o abstract classes/methods
          o Class type hints
          o dereferencing support $obj->method()->method()
          o __autoload()

[b]Better XML[/b]

    * Real DOM Support
    * No more leaks etc
    * Based on libxml2 (fast)
    * SimpleXML

[b]Better Webservices[/b]

    * JSON extension for quick serializing to from javascript
    * SOAP extension that actually works


[b]Better Database Libraries[/b]

    * Sqlite built in (you always have a db)
    * Mysqli extension supports all the mysql 4.1+ features
    * PDO provides native abstraction of databases covers all the majors

[b]Userland code that acts like core constructs[/b]

    * A class can be used in a foreach (iterator)
    * A class can be accessed like an array
    * You can add virtual methods __call
    * You can add virtual properties __get/__set

[b]Faster[/b]

    * PHP 5.2 added lots of speed improvements
    * Faster require_once
    * Better memory management
    * Lots of other stuff

[b][color=Red]So Upgrade[/color][/b]

    * PHP 4 support is being dropped by everyone
    * PHP 5 offers better faster easier to write code

[[i] 本帖最后由 Haohappy 于 2007-7-26 15:42 编辑 [/i]]

2007-7-26 16:04 diogin
interface里允许static function而abstract class里不允许abstract static function我觉得是个畸形。
5里面static有一些怪异的地方,也导致php6里出现static的延迟绑定的出现。
private的继承也不合逻辑,理论上继承应该继承所有的成员,包括private成员,如果规定private的不能继承,那么var_dump子类对象时就不应该出现父类的private属性,也就是说子类应该完全意识不到父类的private属性,而实际上是存在却不能访问。

再说PDO,名字起得就不对,PHP Data Object应该用在数据库抽象层上才对。而PDO本身的设计就有问题,stmt对象居然能变身。。
如果PDO设计成robust、flexible的Data Abstract Layer,那就应该严格按照关系数据库的实际领域对象来设计,而不是草草实现。在这一点上mysqli比PDO还要好一点。

另外,class并不能被iterate,应该是object。

当然了,虽然有一些地方不合人意,但总体来说PHP5还是非常值得使用的。

2007-7-27 21:36 cid73
[quote]原帖由 [i]diogin[/i] 于 2007-7-26 16:04 发表 [url=http://www.phpeye.com/bbs/redirect.php?goto=findpost&pid=488&ptid=114][img]http://www.phpeye.com/bbs/images/common/back.gif[/img][/url]
interface里允许static function而abstract class里不允许abstract static function我觉得是个畸形。
5里面static有一些怪异的地方,也导致php6里出现static的延迟绑定的出现。
private的继承也不合逻辑,理论上继承应该 ... [/quote]
[php]
interface I {
  static function f();
}

abstract class A {
  abstract protected static function f();
}
[/php]
这些现在都是可以的了, 而 private 成员不能被继承这应该是没有争议的吧.

2007-7-27 22:06 diogin
abstract static function可以是可以,但E_STRICT标准不允许,而且多态的static函数可以用

call_user_func(array($className, 'f'));



call_user_func_array(array($className, 'f'), array($var1, $var2));

来模拟调用。另外private成员不能被继承为什么没有争议呢?php的public/protected/private是依据代码所处的类的。
理论上继承应该继承所有特性,ppp是用来限定访问,后者并不能对前者有影响。

你extend一个有private属性的类,实例化一下扩展类的对象,然后var_dump一下这个对象试试。

2007-7-28 12:20 diogin
[php]<?php
class A {
    private $name = 'hello';
}
class C extends A {
    public function f() {
        echo $this->name;
    }
}
$o = new C();
var_dump($o); // object(C)#1 (1) { ["name:private"]=> string(5) "hello" }
$o->f(); // Notice: Undefined property: C::$name in D:\Development\Workspace\index.php on line 7[/php]

2007-7-29 09:36 Haohappy
这确实不合理,应该完全屏蔽的,对开发者来说没有用,说不定还会误导。

2007-8-1 14:57 wps2000
在vardump或者反射的时候增加一种修饰符 unreachabled,呵呵,都解决了

2007-8-1 17:45 Verdana
我觉得继承与 ppp 无关,因为某些成员是 private,所以访问上受到限制而已,不能访问并不意味着不能被继承。

如 diogin 的例子中, private $name,被限制只能在 A 类中被访问。

如果要访问 superclass 中的 private 属性,可以通过 superclass 中的 public/protected 方法来访问
比如:

[font=Courier New]
[php]
<?php
error_reporting(E_ALL | E_STRICT);

class A {
    private $name = 'hello';

    protected function getName() {
        return $this->name;
    }
}


class C extends A {
    public function f() {
        echo $this->getName();
    }
}


$o = new C();
$o->f();
[/php]
[/font]

2007-8-2 01:08 diogin
其实Verdana的说法还是在原地绕圈子。看看下面这个例子,如果PPP跟继承无关,那么就应该这样(注意加“*”号的部分):
[php]
class A {
    private $name = 'hello';
}
class C extends A {
    public function f() {
        $a = new A();
        echo $a->name; // 这个肯定不能运行,因为访问$name的这部分 *代码不在A类里*
    }
    public function t() {
        echo $this->name; // 这个理论上应该能运行,因为这个$name是从A类继承下来的,这个$name是 *C类对象的属性*,而不是 *A类对象的属性*
    }
}
$c = new C();
$c->f();
$c->t();
[/php]

[[i] 本帖最后由 diogin 于 2007-8-2 01:10 编辑 [/i]]

2007-8-2 15:28 Verdana
感谢  diogin 的提醒,我看了一下源码,之前我的说法是错误的。

在 Compiling 代码时,如果发生继承,Zend 还是会检查 PPP 的,并不是全盘接收。

subclass 的 properties_info (HashTable) 会复制来自 superclass 的 properties,但不包括 private 的属性.

被 copy 的(protected/public)我猜测仅仅是 properties 的符号表,而值部分 subclass 和 superclass 应该是共享的同一块内存的(通过追加 ref)。


反射看一下到类或者对象的具体信息:

[font=Courier New]
[php]
<?php
Reflection::export(new ReflectionClass('C'));
Reflection::export(new ReflectionObject(new C));
[/php]


应该是这样了,呵呵~

页: [1]
查看完整版本: 升级到PHP5的理由


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.