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

类别:编程语言 点击:0 评论:0 推荐:

[接上页]

PHP 5/Zend Engine 2.0的改进

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\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();
?>

 

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

例如:

<?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]\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);
?>

 

 

本文地址:http://com.8s8s.com/it/it29065.htm