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

来源:互联网 发布:德勤税务工资.知乎 编辑:程序博客网 时间:2024/05/17 11:05
[接上页]
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);
?>