PHP 5/Zend Engine 2.0的改进(二) (转)

PHP 5/Zend Engine 2.0的改进(二) (转)[@more@]

.NET/Develop/read_article.ASP?id=21008">[接上页]

 
 

PHP 5/zend Engine 2.0的改进XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

 
 

php5允许常量中包含表达式,但在编译时常量中的表达式将被计算,

 
 

因此常量不能在运行中改变它的值。

 
 

<?php

class Bar { 
 
    const a = 1<<0;
    const b = 1<<1;
    const c = a | b;
}
?>

以前代码中的用户自定义类或方法中虽然未定义"const”关键字,

 
 

但无需修改就可以运行。

 
 

 
 

异常(Exceptions)

 
 

php4中没异常处理,PHP5引入了与其它与语言相似的异常处理模型。

 
 

<?php
class MyExceptionFoo extends Exception {
    function __construct($exception) {
        parent::__construct($exception);
    }
}

try {
    throw new MyExceptionFoo("Hello");
} catch (MyExceptionFoo $exception) {
    print $exception->getMessage();
}
?>

以前代码中的用户自定义类或方法中虽未定义'catch', 'throw' 和 'try'关键字,但无需修改

 
 

就可以运行。

 
 

 
 

函数返回对象

 
 

在PHP4中,函数不可能返回对象的值并对返回的对象进行方法调用,随着Zend Engine 2

 
 

(ZEND引擎2)的出现,以下调用成为可能:

 
 

<?php
class Circle {
    function draw() {
        print "Circle ";
    }
}
       
class Square {
    function draw() {
        print "Square ";
    }
}

function ShapeFactoryMethod($shape) {
    switch ($shape) {
        case "Circle":
            return new Circle();
        case "Square":
            return new Square();
    }
}

ShapeFactoryMethod("Circle")->draw();
ShapeFactoryMethod("Square")->draw();
?>

 
 

 
 

静态类中的静态成员变量可初始化

 
 

例如:

 
 

<?php
class foo {
    static $my_static = 5;
}

print foo::$my_static;
?>

静态方法(Static Methods)

 
 

PHP5引入了关键字'static'来定义一个静态方法,这样可以从对象外进行调用。

 
 

例如:

<?php
class Foo {
    public static function aStaticMethod() {
        // ...
    }
}

Foo::aStaticMethod();
?>

虚拟变量$this在被定义为静态(static)的方法中无效。

 
 

 
 

 
 

Instanceof

PHP5引入了 “instanceof“关键字来确定一个对象是否是某一个对象的实例,或某一个对象的派生,或使用了某一个接口。

示例:

<?php
class baseClass { }

$a = new baseClass;

if ($a instanceof basicClass) {
    echo "Hello World";
}
?>

静态函数变量(Static function variables)

 
 

所有的静态变量现在在编译时进行处理,这允许开发者通过引用来指定静态变量。这个变化提高了效率但意味着不可能对静态变量进行间接引用。

 
 

函数中通过引用方式传递的参数允许有默认值

 
 

例如:

<?php
function my_function(&$var = null) {
    if ($var === null) {
        die("$var needs to have a value");
    }
}
?>

__autoload()

在初始化一个未定义的类时,__autoload()拦截函数(interceptor function)将被自动调

 
 

用。类名将作为__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] ";

        if (isset($this->x[$nm])) {
            $r = $this->x[$nm];
            print "Returning: $r ";
            return $r;
        } else {
            print "Nothing! ";
        }
    }

    function __set($nm, $val) {
        print "Setting [$nm] to $val ";

        if (isset($this->x[$nm])) {
            $this->x[$nm] = $val;
            print "OK! ";
        } else {
            print "Not OK! ";
        }
    }
}

$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: ";
        var_dump($a);
        return $this->x;
    }
}

$foo = new Caller();
$a = $foo->test(1, "2", 3.4, true);
var_dump($a);
?>


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-962873/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-962873/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值