PHP 5昨天隆重推出--PHP 5/Zend Engine 2.0新功能_PHP教程

WBOY
發布: 2016-07-21 16:10:39
原創
803 人瀏覽過


前言

   今天突然想到PHP官方網站上一轉,一眼就看到PHP5推出的通告。雖然以前看過PHP5的預告,但還是仔細看了PHP 5/Zend Engine 2.0新特性一文,一股JAVA氣息撲面而來...
   特將該文試譯出來,首發於CSDN網站,以饗讀者。

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

全新的物件模型
PHP中的物件處理部分已完全重寫,具有更佳的效能和更多的功能。在PHP的先前版本中,物件與內建變數類型(如integer和string)的處理方法相同,其弊端是當變數被賦值為物件或物件作為參數傳遞時,得到的是物件複製品。而在新版本中,物件透過句柄進行引用,而不是透過它的值。 (句柄可以認是為是物件的標識符)
許多PHP程式設計師可能未意識到先前的物件模型的“複製怪癖”,因此先前的PHP程式將不需要做任何更改,或只做很小的改動即可運行
私有和保護成員
PHP 5引入了私有和保護成員變量,它們可以定義類別屬性在何時可以被存取。

類別的保護成員變數能在該類別的擴展類別中被訪問,而私有成員變數只能在本類中被存取。
class MyClass {
    private $Hello = "Hello, World!n";
    protected $ tedF Hello, Bar!n";

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

$obj = new MyClass();
print $obj->H>$obj = new MyClass();
print $obj->Hello; print out anything */
print $obj->Bar;    /* Shouldn't print out anything */
print $obj->Foo;    /* Shouldn't print $ ->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->print Shouldn't print out anything */
$obj->print Shouldn(); ?>
私有和保護方法
在PHP 5(ZEND引擎2)中,也引進了私有和保護方法。
例:
class Foo {
    private function aPrivateMethod() {
       🎜>    protected function aProtectedMethod() {
        echo "Foo::aProtectedMethod() called.n";}

class extends Foo {
    public function aPublicMethod() {
        echo "Bar::aPublicMethod() called.n";}

$o = new Bar;
$o->aPublicMethod();
?>
先前程式碼中的使用者自訂類別或方法中雖未定義"public," "protected"或"private"等關鍵字,但無需編輯即可運行。
抽象類別和方法
PHP 5也引入了抽象類別和方法。抽象方法只聲明方法定義, 不供實際運作。包含抽象方法的類別需要聲明為抽象類別。
例:
abstract class AbstractClass {
    abstract public function test();
}

class ImplementedClass Class test. ) {
        echo "ImplementedClass::test() called.n";
    }
}

$otest = test ImplementClass; 🎜>?>
抽象類別不能實例化。先前程式碼中的使用者自訂類別或方法中雖未定義"abstract」關鍵字,但無需編輯即可運行。
介面
ZEND引擎2.0引入了介面。一個類別可以運行任意的介面列表。
Example
例:
interface Throwable {
    public function getMessage();
}
    // ...
}
?>
先前程式碼中的使用者自訂類別或方法中雖未定義"interface」關鍵字,但無需編輯即可執行。
類別類型定義
在保留類別無需定義類型的同時,PHP 5引入了類別類型定義來聲明希望把哪個類別透過參數傳遞給一個方法。
Example
例:
interface Foo {
    function a(Foo $foo);
}}

class FooBar implements Foo, Bar {
    function a(Foo $foo) {
   🎜>    function b(Bar $bar) {
        // ...
    }
}
Bar
$a->a($b);
$a->b($b);
?>
這些類類型定義在不像一些需要類型預定義的語言在編譯中進行檢查,而是在運行時進行。這表示:
function foo(ClassName $object) {
    // ...
}
?>
等價於:
php
function foo($object) {
    if (!($object instanceof ClassName)) {
        die("Argument 1 mustbeClass );
?>
本語法只用於物件或類別,不適用於內建類型。

final
PHP 5引入了「final」關鍵字定義在子類別中不能被覆寫的成員或方法。
例:
class Foo {
    final function bar() {
        // ...物件複製
PHP 4在物件被複製時,使用者無法決定拷貝的機制。在複製時,PHP 4只一位一位地複製一個和原來物件一模一樣的複製品。
我們並不是每次都要建立一個完全一樣的複製品。一個很好的需要一種複製機制的例子是,當有一個代表一個GTK窗口的對象,它擁有該窗口的所有資源,當你建立一個拷貝時,你可能需要一個新的窗口,它擁有原始窗口的所有屬性,但需要擁有新視窗的資源。另外一個例子是你有一個物件引用了另一個對象,當你複製父對象時,你希望建立那個引用對象的新實例,以使複製品引用它。
對一個物件的拷貝透過呼叫物件的__clone()方法完成:
$copy_of_object = $object->__clone();
?>
當開發者當請求建立一個物件的新的拷貝時,ZEND引擎會檢查是否定義了__clone()方法。如果未定義的話,它會呼叫一個預設的__clone()方法來複製該物件的所有屬性。如果定義了該方法,則該方法會負責在拷貝中設定必要的屬性。為方便起見,引擎會提供一個函數從來源物件匯入所有的屬性,這樣它就可以先得到一個具有值的來源物件拷貝,只需要對需要改變的屬性進行覆寫即可。
例:
class MyCloneable {
    static $id = 0;

    function MyCloneable() {   id ;
    }

    function __clone() {
        $        $ 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
class BaseClass {
    function __construct() {
        print "In BaseClass constructorn";
    }
}

class SubClass extends BaseClass {
    function __construct() {
        parent::__construct();
   
$obj = new BaseClass ();
$obj = new SubClass();
?>
為向下相容,PHP5當在類別不能找到__construct()方法時,會透過老的方法也就是類別名稱來查找構造方法。這意味著唯一可能產生相容性問題的是在先前的程式碼中已經使用了一個名為__construct()的方法名稱。
析構法
定義析構法是十分有用的。析構方法可以記錄調試信息,關閉資料庫連接,還有做其它的掃尾工作。 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,, 5% restructor, nichat ​​☺ parameters, is called before the object is freed from memory.
PHP5引入了與其它面向對象語言如Java語言相似的析構方法:當最後一個該對象的引用被清除時,系統將會在該對象從記憶體中釋放前呼叫名為__destruct()的析構方法。
例:
class MyDestructableClass {
    function __construct() {
       🎜> }

    function __destruct() {
        print "Destroying " . $this->name . "n";
  );
?>
和建構方法相似,引擎將不呼叫父類別的析構方法,為呼叫該方法,你需要在子類別的析構方法中透過parent::__destruct()語句進行調用。
常數
PHP 5 引入了類別常數定義:
class Foo {
    const constant = "constant";
}
?>

PHP5允許常數中有表達式,但在編譯時常數中的表達式將被計算.,因此常數不能在運行中改變它的值。
class Bar {
    const a = 1    const b = 1    pst = a >?>
先前程式碼中的使用者自訂類別或方法中雖未定義"const」關鍵字,但無需編輯即可運行。
例外
PHP 4 had no exception handling. PHP 5 introduces a exception model similar to that of other programming languages.
PHP4無例外處理,PHP5引用了與其它語言相似的例外處理模型。
例:
class MyExceptionFoo extends Exception {
    function __construct($exception)

try {
    throw new MyExceptionFoo("Hello");
} catch (MyException $exception) {
   >print $exception $ >
先前程式碼中的使用者自訂類別或方法中雖未定義'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 follo is snow在PHP4中,函數不可能傳回物件的值並對傳回的物件進行方法調用,透過ZEND引擎2中,這一切變得可能:
class Circle {
    function draw( ) {
        print "Circlen";
    }
}

class Square {    }
}

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

ShapeFactoryMethod("Circle")->d🎜>
ShapeFactoryMethod("Circle")->draw((); >?>
靜態類別中的靜態成員變數現在可初始化
Example
class foo {
    static $my_static = 5;
}


print foo::$my_static;
?>
靜態方法
PHP5引入了關鍵字'static'來定義靜態方法,這樣可以從物件外呼叫。
例:
class Foo {
    public static function aStaticMethod() {
       ::aStaticMethod();
?>
虛擬變數$this在靜態方法中無效。
instanceof
PHP5引入了關鍵字instanceof來決定一個物件是否是某一個物件的實例,或某一個物件的派生,或使用了某一個介面。
例:
class baseClass { }

$a = new baseClass;

if ($a nceof basicClass) {
 World";
}
?>
靜態函數變數
所有的靜態變數現在在編譯時進行處理,這允許開發者透過引用來指定靜態變數。這個變化提高了效率但意味著不可能對靜態變數進行間接引用。
函數中透過以位址傳送方式的參數允許定義預設值
範例:
function my_function(&$var = null) {
    if ($var === null) {
        die("$var needs to have a value");
    }
}
?>
17引擎將自動呼叫__autoload()攔截器函數。這個類別名稱將作為__autoload()攔截器函數唯一參數傳遞給它。
例子:
function __autoload($className) {
    include_once $className . ".php";
}

🎜>?>
方法和屬性呼叫的重載
通用__call(), __get() 和__set()方法可以進行方法和屬性呼叫的重載。

例如: __get() 且__set()
class Setter {
    public $n;
    public $x = array("a" =>; 1, "b" => 2, "c" => 3);

    function __get($nm) {
        (isset($this->x[$nm])) {
            $r = $this->x[$nm];
       return $r;
        } else {
            print "無!n";
   function __set($nm, $val) {
         print "設定[ $nm ] 到$valn";

        if (isset($this->x[$nm])) {
          print "OK !n";
        } else {
            print "不好! 🎜>$foo = new Setter() ;
$foo->n = 1;
$foo->a = 100;
$foo->a ;
$foo->z ;
var_dump( $foo);
? >;
範例: __call()
class Caller {
    var $x = array(1, 2, 3);

    $ a) {
        print "方法$m 被召喚:n";
        var_dump($a);

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





http://www.bkjia.com/PHPjc/314178.html

www.bkjia.com

true

http: //www.bkjia.com/PHPjc/314178.html

TechArticle

前言今天突然想到PHP官方網站上一轉,匆匆就看到PHP5推出的公告。雖然之前看過 PHP5 的預告片,但我還是仔細研究了 PHP 5/Zend Engine 2.0 新特性一文...

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!