亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 php教程 php手冊 PHP 5/Zend Engine 2.0的改進(jìn)

PHP 5/Zend Engine 2.0的改進(jìn)

Jun 21, 2016 am 09:15 AM
class function gt print

近兩年沒有使用PHP寫過程序了,今天要用PHP,就在網(wǎng)上查了查,看到了PHP5,一時之間興趣又大了起來,于是翻譯了這篇文章。
文章來源于http://www.php.net/。
新的對象模型
PHP中的對象處理部分已完全重寫,具有更佳的性能和更多的功能。在先前的PHP版本中,對象被當(dāng)做原始的簡單類型
(如integer和string)來處理,這種方法的缺點(diǎn)是當(dāng)變量被賦值或作為參數(shù)傳遞時,得到的是對象拷貝。而在新版本中,
對象是通過句柄來引用的,而不是通過對象的值(句柄想象為對象的標(biāo)識符)。
很多PHP程序員可能未意識到老的對象模型的“copying quirks“,因此以前的大多數(shù)PHP程序?qū)⒉恍枰鋈魏胃?
即可運(yùn)行,或只做很少的改動。

私有和保護(hù)成員
PHP 5引進(jìn)了私有和保護(hù)成員變量,它們可以定義可視化的類屬性。
示例
保護(hù)成員變量能在該類的子類中被訪問,而私有成員變量只能在所屬類中被訪問。
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; /* 不輸出任何內(nèi)容,以下類同 */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();?>

私有和保護(hù)方法

PHP 5(ZEND引擎2)中,私有方法和保護(hù)方法也被引入。
示例:
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)鍵字,但無需修改即可運(yùn)行。

抽象類和方法
PHP 5還引入了抽象類和方法。抽象方法只聲明方法的”符號”,而不提供它的實(shí)現(xiàn)。一個包含抽象方法的類需要聲明為”abstract”。
例如:
test();?>
抽象類不能實(shí)例化。
舊的代碼中的用戶自定義類或方法中雖未定義"abstract”關(guān)鍵字,但無需修改就可以運(yùn)行。
接口(Interfaces)
ZEND引擎2.0引入了接口。一個類可以實(shí)現(xiàn)任意的接口列表。
例如:

舊的代碼中的用戶定義類或方法中雖然沒有定義"interface”關(guān)鍵字,但無需修改就可以正常運(yùn)行。

類類型提示(Class Type Hints)
在保留類無需定義類型的同時,PHP 5引入了類類型提示來聲明,以期望把對象的類通過參數(shù)傳遞給一個方法。
例如:
a($b);$a->b($b);?>
這些類類型提示不是象一些需要類型定義的語言那樣在編譯中進(jìn)行檢查,而是在運(yùn)行時進(jìn)行檢查。這就意味著:

is equivalent to:

這種語法只用于對象或類,不適用于內(nèi)建(built-in)類型。

Final關(guān)鍵字(final)
PHP 5引入了“final”關(guān)鍵字以定義在子類中不能被覆蓋的成員或方法。
例:
class Foo { final function bar() { // ... }}?>
以前所寫代碼中的用戶自定義類或方法中雖未定義"final"關(guān)鍵字,但無需修改就可以運(yùn)行了。
對象克隆(Object Cloning)
PHP 4在對象被復(fù)制時,用戶不能判斷運(yùn)行那個拷貝構(gòu)造函數(shù)。在復(fù)制時,PHP 4根據(jù)對象的屬性
一位一位地復(fù)制一個同樣的復(fù)制品。
每次都要建立一個完全一樣的復(fù)制品并不總是我們想要的。一個很好的復(fù)制構(gòu)造例子是,當(dāng)有
一個代表一個GTK窗口的對象,它擁有該窗口的所有資源,當(dāng)你建立一個拷貝時,你可能需要一
個新的窗口,它擁有原窗口的所有屬性,但需要擁有新窗口的資源。另外一個例子是你有一個
對象引用了另外一個對象,當(dāng)你復(fù)制父對象時,你希望建立那個引用對象的新實(shí)例,以使復(fù)制品有一個單獨(dú)的拷貝。
對一個對象的拷貝通過調(diào)用對象的__clone()方法完成:
$copy_of_object = $object->__clone();
?>

當(dāng)開發(fā)者請求建立一個對象的新的拷貝時,ZEND引擎會檢查是否已經(jīng)定義了__clone()方法。如果未定義
的話,它會調(diào)用一個默認(rèn)的__clone()方法來復(fù)制該對象的所有屬性。如果定義了該方法,該方法會負(fù)責(zé)
在拷貝中設(shè)置必要的屬性。為使用方便,引擎會提供一個函數(shù)從源對象中導(dǎo)入所有的屬性,這樣它就可
以先得到一個具有值的源對象拷貝,然后只需要對需要改變的屬性進(jìn)行覆蓋即可。
例:
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)造
方法適用于在正式使用該類前進(jìn)行的初始化。
在PHP4中,構(gòu)造方法的名稱與類名相同。由于在派生類中調(diào)用父類的作法比較普遍,因此導(dǎo)致在
PHP4中當(dāng)類在一個大型的類繼承中進(jìn)行移動時,處理方式有點(diǎn)笨拙。當(dāng)一個派生類被移動到一個不同
的父類中時,父類的構(gòu)造方法名必然是不同的,這樣的話派生類中的有關(guān)調(diào)用父類構(gòu)造方法的語句需要改寫。
PHP5引入了一個定義構(gòu)造方法的標(biāo)準(zhǔn)方式,通過調(diào)用它們的__construct()來定義。
示例:
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();
?>

為向后兼容,當(dāng)PHP5類不能找到__construct()方法時,會通過老的方法也就是類名
來查找構(gòu)造方法。這意味著唯一可能產(chǎn)生兼容性問題的是在以前的代碼中已經(jīng)使用了
一個名為__construct()的方法名。

析構(gòu)方法
定義析構(gòu)方法是十分有用的。析構(gòu)方法可以記錄調(diào)試信息,關(guān)閉數(shù)據(jù)庫連接,還有做其它的掃尾
工作。PHP4中并無此機(jī)制,盡管PHP已支持注冊在請求結(jié)束時需要運(yùn)行的函數(shù)。
PHP5引入了與其它面向?qū)ο笳Z言如Java語言相似的析構(gòu)方法:當(dāng)最后一個該對象的引用被清除時,
系統(tǒng)將會在該對象從內(nèi)存中釋放前調(diào)用名為__destruct()的析構(gòu)方法。
示例:
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()語句進(jìn)行調(diào)用。

常量
PHP 5 引入了類常量(per-class constants)定義:
class Foo {
const constant = "constant";
}

echo "Foo::constant = " . Foo::constant . "\n";
?>

PHP5允許常量中包含表達(dá)式,但在編譯時常量中的表達(dá)式將被計算,
因此常量不能在運(yùn)行中改變它的值。
class Bar {
const a = 1const b = 1const c = a | b;
}
?>
以前代碼中的用戶自定義類或方法中雖然未定義"const”關(guān)鍵字,
但無需修改就可以運(yùn)行。

異常(Exceptions)
PHP4中沒異常處理,PHP5引入了與其它與語言相似的異常處理模型。
class MyExceptionFoo extends Exception {
function __construct($exception) {
parent::__construct($exception);
}
}

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

以前代碼中的用戶自定義類或方法中雖未定義'catch', 'throw' 和 'try'關(guān)鍵字,但無需修改
就可以運(yùn)行。

函數(shù)返回對象值
在PHP4中,函數(shù)不可能返回對象的值并對返回的對象進(jìn)行方法調(diào)用,隨著Zend Engine 2
(ZEND引擎2)的出現(xiàn),以下調(diào)用成為可能:
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)成員變量可初始化
例如:
class foo {
static $my_static = 5;
}

print foo::$my_static;
?>



靜態(tài)方法(Static Methods)
PHP5引入了關(guān)鍵字'static'來定義一個靜態(tài)方法,這樣可以從對象外進(jìn)行調(diào)用。
例如:

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

Foo::aStaticMethod();
?>

虛擬變量$this在被定義為靜態(tài)(static)的方法中無效。


Instanceof

PHP5引入了 “instanceof“關(guān)鍵字來確定一個對象是否是某一個對象的實(shí)例,或某一個對象的派生,或使用了某一個接口。

示例:

class baseClass { }

$a = new baseClass;

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





靜態(tài)函數(shù)變量(Static function variables)
所有的靜態(tài)變量現(xiàn)在在編譯時進(jìn)行處理,這允許開發(fā)者通過引用來指定靜態(tài)變量。這個變化提高了效率但意味著不可能對靜態(tài)變量進(jìn)行間接引用。


函數(shù)中通過引用方式傳遞的參數(shù)允許有默認(rèn)值
例如:

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



__autoload()



在初始化一個未定義的類時,__autoload()攔截函數(shù)(interceptor function)將被自動調(diào)
用。類名將作為__autoload()攔截函數(shù)唯一參數(shù)傳遞給它。
例如:
function __autoload($className) {
include_once $className . ".php";
}

$object = new ClassName;
?>



方法和屬性調(diào)用的重載
所有方法調(diào)用和屬性訪問都可以通用 __call(), __get() 和 __set()方法來重載。

例: __get() 和 __set()
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()

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



本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
華為GT3 Pro和GT4的差異是什麼? 華為GT3 Pro和GT4的差異是什麼? Dec 29, 2023 pm 02:27 PM

許多用戶在選擇智慧型手錶的時候都會選擇的華為的品牌,其中華為GT3pro和GT4都是非常熱門的選擇,不少用戶都很好奇華為GT3pro和GT4有什麼區(qū)別,下面就給大家介紹一下二者。華為GT3pro和GT4有什麼差別一、外觀GT4:46mm和41mm,材質(zhì)是玻璃鏡板+不鏽鋼機(jī)身+高分纖維後殼。 GT3pro:46.6mm和42.9mm,材質(zhì)是藍(lán)寶石玻璃鏡+鈦金屬機(jī)身/陶瓷機(jī)身+陶瓷後殼二、健康GT4:採用最新的華為Truseen5.5+演算法,結(jié)果會更加的精準(zhǔn)。 GT3pro:多了ECG心電圖和血管及安

Python中的class類別和method方法的使用方法 Python中的class類別和method方法的使用方法 Apr 21, 2023 pm 02:28 PM

類別和方法的概念和實(shí)例類別(Class):用來描述具有相同的屬性和方法的物件的集合。它定義了該集合中每個物件所共有的屬性和方法。物件是類別的實(shí)例。方法:類別中定義的函數(shù)。類別的建構(gòu)方法__init__():類別有一個名為init()的特殊方法(建構(gòu)方法),該方法在類別實(shí)例化時會自動呼叫。實(shí)例變數(shù):在類別的宣告中,屬性是用變數(shù)來表示的,這種變數(shù)就稱為實(shí)例變量,實(shí)例變數(shù)就是用self修飾的變數(shù)。實(shí)例化:建立一個類別的實(shí)例,類別的具體物件。繼承:即一個派生類別(derivedclass)繼承基底類別(baseclass)的

修復(fù):截圖工具在 Windows 11 中不起作用 修復(fù):截圖工具在 Windows 11 中不起作用 Aug 24, 2023 am 09:48 AM

為什麼截圖工具在Windows11上不起作用了解問題的根本原因有助於找到正確的解決方案。以下是截圖工具可能無法正常工作的主要原因:對焦助手已開啟:這可以防止截圖工具開啟。應(yīng)用程式損壞:如果截圖工具在啟動時崩潰,則可能已損壞。過時的圖形驅(qū)動程式:不相容的驅(qū)動程式可能會幹?jǐn)_截圖工具。來自其他應(yīng)用程式的干擾:其他正在運(yùn)行的應(yīng)用程式可能與截圖工具衝突。憑證已過期:升級過程中的錯誤可能會導(dǎo)致此issu簡單的解決方案這些適合大多數(shù)用戶,不需要任何特殊的技術(shù)知識。 1.更新視窗與Microsoft應(yīng)用程式商店應(yīng)用程

function是什麼意思 function是什麼意思 Aug 04, 2023 am 10:33 AM

function是函數(shù)的意思,是一段具有特定功能的可重複使用的程式碼區(qū)塊,是程式的基本組成單元之一,可以接受輸入?yún)?shù),執(zhí)行特定的操作,並傳回結(jié)果,其目的是封裝一段可重複使用的程式碼,提高程式碼的可重複使用性和可維護(hù)性。

python中class是什麼意思 python中class是什麼意思 May 21, 2019 pm 05:10 PM

class是python中的一個關(guān)鍵字,用來定義一個類,定義類別的方法:class後面加一個空格然後加類名;類名規(guī)則:首字母大寫,如果多個單字用駝峰命名法,如【class Dog()】。

使用jQuery替換元素的class名稱 使用jQuery替換元素的class名稱 Feb 24, 2024 pm 11:03 PM

jQuery是一種經(jīng)典的JavaScript庫,被廣泛應(yīng)用於網(wǎng)頁開發(fā)中,它簡化了在網(wǎng)頁上處理事件、操作DOM元素和執(zhí)行動畫等操作。在使用jQuery時,常會遇到需要取代元素的class名稱的情況,本文將介紹一些實(shí)用的方法,以及具體的程式碼範(fàn)例。 1.使用removeClass()和addClass()方法jQuery提供了removeClass()方法來刪除

Vue報錯:無法正確使用v-bind綁定class和style,怎麼解決? Vue報錯:無法正確使用v-bind綁定class和style,怎麼解決? Aug 26, 2023 pm 10:58 PM

Vue報錯:無法正確使用v-bind綁定class和style,怎麼解決?在Vue開發(fā)中,我們常常會用到v-bind指令來動態(tài)綁定class和style,但是有時候我們可能會遇到一些問題,如無法正確使用v-bind綁定class和style。在本篇文章中,我將為你解釋這個問題的原因,並提供解決方案。首先,讓我們先來了解v-bind指令。 v-bind用於將V

解決'[Vue warn]: v-bind:class/ :class”錯誤的方法 解決'[Vue warn]: v-bind:class/ :class”錯誤的方法 Aug 26, 2023 am 08:17 AM

解決「[Vuewarn]:v-bind:class/:class」錯誤的方法在使用Vue開發(fā)過程中,我們常常會遇到一些錯誤提示,其中一個常見的錯誤就是「[Vuewarn]:v-bind:class /:class”錯誤。這個錯誤提示通常出現(xiàn)在我們使用v-bind:class或:class屬性時,表示Vue無法正確解析我們設(shè)定的class值。那麼,如

See all articles