昨日、PHP 5 が盛大にリリースされました -- PHP 5 の新機能/Zend Engine 2.0_PHP チュートリアル

WBOY
リリース: 2016-07-21 16:10:39
オリジナル
791 人が閲覧しました


まえがき

今日、ふと思い立ってPHPの公式サイトに行ってみると、PHP5のリリースのお知らせがチラッと目に入りました。以前に PHP5 のプレビューを見たことはありましたが、それでも PHP 5/Zend Engine 2.0 の新機能に関する記事を注意深く読んで、JAVA の息吹が私の顔に湧きました...
この記事を特別に翻訳して初公開しましたCSDN Web サイトでお楽しみいただけます。

PHP 5/Zend Engine 2.0の新機能
Xu Huanchunによる翻訳 sfwebsite@hotmail.com
http://www.php.net/zend-engine-2.php

新しいオブジェクトモデル
PHPパーツでのオブジェクト処理パフォーマンスが向上し、機能が追加されて完全に書き直されました。以前のバージョンの PHP では、オブジェクトは組み込み変数タイプ (整数や文字列など) と同じように扱われていましたが、変数がオブジェクトに割り当てられたとき、またはオブジェクトがパラメーターとして渡されたときにコピーが取得されるという欠点がありました。オブジェクトの。新しいバージョンでは、オブジェクトは値ではなくハンドルによって参照されます。 (ハンドルはオブジェクトの識別子と考えることができます)
多くの PHP プログラマーは、以前のオブジェクト モデルの「コピーの癖」に気づいていない可能性があるため、以前の PHP プログラムは変更を加える必要がないか、わずかな変更だけで済みます。実行準備完了
プライベート メンバーと保護されたメンバー
PHP 5 では、クラス プロパティにいつアクセスできるかを定義するプライベート メンバー変数と保護されたメンバー変数が導入されました。

クラスの保護されたメンバー変数はこのクラスの拡張クラスでアクセスできますが、プライベート メンバー変数はこのクラスでのみアクセスできます。
class MyClass {
private $Hello = "Hello, World!n";
protected $Bar = "Hello, Foo!n";
protected $Foo = "Hello, Bar!n";

function printHello() {
printHello() . s MyClass {
/* 出力する必要があります */
print "MyClass2 ::printHello() " . >こんにちは; /* 何も出力しないでください */
printHello () :: 宣言済み)*/
print "MyClass2::printHello() " / ; /* 何も出力しません */
print $obj ->Bar; /* 何も出力しません */
print $obj->Foo; /* 何も出力しません */
$obj->printHello(); /* 出力します */

$obj = new MyClass2();
print $obj->Hello; /* 何も出力しません */
print $obj-> ;Bar; /* 何も出力しません */
print $obj->Foo; /* 何も出力しません */
$obj->printHello();
?>
プライベート メソッドと保護されたメソッド
PHP 5 (ZEND エンジン 2) では、プライベート メソッドと保護されたメソッドなども紹介されていました。
例:
class Foo {
private function aPrivateMethod() {
echo "Foo::aPrivate () () called.n" echo "Foo::aProtectedMethod () known.n";
$this ->aPrivateMethod();
}
}

class Bar extends Foo {
public function aPublicMethod() {
echo "Bar::aPublicMethod() called.n";
$this->aProtectedMethod();
}
}

$o = new Bar;
$o->aPublicMethod();
?>
前のコードではユーザー定義クラスやメソッドには定義されていませんが、「public」などのキーワードは、 「保護」または「プライベート」ですが、編集せずに実行できます。
抽象クラスとメソッド
PHP 5 では、抽象クラスとメソッドも導入されています。抽象メソッドはメソッド定義を宣言するだけで、実際の実行は提供しません。抽象メソッドを含むクラスは、抽象クラスとして宣言する必要があります。
例:
abstract class AbstractClass {
abstract public function test();
}

class ImplementedClass extends AbstractClass {
public function test() {
echo "ImplementedClass::test() added.n" ;
}
}

$o = new ImplementedClass;
$o->test();
?>
抽象クラスはインスタンス化できません。前のコードのユーザー定義クラスまたはメソッドで「abstract」キーワードが定義されていませんが、編集せずに実行できます。
インターフェース
ZEND Engine 2.0 にはインターフェースが導入されています。クラスはインターフェイスの任意のリストを実行できます。

例:
interface Throwable {
public function getMessage();
}

class Exception 実装 Throwable {
public function getMessage() {
// ...
}
?>前のコードのユーザー定義クラスまたはメソッドで「interface」キーワードが定義されていませんが、編集せずに実行できます。
クラス型定義
型を定義せずにクラスを保持しながら、PHP 5 では、パラメーターを通じてメソッドに渡すクラスを宣言するためのクラス型定義が導入されました。

例:
interface Foo {
function a(Foo $foo);
}

interface Bar {
function b(Bar $bar);
}

class FooBarimplements Foo, Bar {
関数 a(Foo $foo) {
// ...
}

関数 b(Bar $bar) {
関数 b(Bar $bar) // ...
}
}

$a = new FooBar;
$b = new FooBar;

$a->a($b);
$a->b($b);
?>
これらのクラス型定義は、他のものと同様にコンパイル中に実行されません。型の事前定義が必要な言語の場合、チェックは実行時に行われます。これは次のことを意味します:
function foo(ClassName $object) (! ($ Object Instanceof ClassName)) {
DIE ("引数 1 は className のインスタンスである必要があります");

final
PHP 5 では、サブクラスでオーバーライドできないメンバーまたはメソッドを定義するために「final」キーワードが導入されました。
例:
class Foo {
final function bar() 」キーワードですが、編集しなくても機能します。
オブジェクトの複製
PHP 4 オブジェクトがコピーされるとき、ユーザーはコピーのメカニズムを決定できません。コピーする場合、PHP 4 は元のオブジェクトの正確なコピーを少しずつ作成します。
毎回正確なレプリカを構築する必要はありません。コピー メカニズムが必要になる良い例は、GTK ウィンドウを表すオブジェクトがあり、そのウィンドウのすべてのリソースを所有する場合です。コピーを作成するときに、元のウィンドウのすべてのプロパティを所有する新しいウィンドウが必要になる場合があります。新しいウィンドウのリソースを所有する必要があります。別の例としては、別のオブジェクトを参照するオブジェクトがあり、親オブジェクトをコピーするときに、その参照先オブジェクトの新しいインスタンスを作成して、コピーがそれを参照するようにしたい場合があります。
オブジェクトのコピーは、オブジェクトの __clone() メソッドを呼び出すことで完了します。
$copy_of_object = $object->__clone();
?>
開発者が新しいオブジェクトの作成を要求したときobject コピー時に、ZEND エンジンは __clone() メソッドが定義されているかどうかを確認します。未定義の場合、デフォルトの __clone() メソッドを呼び出して、オブジェクトのすべてのプロパティをコピーします。このメソッドが定義されている場合、コピーに必要なプロパティを設定する役割を果たします。便宜上、エンジンはソース オブジェクトからすべてのプロパティをインポートする関数を提供します。これにより、最初に値を含むソース オブジェクトのコピーを取得し、変更する必要があるプロパティを上書きするだけで済みます。
例:
class MyCloneable {
static $id = 0;

function MyCloneable() {
$this->id = self::$id++;
}

function __clone() {
$ this-> name = $ that-> name; >address = "テルアビブ";

print $obj->id . "n";

$obj = $obj->clone();

print $obj->id "n" ";
print $obj->name . "n";
print $obj->address . "n";
?>
統一コンストラクター名
ZEND エンジンにより、開発者はクラスのコンストラクター メソッドを定義できます。コンストラクター メソッドを持つクラスが作成されると、コンストラクター メソッドが最初に呼び出されます。コンストラクター メソッドは、クラスが正式に使用される前の初期化に適しています。
PHP4では、コンストラクターの名前はクラス名と同じです。派生クラスで親クラスを呼び出すのが一般的であるため、大規模なクラス継承内でクラスを移動する場合、PHP4 は少し扱いに​​くくなります。派生クラスを別の親クラスに移動する場合、親クラスのコンストラクター名は異なる必要があります。この場合、派生クラスでの親クラスのコンストラクターの呼び出しに関するステートメントを書き直す必要があります。
PHP 5 では、コンストラクター メソッドを __construct() という名前で呼び出す標準的な方法が導入されています。
PHP 5 では、__construct() という名前でコンストラクター メソッドを宣言する標準的な方法が導入されています。

class BaseClass {
function __construct() {
print "In BaseClass constructionorn";
}
}

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

$obj = new BaseClass();
$obj = new SubClass();
?>
下位互換性のために、PHP5 は __construct( in the class ) メソッドを見つけることができません。の場合、コンストラクター メソッドは、クラス名である古いメソッドを通じて検索されます。これは、互換性の問題が発生する可能性があるのは、__construct() というメソッド名が前のコードで使用されている場合のみであることを意味します。
破壊メソッド
破壊メソッドを定義すると非常に便利です。デストラクター メソッドは、デバッグ情報を記録し、データベース接続を閉じ、その他の仕上げ作業を行うことができます。 PHP 4 にはそのようなメカニズムはありませんが、PHP はリクエストの最後に実行する必要がある関数の登録をすでにサポートしています。
PHP 5 では、Java などの他のオブジェクト指向言語と同様のデストラクターの概念が導入されています。オブジェクトへの最後の参照が破棄されると、パラメーターを受け取らないクラス メソッド名 %__destruct()% であるオブジェクトのデストラクターが、
PHP5 では、Java などの他のオブジェクト指向言語と同様のデストラクター メソッドが導入されています。オブジェクトへの最後の参照がクリアされると、システムはオブジェクトがメモリから解放される前にオブジェクトをメモリから解放します。 __destruct() という名前のデストラクター メソッドを呼び出します。 example:<?php
classmydestructableclass {function __construct(){"Destroling"; ?>
コンストラクター メソッドと同様に、エンジンは親クラスのデストラクター メソッドを呼び出すのではなく、サブクラスのデストラクター メソッドのparent::__destruct() ステートメントを通じてこのメソッドを呼び出す必要があります。 。
定数
PHP 5 では、クラス定数の定義が導入されています:
class Foo {
const constant = "constant";
}

echo "Foo::constant = " "n" 。 ;
?>

PHP5 では定数内の式が許可されていますが、定数内の式はコンパイル時に評価されるため、実行時に定数の値を変更することはできません。
class Bar {
const a = 1<<0;
const b = 1<<1;
const c = a | b;
}
?> 「const」キーワードが定義されたクラスまたはメソッドで定義されていない場合は、編集せずに実行できます。
例外
PHP 4 には例外処理がありませんでした。PHP 5 では、他のプログラミング言語と同様の例外モデルが導入されました。
例:
class MyExceptionFoo extends Exception {
function __construct($Exception) {
Parent::__construct($Exception)
} catch (MyException $Exception) {
print $Exception->getMessage( );
}
?>
「catch」、「throw」、および「前のコード try のユーザー定義クラスまたはメソッドで定義されていません」キーワードは、編集せずに実行できます。
関数はオブジェクトの値を返します
PHP 4 では、関数によって返されたオブジェクトを逆参照したり、それらのオブジェクトに対してさらにメソッド呼び出しを行うことはできませんでしたが、Zend Engine 2 の登場により、次のことが可能になりました:
PHP4 では、関数はそうではありません。 ZEND Engine 2 では、オブジェクトの値を返し、返されたオブジェクトに対してメソッド呼び出しを行うことが可能です。
}

class Square {
functiondraw() {
print "Squaren";
}
}

function ShapeFactoryMethod($shape) {
switch ($shape) {
case "Circle": Return new Circle() : > ;
静的クラスの静的メンバー変数を初期化できるようになりました
Example
class foo {
static $my_static = 5;
}

print foo::$my_static;
?>
static メソッド
PHP5 キーワード 'static' は、静的メソッドを呼び出せるように定義するために導入されました。オブジェクトの外側から。
例:
class Foo {
public static function aStaticMethod() {
// ...
}
}

Foo::aStaticMethod();
?>
static の仮想変数 $thisメソッドでは無効です。
instanceof
PHP5 では、オブジェクトが特定のオブジェクトのインスタンスであるか、特定のオブジェクトの派生であるか、または特定のインターフェイスを使用しているかを判断するために、キーワード instanceof が導入されました。
例:
classbaseClass { }

$a = newbaseClass;

if ($ainstanceofbasicClass) {
echo "Hello World";
}
?>
静的関数変数
all静的変数はコンパイル時に処理されるようになり、開発者は参照によって静的変数を指定できるようになりました。この変更により効率は向上しますが、静的変数への間接参照は不可能になります。
関数内のパラメータは、アドレスで渡すことでデフォルト値を定義できます。
例:
function my_function(&$var = null) {
if ($var === null) {
die("$var には値が必要です");
}
}
?>
__autoload()
未定義のクラスを初期化するとき、エンジンは自動的に __autoload() インターセプター関数を呼び出します。クラス名は、__autoload() インターセプター関数への唯一のパラメーターとして渡されます。
例:
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 "[$nm]n を取得中";

if (isset($this->x[$nm])) {
$r = $this->x[$nm];
print "Returning: $rn";
return $r;
} else {
print "Nothing!n";
}
}

関数 __set($nm, $ val) {
print "[$nm] を $valn に設定します";

if (isset($this->x[$nm])) {
$this->x[$nm] = $val;
print "OK!n";
} else {
print "Not OK!n";
}
}
}

$foo = new Setter();
$foo->n = 1;
$ふー->a = 100;
$foo->a++;
$foo->z++;
var_dump($foo);
?>
例: __call()
class Caller {
var $x = array(1, 2, 3);

function __call($m, $a) {
print "メソッド $m が呼び出しました:n ";
var_dump($a);
return $this->x;
}
}

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

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/314178.html技術記事前言 今朝突然 PHP 官方 Web サイトに投稿され、PHP5 の公開報告が目に留まりました。 これまで PHP5 の報告が見られましたが、仔细は PHP 5/Zend Engine 2.0 の新特性を確認しました...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!