前言

今天突然想到PHP官方網(wǎng)站上一轉(zhuǎn),一眼就看到PHP5推出的通告。雖然以前看到過PHP5的預(yù)告,但還是仔細看了PHP 5/Zend Engine 2.0新特性一文,一股JAVA氣息撲面而來...
特將該文 " /> 最近的中文字幕2019更新,欧美激情视频二区三区,国产综合视频在线观看一区

一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

PHP 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性


前言

   今天突然想到php官方網(wǎng)站上一轉(zhuǎn),一眼就看到php5推出的通告。雖然以前看到過php5的預(yù)告,但還是仔細看了php 5/Zend Engine 2.0新特性一文,一股Java氣息撲面而來...
   特將該文試譯出來,首發(fā)于CSDN網(wǎng)站,以饗讀者。

php 5/Zend Engine 2.0新特性
徐喚春 譯 sfwebsite@hotmail.com
http://www.php.NET/zend-engine-2.php

全新的對象模型
php中的對象處理部分已完全重寫,具有更佳的性能和更多的功能。在php的以前版本中,對象與內(nèi)建變量類型(如integer和string)的處理方法相同,其弊端是當(dāng)變量被賦值為對象或?qū)ο笞鳛閰?shù)傳遞時,得到的是對象復(fù)制品。而在新版本中,對象通過句柄進行引用,而不是通過它的值。(句柄可以認是為是對象的標識符)
很多php程序員可能未意識到以前的對象模型的“復(fù)制怪癖”,因此以前的php程序?qū)⒉恍枰鋈魏胃模蛑蛔龊苄〉母膭蛹纯蛇\行
私有和保護成員
php 5引入了私有和保護成員變量,它們可以定義類屬性在何時可以被訪問。

類的保護成員變量能在該類的擴展類中被訪問,而私有成員變量只能在本類中被訪問。
<?php
class MyClass {
    private $Hello = "Hello, World!/n";
    protected $Bar = "Hello, Foo!/n";
    protected $Foo = "Hello, Bar!/n";

    function printHello() {
        print "MyClass::printHello() " . $this->Hello;
        print "MyClass::printHello() " . $this->Bar;
        print "MyClass::printHello() " . $this->Foo;
    }
}

class MyClass2 extends MyClass {
    protected $Foo;

    function printHello() {
        MyClass::printHello();                          /* Should print */
        print "MyClass2::printHello() " . $this->Hello; /* Shouldn't print out anything */
        print "MyClass2::printHello() " . $this->Bar;   /* Shouldn't print (not declared)*/
        print "MyClass2::printHello() " . $this->Foo;   /* Should print */
    }
}

$obj = new MyClass();
print $obj->Hello;  /* Shouldn't print out anything */
print $obj->Bar;    /* Shouldn't print out anything */
print $obj->Foo;    /* Shouldn't print out anything */
$obj->printHello(); /* Should print */

$obj = new MyClass2();
print $obj->Hello;  /* Shouldn't print out anything */
print $obj->Bar;    /* Shouldn't print out anything */
print $obj->Foo;    /* Shouldn't print out anything */
$obj->printHello();
?>
私有和保護方法
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"等關(guān)鍵字,但無需編輯即可運行。
抽象類和方法
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”關(guān)鍵字,但無需編輯即可運行。
接口
ZEND引擎2.0引入了接口。一個類可以運行任意的接口列表。
Example
例:
<?php
interface Throwable {
    public function getMessage();
}

class Exception implements Throwable {
    public function getMessage() {
    // ...
}
?>
以前代碼中的用戶自定義類或方法中雖未定義"interface”關(guān)鍵字,但無需編輯即可運行。
類類型定義
在保留類無需定義類型的同時,php 5引入了類類型定義來聲明希望把哪個類通過參數(shù)傳遞給一個方法。
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);
?>
這些類類型定義在不象一些需要類型預(yù)定義的語言在編譯中進行檢查,而是在運行時進行。這意味著:
<?php
function foo(ClassName $object) {
    // ...
}
?>
等價于:
<?php
function foo($object) {
    if (!($object instanceof ClassName)) {
        die("Argument 1 must be an instance of ClassName");
    }
}
?>
本語法只用于對象或類,不適用于內(nèi)建類型。

final
php 5引入了“final”關(guān)鍵字定義在子類中不能被覆蓋的成員或方法。
例:
<?php
class Foo {
    final function bar() {
        // ...
    }
}
?>
以前代碼中的用戶自定義類或方法中雖未定義"final"關(guān)鍵字,但無需編輯即可運行。
對象克隆
php 4在對象被復(fù)制時,用戶不能決定拷貝的機制。在復(fù)制時,php 4只一位一位地復(fù)制一個和原來對象一模一樣的復(fù)制品。
我們并不是每次都要建立一個完全一樣的復(fù)制品。一個很好的需要一種復(fù)制機制的例子是,當(dāng)有一個代表一個GTK窗口的對象,它擁有該窗口的所有資源,當(dāng)你建立一個拷貝時,你可能需要一個新的窗口,它擁有原窗口的所有屬性,但需要擁有新窗口的資源。另外一個例子是你有一個對象引用了另外一個對象,當(dāng)你復(fù)制父對象時,你希望建立那個引用對象的新實例,以使復(fù)制品引用它。
對一個對象的拷貝通過調(diào)用對象的__clone()方法完成:
<?php
$copy_of_object = $object->__clone();
?>
當(dāng)開發(fā)者請求建立一個對象的新的拷貝時,ZEND引擎會檢查是否定義了__clone()方法。如果未定義的話,它會調(diào)用一個默認的__clone()方法來復(fù)制該對象的所有屬性。如果定義了該方法,該方法會負責(zé)在拷貝中設(shè)置必要的屬性。為方便起見,引擎會提供一個函數(shù)從源對象中導(dǎo)入所有的屬性,這樣它就可以先得到一個具有值的源對象拷貝,只需要對需要改變的屬性進行覆蓋即可。
例:
<?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";
?>
統(tǒng)一的構(gòu)造方法名
ZEND引擎允許開發(fā)者定義類的構(gòu)造方法。具有構(gòu)造方法的類在新建時會首先調(diào)用構(gòu)造方法,構(gòu)造方法適用于在正式使用該類前進行的初始化。
php4中,構(gòu)造方法的名稱與類名相同。由于在派生類中調(diào)用父類的作法比較普遍,因此導(dǎo)致在php4中當(dāng)類在一個大型的類繼承中進行移動時,處理方式有點笨拙。當(dāng)一個派生類被移動到一個不同的父類中時,父類的構(gòu)造方法名必然是不同的,這樣的話派生類中的有關(guān)調(diào)用父類構(gòu)造方法的語句需要改寫。
php 5 introduces a standard way of declaring constructor methods by calling them by the name __construct().
php5引入了方法名__construct()來定義構(gòu)造方法。
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當(dāng)在類不能找到__construct()方法時,會通過老的方法也就是類名來查找構(gòu)造方法。這意味著唯一可能產(chǎn)生兼容性問題的是在以前的代碼中已經(jīng)使用了一個名為__construct()的方法名。
析構(gòu)方法
定義析構(gòu)方法是十分有用的。析構(gòu)方法可以記錄調(diào)試信息,關(guān)閉數(shù)據(jù)庫連接,還有做其它的掃尾工作。php4中并無此機制,盡管php已支持注冊在請求結(jié)束時需要運行的函數(shù)。
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引入了與其它面向?qū)ο笳Z言如Java語言相似的析構(gòu)方法:當(dāng)最后一個該對象的引用被清除時,系統(tǒng)將會在該對象從內(nèi)存中釋放前調(diào)用名為__destruct()的析構(gòu)方法。
例:
<?php
class MyDestructableClass {
    function __construct() {
        print "In constructor/n";
        $this->name = "MyDestructableClass";
    }

    function __destruct() {
        print "Destroying " . $this->name . "/n";
    }
}

$obj = new MyDestructableClass();
?>
和構(gòu)造方法相似,引擎將不調(diào)用父類的析構(gòu)方法,為調(diào)用該方法,你需要在子類的析構(gòu)方法中通過parent::__destruct()語句進行調(diào)用。
常量
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”關(guān)鍵字,但無需編輯即可運行。
例外
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'關(guān)鍵字,但無需編輯即可運行。
函數(shù)返回對象值
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中,函數(shù)不可能返回對象的值并對返回的對象進行方法調(diào)用,通過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();
?>
靜態(tài)類中的靜態(tài)成員變量現(xiàn)在可初始化
Example
<?php
class foo {
    static $my_static = 5;
}

print foo::$my_static;
?>
靜態(tài)方法
php5引入了關(guān)鍵字'static'來定義一個靜態(tài)方法,這樣可以從對象外進行調(diào)用。
例:
<?php
class Foo {
    public static function aStaticMethod() {
        // ...
    }
}

Foo::aStaticMethod();
?>
虛擬變量$this在靜態(tài)方法中無效。
instanceof
php5引入了關(guān)鍵字instanceof來確定一個對象是否是某一個對象的實例,或某一個對象的派生,或使用了某一個接口。
例:
<?php
class baseClass { }

$a = new baseClass;

if ($a instanceof basicClass) {
    echo "Hello World";
}
?>
靜態(tài)函數(shù)變量
所有的靜態(tài)變量現(xiàn)在在編譯時進行處理,這允許開發(fā)者通過引用來指定靜態(tài)變量。這個變化提高了效率但意味著不可能對靜態(tài)變量進行間接引用。
函數(shù)中通過按地址傳送方式的參數(shù)允許定義默認值
例:
<?php
function my_function(&$var = null) {
    if ($var === null) {
        die("$var needs to have a value");
    }
}
?>
__autoload()
在初始化一個未定義的類時,引擎將自動調(diào)用__autoload()攔截器函數(shù)。該類名將作為__autoload()攔截器函數(shù)唯一參數(shù)傳遞給它。
例:
<?php
function __autoload($className) {
    include_once $className . ".php";
}

$object = new ClassName;
?>
方法和屬性調(diào)用的重載
通用 __call(), __get() 和 __set()方法可以進行方法和屬性調(diào)用的重載。

例: __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);
?>

php技術(shù)PHP 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲爱婷婷色婷婷五月 | 中文字幕一级毛片视频 | 一区二区三区影视 | 国产91小视频在线观看 | 色综合中文字幕色综合激情 | 手机在线看黄色 | 色婷婷视频在线 | 欧美日韩另类在线观看视频 | 国产麻豆91欧美一区二区 | 精品国产不卡一区二区三区 | 91视频观看免费 | 成人国产精品免费网站 | 中文字幕日韩一区 | 九九热久久免费视频 | 黄色链接在线观看 | 国产精品嫩草影院在线观看免费 | 国语自产精品视频在线第 | 九九国产 | 日本伊人色综合网 | 国产小视频在线看 | 伊人福利在线 | 国产精品自产拍在线观看 | 一二三四视频社区在线中文1 | 欧美一级特黄高清免费 | 欧美日本在线一区二区三区 | 国产免费69成人精品视频 | 亚洲综合激情视频 | 久久综合丝袜长腿丝袜 | 亚洲一区二区三区播放在线 | 亚洲国产一区在线二区三区 | 黄色片网站免费在线观看 | 一级做a爰片久久毛片看看 一级做a爰片久久毛片毛片 | 国产精品人伦久久 | 国产大片在线观看 | 国产成人一区二区三区在线播放 | 69国产成人综合久久精品91 | 最近中文字幕无吗免费高清 | 丁香婷婷综合网 | 亚洲热热久久九九精品 | 国产xxxxxx久色视频在 | 中文字幕永久免费视频 |