私有和保护方法
在PHP 5(ZEND引擎2)中,还引入了私有和保护方法。
例:
<?php
class Foo {
    private function aPrivateMethod() {
        echo "Foo::aPrivateMethod() called.\n";
    }    protected function aProtectedMethod() {
        echo "Foo::aProtectedMethod() called.\n";
        $this->aPrivateMethod();
    }
}class Bar extends Foo {
    public function aPublicMethod() {
        echo "Bar::aPublicMethod() called.\n";
        $this->aProtectedMethod();
    }
}$o = new Bar;
$o->aPublicMethod();
?> 
以前代码中的用户自定义类或方法中虽未定义"public," "protected" 或 "private"等关键字,但无需编辑即可运行。
抽象类和方法
PHP 5还引入了抽象类和方法。抽象方法只声明方法定义, 不供实际运行。包含抽象方法的类需要声明为抽象类。
例:
<?php
abstract class AbstractClass {
    abstract public function test();
}class ImplementedClass extends AbstractClass {
    public function test() {
        echo "ImplementedClass::test() called.\n";
    }
}$o = new ImplementedClass;
$o->test();
?> 
抽象类不能实例化。以前代码中的用户自定义类或方法中虽未定义"abstract”关键字,但无需编辑即可运行。
接口
ZEND引擎2.0引入了接口。一个类可以运行任意的接口列表。
Example
例:
<?php
interface Throwable {
    public function getMessage();
}class Exception implements Throwable {
    public function getMessage() {
    // ...
}
?> 
以前代码中的用户自定义类或方法中虽未定义"interface”关键字,但无需编辑即可运行。
类类型定义
在保留类无需定义类型的同时,PHP 5引入了类类型定义来声明希望把哪个类通过参数传递给一个方法。
Example
例:
<?php
interface Foo {
    function a(Foo $foo);
}interface Bar {
    function b(Bar $bar);
}class FooBar implements Foo, Bar {
    function a(Foo $foo) {
        // ...
    }    function b(Bar $bar) {
        // ...
    }
}$a = new FooBar;
$b = new FooBar;$a->a($b);
$a->b($b);
?> 
这些类类型定义在不象一些需要类型预定义的语言在编译中进行检查,而是在运行时进行。这意味着:
<?php
function foo(ClassName $object) {
    // ...
}
?> 
等价于: 
<?php
function foo($object) {
    if (!($object instanceof ClassName)) {
        die("Argument 1 must be an instance of ClassName");
    }
}
?> 
本语法只用于对象或类,不适用于内建类型。

解决方案 »

  1.   

    final
    PHP 5引入了“final”关键字定义在子类中不能被覆盖的成员或方法。
    例:
    <?php
    class Foo {
        final function bar() {
            // ...
        }
    }
    ?> 
    以前代码中的用户自定义类或方法中虽未定义"final"关键字,但无需编辑即可运行。
    对象克隆
    PHP 4在对象被复制时,用户不能决定拷贝的机制。在复制时,PHP 4只一位一位地复制一个和原来对象一模一样的复制品。
    我们并不是每次都要建立一个完全一样的复制品。一个很好的需要一种复制机制的例子是,当有一个代表一个GTK窗口的对象,它拥有该窗口的所有资源,当你建立一个拷贝时,你可能需要一个新的窗口,它拥有原窗口的所有属性,但需要拥有新窗口的资源。另外一个例子是你有一个对象引用了另外一个对象,当你复制父对象时,你希望建立那个引用对象的新实例,以使复制品引用它。
    对一个对象的拷贝通过调用对象的__clone()方法完成:
    <?php
    $copy_of_object = $object->__clone();
    ?> 
    当开发者请求建立一个对象的新的拷贝时,ZEND引擎会检查是否定义了__clone()方法。如果未定义的话,它会调用一个默认的__clone()方法来复制该对象的所有属性。如果定义了该方法,该方法会负责在拷贝中设置必要的属性。为方便起见,引擎会提供一个函数从源对象中导入所有的属性,这样它就可以先得到一个具有值的源对象拷贝,只需要对需要改变的属性进行覆盖即可。
    例:
    <?php
    class MyCloneable {
        static $id = 0;    function MyCloneable() {
            $this->id = self::$id++;
        }    function __clone() {
            $this->name = $that->name;
            $this->address = "New York";
            $this->id = self::$id++;
        }
    }$obj = new MyCloneable();$obj->name = "Hello";
    $obj->address = "Tel-Aviv";print $obj->id . "\n";$obj = $obj->__clone();print $obj->id . "\n";
    print $obj->name . "\n";
    print $obj->address . "\n";
    ?> 
    统一的构造方法名
    ZEND引擎允许开发者定义类的构造方法。具有构造方法的类在新建时会首先调用构造方法,构造方法适用于在正式使用该类前进行的初始化。
    在PHP4中,构造方法的名称与类名相同。由于在派生类中调用父类的作法比较普遍,因此导致在PHP4中当类在一个大型的类继承中进行移动时,处理方式有点笨拙。当一个派生类被移动到一个不同的父类中时,父类的构造方法名必然是不同的,这样的话派生类中的有关调用父类构造方法的语句需要改写。
    PHP 5 introduces a standard way of declaring constructor methods by calling them by the name __construct(). 
    PHP5引入了方法名__construct()来定义构造方法。
    Example
    <?php
    class BaseClass {
        function __construct() {
            print "In BaseClass constructor\n";
        }
    }class SubClass extends BaseClass {
        function __construct() {
            parent::__construct();
            print "In SubClass constructor\n";
        }
    }$obj = new BaseClass();
    $obj = new SubClass();
    ?> 
    为向下兼容,PHP5当在类不能找到__construct()方法时,会通过老的方法也就是类名来查找构造方法。这意味着唯一可能产生兼容性问题的是在以前的代码中已经使用了一个名为__construct()的方法名。
      

  2.   

    析构方法
    定义析构方法是十分有用的。析构方法可以记录调试信息,关闭数据库连接,还有做其它的扫尾工作。PHP4中并无此机制,尽管PHP已支持注册在请求结束时需要运行的函数。 
    PHP 5 introduces a destructor concept similar to that of other object-oriented languages, such as Java: When the last reference to an object is destroyed the object's destructor, which is a class method name %__destruct()% that recieves no parameters, is called before the object is freed from memory. 
    PHP5引入了与其它面向对象语言如Java语言相似的析构方法:当最后一个该对象的引用被清除时,系统将会在该对象从内存中释放前调用名为__destruct()的析构方法。
    例:
    <?php
    class MyDestructableClass {
        function __construct() {
            print "In constructor\n";
            $this->name = "MyDestructableClass";
        }    function __destruct() {
            print "Destroying " . $this->name . "\n";
        }
    }$obj = new MyDestructableClass();
    ?> 
    和构造方法相似,引擎将不调用父类的析构方法,为调用该方法,你需要在子类的析构方法中通过parent::__destruct()语句进行调用。
    常量
    PHP 5 引入了类常量定义:
    <?php
    class Foo {
        const constant = "constant";
    }echo "Foo::constant = " . Foo::constant . "\n";
    ?> PHP5允许常量中有表达式,但在编译时常量中的表达式将被计算.,因此常量不能在运行中改变它的值。
    <?php
    class Bar {
        const a = 1<<0;
        const b = 1<<1;
        const c = a | b;
    }
    ?> 
    以前代码中的用户自定义类或方法中虽未定义"const”关键字,但无需编辑即可运行。
    例外
    PHP 4 had no exception handling. PHP 5 introduces a exception model similar to that of other programming languages. 
    PHP4中无例外处理,PHP5引用了与其它语言相似的例外处理模型。
    例:
    <?php
    class MyExceptionFoo extends Exception {
        function __construct($exception) {
            parent::__construct($exception);
        }
    }try {
        throw new MyExceptionFoo("Hello");
    } catch (MyException $exception) {
        print $exception->getMessage();
    }
    ?> 
    以前代码中的用户自定义类或方法中虽未定义'catch', 'throw' 和 'try'关键字,但无需编辑即可运行。
    函数返回对象值
    In PHP 4 it wasn't possible to dereference objects returned by functions and make further method calls on those objects. With the advent of Zend Engine 2, the following is now possible: 
    在PHP4中,函数不可能返回对象的值并对返回的对象进行方法调用,通过ZEND引擎2中,这一切变得可能:
    <?php
    class Circle {
        function draw() {
            print "Circle\n";
        }
    }
            
    class Square {
        function draw() {
            print "Square\n";
        }
    }function ShapeFactoryMethod($shape) {
        switch ($shape) {
            case "Circle": 
                return new Circle();
            case "Square": 
                return new Square();
        }
    }ShapeFactoryMethod("Circle")->draw();
    ShapeFactoryMethod("Square")->draw();
    ?> 
    静态类中的静态成员变量现在可初始化
    Example
    <?php
    class foo {
        static $my_static = 5;
    }print foo::$my_static;
    ?> 
    静态方法
    PHP5引入了关键字'static'来定义一个静态方法,这样可以从对象外进行调用。
    例:
    <?php
    class Foo {
        public static function aStaticMethod() {
            // ...
        }
    }Foo::aStaticMethod();
    ?> 
    虚拟变量$this在静态方法中无效。
    instanceof
    PHP5引入了关键字instanceof来确定一个对象是否是某一个对象的实例,或某一个对象的派生,或使用了某一个接口。
    例:
    <?php
    class baseClass { }$a = new baseClass;if ($a instanceof basicClass) {
        echo "Hello World";
    }
    ?> 
    静态函数变量
    所有的静态变量现在在编译时进行处理,这允许开发者通过引用来指定静态变量。这个变化提高了效率但意味着不可能对静态变量进行间接引用。
    函数中通过按地址传送方式的参数允许定义默认值
    例:
    <?php
    function my_function(&$var = null) {
        if ($var === null) {
            die("$var needs to have a value");
        }
    }
    ?> 
    __autoload()
    在初始化一个未定义的类时,引擎将自动调用__autoload()拦截器函数。该类名将作为__autoload()拦截器函数唯一参数传递给它。
    例:
    <?php
    function __autoload($className) {
        include_once $className . ".php";
    }$object = new ClassName;
    ?> 
    方法和属性调用的重载
    通用 __call(), __get() 和 __set()方法可以进行方法和属性调用的重载。例: __get() 和 __set()
    <?php
    class Setter {
        public $n;
        public $x = array("a" => 1, "b" => 2, "c" => 3);    function __get($nm) {
            print "Getting [$nm]\n";        if (isset($this->x[$nm])) {
                $r = $this->x[$nm];
                print "Returning: $r\n";
                return $r;
            } else {
                print "Nothing!\n";
            }
        }    function __set($nm, $val) {
            print "Setting [$nm] to $val\n";        if (isset($this->x[$nm])) {
                $this->x[$nm] = $val;
                print "OK!\n";
            } else {
                print "Not OK!\n";
            }
        }
    }$foo = new Setter();
    $foo->n = 1;
    $foo->a = 100;
    $foo->a++;
    $foo->z++;
    var_dump($foo);
    ?> 
    例: __call()
    <?php
    class Caller {
        var $x = array(1, 2, 3);    function __call($m, $a) {
            print "Method $m called:\n";
            var_dump($a);
            return $this->x;
        }
    }$foo = new Caller();
    $a = $foo->test(1, "2", 3.4, true);
    var_dump($a);
    ?> 
      

  3.   

    WIN系统上,phpinfo里竟然没找到mysql相关信息............如你的php.ini中display_error=On 你就发现你很多程序无法运行如你将mysql方法定义到class里,你将发现你的页面空白一片期待beat2版等待正式版推出
      

  4.   

    真的想用php5做点东西,估计得半年以后了。还是先老老实实搞php4吧。php越来越不象php了。
      

  5.   

    幸好我早就开始改成了$_xxx的写法,最近的程序都是这样的写法:)
      

  6.   

    我认为现在PHP还有一点问题,也就是默认的INCLUDE路径是在PHP.INI中设置,对虚拟主机而言并不能体会到它的优势.
      

  7.   

    我INCLUDE的时候从来都是写相对(/)的路径
      

  8.   

    建议以后的程序都用封装类的形式来写,否则等PHP6出来的时候那些用独立函数构成的PHP程序可能运行不正常了.
      

  9.   

    大家向JAVA靠齐吧...(PHP仅仅是将CLASS方面与JAVA靠齐,其他方面仍然是现在开发最快的~)
      

  10.   

    php越来越不象php了,反倒是象java了,不晓得是惊喜还是悲哀
      

  11.   

    java对服务器性能要求太高,对一些小型应用成本太高。php在安装有zend cache等性能优化程序后,速度也是非常快的
      

  12.   

    php其实还是挺有优势的。劣势是开发可以利用的类太少了,或是高质量的类不多,所以导致开发周期有些长
      

  13.   

    我觉的PHP的类不少的,如:PEAR,PHPLIB,SMARTY...
      

  14.   

    但那些类大多效率太低,所以我们在开发时都是写重新按自己的算法写类,效率比那些类高几倍。我们还是喜欢php,我们的团队是主要用php开发的
      

  15.   

    wfqn() 老兄可否把你效率比PEAR或SMARTY类高几倍的代码贴一点上来让大家看看,如果有机会就加入PHP的开发小组,那将是一件喜事:-)
      

  16.   

    PHP 还有个不足是,没有像 Servlet 中将对象暂时保存至内存的机制,尽管有同步的问题,不过还是希望 PHP 可以这样,毕竟这样比较快,相对于读取文件和数据库。
    另外,PHP 的编写工具实在有点简陋或者巨大,当然,我的电脑有点慢 (C300A),没办法以正常速度运行 ZEND IDE,如果它能像 ECILPSE 一样用 SWT 的 JAVA 写就好了,本地代码比 SWING 快得多。
      

  17.   

    提到顶上去,对php感兴趣的都讨论一下,明天我也换上php5感觉一下。^_^
      

  18.   

    php5 的最大缺陷是还没有一个全局的(变量,像asp的application之类的)这样写聊天在线人员太痛苦了,大家觉得是不是???
      

  19.   

    to konv(烂冬瓜) :每种语言有自己的特点。PHP没有了application对象但是有其它的东西。这就是PHP,PHP就是这样!如果看过Zend2的C源代码就知道:整个结构和代码几乎全部都重写了。对于OOP的支持是完全变了,不能说是变得像Java。语言只是一种思想、一种表述意思的工具。没有谁像谁之说。只要是优点,就可以借。所以,PHP5对于顺序流程编程的性能还有提高。对于PHP我的意见最大的就是性能,不过基于其方面的embed性质,这一点也就忍了。纯behind-code代码用Zend Encoder做一下,会快些。再装上ZendOptimizer、ZendCache之类的东西,PHP的速度还是很能让人接受的。尽管达不到.Net、Java的效果:)还有,PHP5已经将MySQL Library un-built-in了,呵呵。不过其新建了一个sql-lite,这个东西倒是相当的不错。做数据暂时存时相当的有用。相信任何人试用过以后都会爱上他的:)
      

  20.   

    等PHP5正式版出来应该是最激动人心的,我想应该会在1个月之内吧.
      

  21.   

    我认为php首要任务是有个像.net那样的framework 和ide!
      

  22.   

    看着看着,觉得php5的类/接口的形式很别扭,比不上 C#有感觉。
      

  23.   

    我觉得大家开始普遍的接受php5,使用php5开发,应该是在明年。So never mind the darkness, we still can find a way.
      

  24.   

    的确改进了很多,不过我还是习惯了用PHP4.
      

  25.   

    等正式版出了,在我自己的电脑上会装一个,不过,租用的虚拟主机可能得明后年才会有吧,所以,似乎只能做练习用,除非以后自己能有个主机。
    以前 DOWN 的 PHP5 的 ALPHA 版我在测试时,还好没有把 IIS 的 .php 扩展名放到它上面去,而是加了一个 .php5 的,还好,还好。
      

  26.   

    php5给了我们一些欣喜。我用php4和asp作网站。个人感觉还是php好用,主要是可以随心所欲的写程序。
      

  27.   

    PHP5支持WEB SERVICES吗?如果不,我想我就该放弃这鬼东西了。虽然伴随我有两年了,但老不长进也不是办法呀!
      

  28.   

    我也在期待着,前段时间用了.NET,公司须要,现在又要回到PHP,感觉有些陌生了。