国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 後端開發(fā) php教程 PHP5/ZendEngine2的改進(jìn)_PHP教程

PHP5/ZendEngine2的改進(jìn)_PHP教程

Jul 21, 2016 pm 04:11 PM
php php5 處理 物件 改進(jìn) 模型 部分 重寫


新的物件模型
PHP中的物件處理部分已完全重寫,具有更佳的效能和更多的功能。在先前的PHP版本中,物件被當(dāng)做原始的簡(jiǎn)單類型
(如integer和string)來處理,這種方法的缺點(diǎn)是當(dāng)變數(shù)被賦值或作為參數(shù)傳遞時(shí),得到的是物件拷貝。而在新版本中,
物件是透過句柄來引用的,而不是透過物件的值(句柄想像為物件的識(shí)別碼)。
許多PHP程式設(shè)計(jì)師可能未意識(shí)到舊的物件模型的“copying quirks“,因此以前的大多數(shù)PHP程式將不需要做任何更改
即可運(yùn)行,或只做很少的改動(dòng)。

私有和保護(hù)成員
PHP 5引進(jìn)了私有和保護(hù)成員變量,它們可以定義可視化的類別屬性。
範(fàn)例
保護(hù)成員變數(shù)能在該類別的子類別中被訪問,而私有成員變數(shù)只能在所屬類別中被存取。
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; /* 不輸出任何內(nèi)容,以下類別同*/
print $obj->Bar ; /* Shouldn't print out anything */
print $obj->Foo; /* Shouldn't print out anything */
$obj->printHello(); /* Should print */
$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ù)方法也被引入。
範(fàn)例:
private function aPrivateMethod() {
echo "Foo::aPrivateMethod() called.n";
}
protected function atected( {
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)鍵字,但無需修改即可運(yùn)行。

抽象類別和方法 PHP 5也引入了抽象類別和方法。抽象方法只聲明方法的”符號(hào)”,而不提供它的實(shí)作。一個(gè)包含抽象方法的類別需要聲明為”abstract”。
例如:

phpabstract class AbstractClass {
abstract public function test();
}
class ImplementedClass extends AbstractClass {
}
class ImplementedClass extends AbstractClass {
}
class ImplementedClass extends AbstractClass {
public) >echo "ImplementedClass::test() called.n";
}
}
$o = new ImplementedClass;$o->test();
?>
抽象類別不能實(shí)例化。
舊的程式碼中的使用者自訂類別或方法中雖未定義"abstract」關(guān)鍵字,但無需修改即可運(yùn)行。
介面(Interfaces)
ZEND引擎2.0引入了介面。一個(gè)類別可以實(shí)現(xiàn)任意的介面列表。
例如:

舊的程式碼中的使用者定義類別或方法中雖然沒有定義"interface」關(guān)鍵字,但無需修改即可正常運(yùn)作。

類別類型提示(Class Type Hints)
在保留類別無需定義類型的同時(shí),PHP 5引入了類別類型提示來聲明,以期望把物件的類別透過參數(shù)傳遞給一個(gè)方法。
例如:
a($b);$a->b($b );?>
這些類別類型提示不是像一些需要類型定義的語言那樣在編譯中進(jìn)行檢查,而是在執(zhí)行時(shí)進(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在物件被複製時(shí),使用者無法判斷執(zhí)行那個(gè)拷貝建構(gòu)子。在複製時(shí),PHP 4根據(jù)物件的屬性
一位一位地複製一個(gè)相同的複製品。
每次都要建立一個(gè)完全一樣的複製品並不總是我們想要的。一個(gè)很好的複製構(gòu)造例子是,當(dāng)有
一個(gè)代表一個(gè)GTK窗口的對(duì)象,它擁有該窗口的所有資源,當(dāng)你建立一個(gè)拷貝時(shí),你可能需要一
個(gè)新的窗口,它擁有原始視窗的所有屬性,但需要擁有新視窗的資源。另外一個(gè)例子是你有一個(gè)
對(duì)象引用了另一個(gè)對(duì)象,當(dāng)你複製父對(duì)象時(shí),你希望建立那個(gè)引用對(duì)象的新實(shí)例,以使復(fù)製品有一個(gè)單獨(dú)的拷貝。
對(duì)一個(gè)物件的拷貝透過呼叫物件的__clone()方法完成:
$copy_of_object = $object->__clone();
?>

當(dāng)開發(fā)者要求建立一個(gè)物件的新的拷貝時(shí),ZEND引擎會(huì)檢查是否已經(jīng)定義了__clone()方法。如果未定義
的話,它會(huì)呼叫一個(gè)預(yù)設(shè)的__clone()方法來複製該物件的所有屬性。如果定義了該方法,則該方法會(huì)負(fù)責(zé)
在拷貝中設(shè)定必要的屬性。為使用方便,引擎會(huì)提供一個(gè)函數(shù)從來源物件匯入所有的屬性,這樣它就可
以先得到一個(gè)具有值的來源物件拷貝,然後只需要對(duì)需要改變的屬性進(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)造方法的類別在新建時(shí)會(huì)先呼叫構(gòu)造方法,構(gòu)造
方法適用於在正式使用該類別前進(jìn)行的初始化。
在PHP4中,建構(gòu)方法的名稱與類別名稱相同。由於在衍生類別中呼叫父類別的作法比較普遍,因此導(dǎo)致在 PHP4中當(dāng)類別在一個(gè)大型的類別繼承中進(jìn)行移動(dòng)時(shí),處理方式有點(diǎn)笨拙。當(dāng)一個(gè)衍生類別被移到一個(gè)不同 的父類別中時(shí),父類別的建構(gòu)方法名稱必然是不同的,這樣的話派生類別中的有關(guān)呼叫父類別建構(gòu)方法的語句需要改寫。 PHP5引入了一個(gè)定義建構(gòu)方法的標(biāo)準(zhǔn)方式,透過呼叫它們的__construct()來定義。
示例:
class BaseClass {
function __construct() {
print "In BaseClass constructorn";
}
}

class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructorn";
}
}

$obj = new BaseClass();
$obj = new SubClass();
?>

為向後相容,當(dāng)PHP5類別無法找到__construct()方法時(shí),會(huì)經(jīng)過舊的方法也就是類別名稱
來找出建構(gòu)方法。這意味著唯一可能產(chǎn)生相容性問題的是在先前的程式碼中已經(jīng)使用了
一個(gè)名為__construct()的方法名稱。

析構(gòu)法
定義析構(gòu)法是十分有用的。析構(gòu)方法可以記錄調(diào)試信息,關(guān)閉資料庫連接,還有做其它的掃尾
工作。 PHP4中並無此機(jī)制,儘管PHP已支援註冊(cè)在請(qǐng)求結(jié)束時(shí)需要執(zhí)行的函數(shù)。
PHP5引入了與其它物件導(dǎo)向語言如Java語言相似的析構(gòu)方法:當(dāng)最後一個(gè)該物件的參考被清除時(shí),
系統(tǒng)將會(huì)在該物件從記憶體中釋放前呼叫名為__destruct ()的析構(gòu)方法。
範(fàn)例:
class MyDestructableClass {
function __construct() {
print "In constructorn";
$this->name = "MyDestructableClass";
}

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

$obj = new MystructDestructable( );
?>

和構(gòu)造方法相似,引擎將不調(diào)用父類的析構(gòu)方法,為調(diào)用該方法,你需要在子
類的析構(gòu)方法中通過parent: :__destruct()語句進(jìn)行呼叫。

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

echo "Foo::constant = " . Foo::constant . "n";
?>
PHP5允許常數(shù)中包含表達(dá)式,但在編譯時(shí)常數(shù)中的表達(dá)式將被計(jì)算,
因此常數(shù)不能在運(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);
}
parent::__construct($exception);
}
}
}
try {
throw new MyExceptionFoo("Hello");
} catch (MyExceptionFoo $exception) {
print $exception->getMessage();
}
print $exception->getMessage();
}
>
>

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

函數(shù)返回物件值
在PHP4中,函數(shù)不可能返回物件的值並對(duì)返回的物件進(jìn)行方法調(diào)用,隨著Zend Engine 2
(ZEND引擎2)的出現(xiàn),以下呼叫成為可能:
class Circle {
function draw() {
print "Circlen";
}
}

class Square {
function draw() {
print "Squaren";
}
}

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

ShapeFactoryMethod("Circle")- >draw();
ShapeFactoryMethod("Square")->draw();
?>

靜態(tài)類別中的靜態(tài)成員變數(shù)可初始化
例如:
php
class foo {
static $my_static = 5;
}

print foo::$my_static;
?>


靜態(tài)方法(>靜態(tài)方法(>靜態(tài)方法(>靜態(tài)方法(>靜態(tài)方法(>靜態(tài)方法(>靜態(tài)方法(>靜態(tài)方法(>靜態(tài)方法(>靜態(tài)方法(>) Static Methods)
PHP5引入了關(guān)鍵字'static'來定義一個(gè)靜態(tài)方法,這樣可以從物件外呼叫。
例如:

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

Foo::aStaticMethod();
?>

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


Instanceof

PHP5引入了 「instanceof「關(guān)鍵字來決定一個(gè)物件是否是某一個(gè)物件的實(shí)例,或某一個(gè)物件的衍生,或使用了某一個(gè)介面。

範(fàn)例:

class baseClass { }

$a = new baseClass;

if ($a instanceof basicClass) {of basicClass) {of basicClass) {of basicClass) {of basicClass)
echo "Hello World";
}
?>
靜態(tài)函數(shù)變數(shù)(Static function variables) 所有的靜態(tài)變數(shù)現(xiàn)在在編譯時(shí)進(jìn)行編譯時(shí)進(jìn)行處理,這允許開發(fā)者透過引用來指定靜態(tài)變數(shù)。這個(gè)變化提高了效率但意味著不可能對(duì)靜態(tài)變數(shù)進(jìn)行間接引用。


函數(shù)中透過引用方式傳遞的參數(shù)允許有預(yù)設(shè)值
例如:

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


__autoload ()


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

$object = new ClassName
?>


方法和屬性呼叫的重載
所有方法呼叫和屬性存取都可以通用__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: $rn";
return $r;
} else {
print "Nothing!n";
}
}

function __set($nm, $val) {
print "Setting [$nm] to $ valn";

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


範(fàn)例: __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);
?>


www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/313997.htmlTechArticle新的物件模型PHP中的物件處理部分已完全重寫,具有更佳的效能和更多的功能。在先前的PHP版本中,物件被當(dāng)作原始的簡(jiǎn)單類型 (如inte...
本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(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版

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

為什麼我們?cè)u(píng)論:PHP指南 為什麼我們?cè)u(píng)論:PHP指南 Jul 15, 2025 am 02:48 AM

PHPhasthreecommentstyles://,#forsingle-lineand/.../formulti-line.Usecommentstoexplainwhycodeexists,notwhatitdoes.MarkTODO/FIXMEitemsanddisablecodetemporarilyduringdebugging.Avoidover-commentingsimplelogic.Writeconcise,grammaticallycorrectcommentsandu

如何在Windows上安裝PHP 如何在Windows上安裝PHP Jul 15, 2025 am 02:46 AM

安裝PHP在Windows上的關(guān)鍵步驟包括:1.下載合適的PHP版本並解壓,推薦使用ThreadSafe版本配合Apache或NonThreadSafe版本配合Nginx;2.配置php.ini文件,將php.ini-development或php.ini-production重命名為php.ini;3.將PHP路徑添加到系統(tǒng)環(huán)境變量Path中以便命令行使用;4.測(cè)試PHP是否安裝成功,通過命令行執(zhí)行php-v和運(yùn)行內(nèi)置服務(wù)器測(cè)試解析能力;5.若使用Apache,需在httpd.conf中配置P

PHP語法:基礎(chǔ)知識(shí) PHP語法:基礎(chǔ)知識(shí) Jul 15, 2025 am 02:46 AM

PHP的基礎(chǔ)語法包括四個(gè)關(guān)鍵點(diǎn):1.PHP標(biāo)籤必須使用結(jié)束,推薦使用完整標(biāo)籤;2.輸出內(nèi)容常用echo和print,其中echo支持多參數(shù)且效率更高;3.註釋方式有//、#和//,用於提升代碼可讀性;4.每條語句必須以分號(hào)結(jié)尾,空格和換行不影響執(zhí)行但影響可讀性。掌握這些基本規(guī)則有助於寫出清晰穩(wěn)定的PHP代碼。

PHP 8安裝指南 PHP 8安裝指南 Jul 16, 2025 am 03:41 AM

在Ubuntu上安裝PHP8的步驟為:1.更新軟件包列表;2.安裝PHP8及基礎(chǔ)組件;3.檢查版本確認(rèn)安裝成功;4.按需安裝額外模塊。 Windows用戶可下載ZIP包並解壓,隨後修改配置文件、啟用擴(kuò)展並將路徑加入環(huán)境變量。 macOS用戶推薦使用Homebrew安裝,依次執(zhí)行添加tap、安裝PHP8、設(shè)置默認(rèn)版本及驗(yàn)證版本等步驟。不同系統(tǒng)下安裝方式雖有差異,但流程清晰,根據(jù)用途選對(duì)方法即可。

python如果還有示例 python如果還有示例 Jul 15, 2025 am 02:55 AM

寫Python的ifelse語句關(guān)鍵在於理解邏輯結(jié)構(gòu)與細(xì)節(jié)。 1.基礎(chǔ)結(jié)構(gòu)是if條件成立執(zhí)行一段代碼,否則執(zhí)行else部分,else可選;2.多條件判斷用elif實(shí)現(xiàn),順序執(zhí)行且一旦滿足即停止;3.嵌套if用於進(jìn)一步細(xì)分判斷,建議不超過兩層;4.簡(jiǎn)潔場(chǎng)景可用三元表達(dá)式替代簡(jiǎn)單ifelse。注意縮進(jìn)、條件順序及邏輯完整性,才能寫出清晰穩(wěn)定的判斷代碼。

什麼是PHP,它是用什麼? 什麼是PHP,它是用什麼? Jul 16, 2025 am 03:45 AM

PHPisaserver-sidescriptinglanguageusedforwebdevelopment,especiallyfordynamicwebsitesandCMSplatformslikeWordPress.Itrunsontheserver,processesdata,interactswithdatabases,andsendsHTMLtobrowsers.Commonusesincludeuserauthentication,e-commerceplatforms,for

您的第一個(gè)PHP腳本:實(shí)用介紹 您的第一個(gè)PHP腳本:實(shí)用介紹 Jul 16, 2025 am 03:42 AM

如何開始編寫第一個(gè)PHP腳本?首先設(shè)置本地開發(fā)環(huán)境,安裝XAMPP/MAMP/LAMP,使用文本編輯器,了解服務(wù)器運(yùn)行原理。其次,創(chuàng)建一個(gè)名為hello.php的文件,輸入基本代碼並運(yùn)行測(cè)試。第三,學(xué)習(xí)混合使用PHP與HTML以實(shí)現(xiàn)動(dòng)態(tài)內(nèi)容輸出。最後,注意常見錯(cuò)誤如缺少分號(hào)、引用問題及文件擴(kuò)展名錯(cuò)誤,並開啟錯(cuò)誤報(bào)告以便調(diào)試。

您如何處理PHP中的文件操作(閱讀/寫作)? 您如何處理PHP中的文件操作(閱讀/寫作)? Jul 16, 2025 am 03:48 AM

tohandlefileoperationsinphp,useApprepreprunctions andModes.1.toreadafile,usefile_get_contents()forsmallfilesorfgets()inaloopforline by line-line-processing.2.towriteToafile,usefile_put_cte_contents(usefile_contents)(

See all articles