标题: 升级到PHP5的理由
Haohappy
超级版主
Rank: 8Rank: 8
PHPEye站长


UID 2
精华 11
积分 110
帖子 283
翻译 6
原创 1
阅读权限 150
注册 2007-5-2
状态 离线
发表于 2007-7-26 15:40  资料  短消息  加为好友  添加 haohappy 为MSN好友 通过MSN和 haohappy 交谈
升级到PHP5的理由

http://blog.joshuaeichorn.com/slides/CoolThingsInPHP5/

A little History of PHP5

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

Lots of reasons to upgrade

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

Better OO

    * 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()

Better XML

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

Better Webservices

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


Better Database Libraries

    * 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

Userland code that acts like core constructs

    * 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

Faster

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

So Upgrade

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

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





互助共享,共同成长。
顶部
diogin
版主
Rank: 7Rank: 7Rank: 7



UID 16
精华 1
积分 10
帖子 38
翻译 0
原创 0
阅读权限 100
注册 2007-5-4
来自 广东省广州市
状态 离线
发表于 2007-7-26 16:04  资料  短消息  加为好友 
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还是非常值得使用的。





The world is everything that is the case.
顶部
cid73
版主
Rank: 7Rank: 7Rank: 7



UID 40
精华 2
积分 25
帖子 32
翻译 0
原创 0
阅读权限 100
注册 2007-5-23
状态 离线
发表于 2007-7-27 21:36  资料  短消息  加为好友 


QUOTE:
原帖由 diogin 于 2007-7-26 16:04 发表
interface里允许static function而abstract class里不允许abstract static function我觉得是个畸形。
5里面static有一些怪异的地方,也导致php6里出现static的延迟绑定的出现。
private的继承也不合逻辑,理论上继承应该 ...



PHP代码如下:
interface {
  static function 
f();
}

abstract class 
{
  abstract protected static function 
f();
}



这些现在都是可以的了, 而 private 成员不能被继承这应该是没有争议的吧.

顶部
diogin
版主
Rank: 7Rank: 7Rank: 7



UID 16
精华 1
积分 10
帖子 38
翻译 0
原创 0
阅读权限 100
注册 2007-5-4
来自 广东省广州市
状态 离线
发表于 2007-7-27 22:06  资料  短消息  加为好友 
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一下这个对象试试。





The world is everything that is the case.
顶部
diogin
版主
Rank: 7Rank: 7Rank: 7



UID 16
精华 1
积分 10
帖子 38
翻译 0
原创 0
阅读权限 100
注册 2007-5-4
来自 广东省广州市
状态 离线
发表于 2007-7-28 12:20  资料  短消息  加为好友 


PHP代码如下:

<?php
class {
    private 
$name 'hello';
}
class 
extends {
    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







The world is everything that is the case.
顶部
Haohappy
超级版主
Rank: 8Rank: 8
PHPEye站长


UID 2
精华 11
积分 110
帖子 283
翻译 6
原创 1
阅读权限 150
注册 2007-5-2
状态 离线
发表于 2007-7-29 09:36  资料  短消息  加为好友  添加 haohappy 为MSN好友 通过MSN和 haohappy 交谈
这确实不合理,应该完全屏蔽的,对开发者来说没有用,说不定还会误导。





互助共享,共同成长。
顶部
wps2000
新手上路
Rank: 1



UID 34
精华 0
积分 0
帖子 73
翻译 0
原创 0
阅读权限 10
注册 2007-5-20
状态 离线
发表于 2007-8-1 14:57  资料  短消息  加为好友 
在vardump或者反射的时候增加一种修饰符 unreachabled,呵呵,都解决了





顶部
Verdana
新手上路
Rank: 1



UID 39
精华 1
积分 10
帖子 18
翻译 0
原创 0
阅读权限 10
注册 2007-5-23
状态 离线
发表于 2007-8-1 17:45  资料  主页 短消息  加为好友 
我觉得继承与 ppp 无关,因为某些成员是 private,所以访问上受到限制而已,不能访问并不意味着不能被继承。

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

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



PHP代码如下:

<?php
error_reporting
(E_ALL E_STRICT);

class 
{
    private 
$name 'hello';

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


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


$o = new C();
$o->f();







顶部
diogin
版主
Rank: 7Rank: 7Rank: 7



UID 16
精华 1
积分 10
帖子 38
翻译 0
原创 0
阅读权限 100
注册 2007-5-4
来自 广东省广州市
状态 离线
发表于 2007-8-2 01:08  资料  短消息  加为好友 
其实Verdana的说法还是在原地绕圈子。看看下面这个例子,如果PPP跟继承无关,那么就应该这样(注意加“*”号的部分):

PHP代码如下:
class {
    private 
$name 'hello';
}
class 
extends {
    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();


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





The world is everything that is the case.
顶部
Verdana
新手上路
Rank: 1



UID 39
精华 1
积分 10
帖子 18
翻译 0
原创 0
阅读权限 10
注册 2007-5-23
状态 离线
发表于 2007-8-2 15:28  资料  主页 短消息  加为好友 
感谢  diogin 的提醒,我看了一下源码,之前我的说法是错误的。

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

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

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


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



PHP代码如下:

<?php
Reflection
::export(new ReflectionClass('C'));
Reflection::export(new ReflectionObject(new C));


应该是这样了,呵呵~





顶部
 


PHPEye开源社区


当前时区 GMT+8, 现在时间是 2008-12-5 09:34

    Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
Processed in 0.035250 second(s), 6 queries , Gzip enabled

清除 Cookies - 联系我们 - PHPEye开源社区 - Archiver