php5
(1) Zend 2.0 の誕生
現在の PHP4 で使用されている基本的な文法は、Zend エンジンと呼ばれるスクリプト編集エンジンです。これが、PHP3 の改良として生まれた言語である PHP4 の機能が優れている理由の 1 つです。 PHP4 は本来の目的に基づいて PHP3 に比べてパフォーマンスが大幅に向上しており、ネットワーク プログラミングの世界で大きなシェアを占めていると誰もが信じてきました。
Zend エンジンを開発した Zend 社は、PHP3 の主な開発者である Zeev Suraski 氏と Andi Gutmans 氏が PHP4 の開発中に設立した会社を合併しました。 Zend の名前は、Zeev と Andi の名前を組み合わせたものです。 Zend のビジネス モデルは、zend エンジンの PHP コアを継続的にオープンソースで提供すると同時に、周辺製品の開発と販売のメリットを増大させることです。オープンソース ソフトウェアに基づくビジネスは、世界中の苦境に立たされている企業の中でも比較的良い典型例であると考えられています。
■PHP4の限界
PHP4の成功により、このアプリケーションの適用範囲は徐々に広がっています。エンタープライズレベルの目的で PHP を使用するという話があります。そのため、大規模なWebサイトを構築する場合、コードの再利用性が非常に悪いという問題があります。具体的には、PHP4 のオブジェクト指向のパフォーマンスが非常に低いため、Java などのテクノロジの使用に慣れている技術者から多くの不満が寄せられています。
PHP4 のオブジェクト指向のパフォーマンスを徐々に向上させ、基本的な文法を大幅に変更するという開発者は、PHP の記述方法を更新するという開発目標を達成しました。
■Zend 2.0 開発開始
その後、Zend PHP センターの開発者は、2001 年 7 月に次世代 PHP 言語エンジンとして Zend 2.0 エンジンのアイデアを発表しました。 [Zend Engine バージョン 2.0: 機能の概要と設計]
(http://www.zend.com/engine2/ZendEngine-2.0.pdf) をターゲットにしながら、オブジェクト指向のパフォーマンスが大幅に強化されました。
現在の PHP4 Zend エンジンの拡張は、過去の PHP3 の拡張とまったく同じです。これは、新しい言語エンジンのメジャー バージョン番号を増やし、手法の目標を明確にし、開発チームから賞賛を受けることを意味します。
Ze2 の開発は、以前の Zend エンジンと同様、オープンソース モードで実行されます。 CVS では最新のソースコードが完全に公開されており、オープンな開発者向けなので開発に関する議論が非常に活発です。
現在、PHPの次期バージョンであるPHP5にZe2が採用されることが決定しました。最終的なリリース時期はまだ決定されていませんが、2003 年 4 月 1 日に Zend Company がリリースしたニュースレターによれば、現時点でベータ リリースになるはずです。
(2) PHP5の新機能
次に、PHP5の強化されたパフォーマンスを順番に見ていきましょう。 1 つ目は、最も重要なオブジェクト指向のパフォーマンスです。クラスのエンティティ特性が大幅に変更されています。ここで話しているのは、クラスの新しい機能についてのみです。
・オブジェクトの参照遷移はデフォルトです
・プロパティへのアクセスに関する制限の導入
・メソッドへのアクセスに関する制限の導入
・抽象クラスと抽象メソッド
・インターフェース
・最終宣言
・名前空間
・クラス内定数
・クラス変数
・統合ビルダー
・デストラクター
・その他の付随機能
上記の内容は、2003年4月22日にCVSに記録されたバージョン情報に基づいています。正式リリース前には変更される可能性があります。
■オブジェクトのデフォルト参照遷移
PHP4では、変数$var1をクラスのエンティティオブジェクトとして使用する場合、 $var2 = $var1; の場合、$var2には$var1のコピーが代入されます。明らかに、$var2 が $var1 と同じオブジェクトを指すようにするには、$var2 =& $var1 として記述し、参照として & を追加する必要があります。
PHP5ではオブジェクト置換が自動参照遷移になります。言い換えれば、
$var2=$var1、両方とも同じオブジェクトを指します。 php4のようなコピーを取り込みたい場合は__clone()をインポートする方法を使います。
$var2 = $var1->__clone();ここでは、cloneの前に2つの連続した「_」が付いています
(これはクラスの実体の特徴に過ぎません)
■属性へのアクセス制限の導入
PHP4 クラスでは、プロパティやメソッドを含め、クラス内外のどこにでも制限なく自由にアクセスできます。したがって、ユーザーは属性に対する不注意な変更に対する保護がありません。
PHP5 では、C++ や Java と同様に、プライベート、プロテクト、パブリックの 3 つのレベルのアクセス制限が導入され、クラス設計者がプロパティとメソッドの使用を制限できるようになります。さまざまなアクセス制限の意味は次のとおりです。
・パブリック:クラス内外どこでも自由に参照・変更可能
・プライベート:このクラスのメソッドのみ参照・変更可能
・保護:このクラスと別のクラスで参照・変更可能このクラスを継承したクラス クラスのメソッドの参照や変更が可能です。さらに、継承されたクラスにアクセス仕様を記述することができます。
PHP4 の「var」は、これまでと同様に public と同じ意味を持ちます。アクセス制限がどのように機能するかを示す例を次に示します。
PHP コード:------------------------------------------ --- ----------------------------------
class Hoge1 {
private $var1 = 'A';
protected $var2 = 'B';
protected $var3 = 'C';
function setLower() {
$this->var1 = 'a';
$this->var2 = 'b';
$this->var3 = 'c';
}
function var1() {
return $this->var1;
}
function var2() {
return $this->var2;
}
function var3() {
return $this->var3;
}
}
-- -------------------------------------------------- ----------------------------
このクラスには、$var1、$var2、$var3 の 3 つの属性があります。 $var1 はプライベートとして宣言され、$var2 と $var3 は保護されています。ここで
PHP コード:-------------------------- ---- ------------------------------------------------ ---
$hoge=new Hoge1;
echo'var1:'.$hoge->var1.”
n”
---------------------- ----- -------------------------------------- ----- ----------
外部からアクセスが許可されていないプライベートプロパティを参照しようとすると、次のエラーが表示されます:
致命的なエラー:プライベートにアクセスできません/path/ to/script.php の XX 行目の property hoge1::$var1
protected $var2 も同様です。
ただし、$hoge メソッドは private または protected ではないため、以下のコードは正常に動作し、内部の private 変数および protected 変数の値を返すことができます。
PHP コード:------------------------------------------ --- ----------------------------------
echo 'var1: ' $hoge->var1 () . "
n"; // var1: A
echo 'var2() . "
n"; ;var3 () . "
n"; // var3: C
$hoge->setLower();
echo ' . $hoge->var1() . var1: a
echo 'var2: ' . $hoge->var2() . "
n"; // var2: b
echo ' . $hoge->var3() . // var3: c
------------------------------------------ ----- ----------------------------------
第二に、見えるようになるためにprotected属性のステータスを取得して、Hoge1を継承したクラスHoge2を作成してみます
PHPコード:---------------------------- ----- -------------------------------------- ---
class Hoge2 extends Hoge1 {
public $var3 = '3';
function d_var1() {
return $this->var1;
}
function d_var2() {
return $this->var2 ;
}
function d_var3() {
Return $this->var3;
}
}
------------------------------------- -------- -------------------------------------- --------
クラス内 Hoge2 では、$var3 のみが public 宣言されています。プロパティが保護されている場合、サブクラスからのアクセスに対する制限は、サブクラスのプロパティ宣言によって決まります。 Hoge2では$var3をpublic宣言しているため、Hoge2の$var3にはどこからでもアクセス可能です(実体はHoge1の$var3です)。 Hoge1では$var1がprivateなので、Hoge2のサブクラスには$var1が継承されず、Hoge2に$var1というプロパティが作られる可能性があるため、Hoge1::と$var1::を明確に区別する必要がある。 $var1。
PHP コード:------------------------------------------ --- ----------------------------------
$hoge = new Hoge2;
echo 'var1: ' . $hoge->var1 . "
n"; // var1:
// echo 'var2: ' . "
n"; hoge->var3 . "
n"; // var3: 3
echo ' . $hoge->d_var1() . "
n" ; hoge->d_var2() . "
n"; // var2: B
echo ' . $hoge->d_var3() . "
n"; -------------------------------------------------- -- ------------------------
$hoge->var1 は Hoge1::var1 とは関係のない変数ですが、 var2 にはアクセス制限が保護されているため、表示されません。そのため、メソッドを渡さずに $var2 を直接参照すると、致命的なエラーが発生します。
■アクセス方法の制限を紹介します
上記と同様に、こちらもプライベート、プロテクト、パブリックの3種類に分けられます。
・パブリック:どこからでも呼び出すことができます
・プライベート:このクラスのメソッドからのみ呼び出すことができます
・プロテクト:このクラスとサブクラスのメソッドからのみ呼び出すことができます
ここでの意味はJavaと同じですと C++。混同しないでください。
■抽象クラスと抽象メソッド
Javaと同じ抽象クラスと抽象メソッドをサポートしています。抽象メソッドはメソッド名を呼び出す方法のみを提供しますが、エンティティを呼び出す方法は提供しません。さらに、抽象メソッドを保持するクラスは、クラス自体を抽象的に宣言する必要があります。抽象クラスのオブジェクトを直接作成しようとすると、以下のような致命的なエラーが発生します。
致命的なエラー: 抽象クラス ClassName をインスタンス化できません
エラーの実際の例は次のとおりです:
PHP コード:---------------------- -------------------------------------------------- -------
抽象クラス MyAbstract {
抽象パブリック関数 test();
public function test2() {
echo "MyAbstract::test2() が呼び出されます。
n";
}
}
class MyImplement extends MyAbstract {
public function test() {
echo "MyImplement::test() が呼び出されます。
n";
}
}
$obj = new MyImplement;
$obj->test();
?>
---------------- - ------------------------------------------------- - ------------
■インターフェース
はJavaと同じインターフェースをサポートしています。インターフェースは、記述された外部呼び出し形式に適合するように設計および組み立てられます。
インターフェースエンティティは記録できません。対照的に、インターフェイスを実装するクラスは、インターフェイスのメソッドに対応するエンティティを保持する必要があります。さらに、クラスは複数のインターフェイスを実装できるため、多重継承が可能です。
PHP コード:------------------------------------------ --- ----------------------------------
interface Throwable {
public function getMessage();
}
インターフェース Serializable {
public function toString();
}
class MyExceptionimplements Throwable, Serializable {
public function getMessage() {
return 'this is MyException message';
}
public function toString() {
return 'MyException: これは MyException メッセージです';
}
}
$e = new MyException;
echo $e->getMessage();
echo $e->toString();
?>
------------------------------------------------ -- ----------------------------------
■final宣言
Javaと同様に、PHP5もfinalをサポートしています宣言。最終宣言がメソッドに追加された場合、このメソッドはサブクラスでオーバーロード (Override) されません。メソッドがfinal宣言されていてもサブクラスでオーバーロードされている場合、次のエラーが表示されます:
PHP code: ----------------------- -- ------------------------------------------------ -- -----
致命的なエラー: 最終メソッド fuga::foo() をオーバーライドできません
-------------------------- --- ---------------------------------------------- ---
エラーの例:
PHP コード:-------------------------------------- ---- ----------------------------------------
クラス フーガ{
final function foo() {
echo "これはfinal functionnです";
}
}
class Hoge extends Fuga {
function foo() {
echo "これはfinal functionnではありません";
}
}
? >
---------------------------------------------- --- ----------------------------------
(3) PHP5の新機能(続き)
PHP5 リリース計画
前回の記事で、「2003 年 4 月 1 日に ZEND 社が公開した情報によると、現在のものはベータ版リリースになるはずです。」と述べましたが、社内での議論の結果です。開発者は、ベータ版は初期段階のものであり、ベータ版リリースではない可能性があると考えています。
この傾向に興味がある人は、news://news.php.net/php.version5.dev で公開されている情報を参照してください。 372
このファイルでは、PHP5 Zend Engine 2のリリース計画は白紙に戻る一方、Zend Engine 2の開発は進行中です。 PHP5のリリースは実は「年末までに急ぐ」としている。
PHP5の新機能
それでは、前述したクラスの他の新機能をいくつか見てみましょう
■名前空間
PHP5は名前空間をサポートしています。したがって、クラス、変数、定数、関数を名前空間にロードできます。
PHP4 のスコープには、グローバル、関数内、クラス内の 3 つのカテゴリしかないため、注意しないとグローバル空間を簡単に「汚染」してしまうことに特に注意してください。 。名前空間を使用すると、パッケージ内の変数の名前空間を分離できるため、独立したパッケージを作成しやすくなるはずです。
使用例は以下の通りです:
PHPコード:------------------------------------- -------- --------------------------------------
名前空間This {
class Hoge {
}
const aConstant = 'この定数';
function aFunction() {}
var $aVariable = 'この変数';
}
$obj = new This::Hoge;
echo This ::aConstant . "
n ";
This::aFunction();
echo This::$aVariable . "
n";
-- ---------------------------------------------------- ------- -----
名前空間内のオブジェクトにアクセスしたい場合は、次のようにする必要があります:
名前空間名::オブジェクト名
ただし、PHP5 の名前空間は C++ と異なる方法で適用されません。 。
■クラス内の定数
クラスおよび名前空間内の定数を定義するには、キーワード const を使用します。ここでは定数であるため、定数名の前に $ を追加する必要があります。クラス内の定数は、このクラスのグローバル定数よりも高い優先順位を持ちます。
ここでの const は予約なので、クラス名や関数名に const を使用する場合は必要な修正を行う必要があります。
PHP コード:------------------------------------------ --- ----------------------------------
define('constant_value', 'グローバル定数' );class MyClass {
const constant_value = 'クラス定数';
function printConstant() {
print constant_value;
}
}
echo MyClass::constant_value "
n";
MyClass:rintConstant();
?> ;
----------------------------------------------- --- ----------------------------------
この例では、MyClass:rintConstant() は表示定数 constant_value ただし、constant_value はグローバル空間とクラスの 2 か所に存在します。この場合、MyClass の constant_value が優先され、「クラス定数」として表示されます。
■オブジェクト変数
クラスがインスタンス化されていない場合でも、指定した値に従ってオブジェクト変数を正確に初期化できます。アクセス方法は以下の通りです:
クラス名::$変数名
PHPコード:---------------------------- ----- -------------------------------------- -----
class Hoge {
static $my_static = 5;
}
print Hoge::$my_static;
?>
--------------- ---------------------------------------------------- --------- ---------
■Unified Builder
オブジェクトを生成する際に、自動的に呼び出せるメソッドを「ビルダー」と呼びます。
PHP4のビルダーはクラス名と同じメソッド名です。これは Java や C++ と同じなので、慣れている人にとってはそれほど違和感はありません。ただし、サブクラスから親クラスのビルダーを呼び出したい場合は、PHP で親クラスの名前を明確に記述する必要があります。
PHPでは親クラスのコンストラクターを自動的に呼び出すことができないため、様々な状況が発生します。
PHP5では、クラス名が何であっても、__constructorというコンストラクタ名が一律に採用されており、__construct()というものはコンストラクタとして扱われます。
また、PHP4との互換性を考慮し、同じクラス名を持つ以前のビルダー名が存在する場合は、そのビルダーが先に使用されます。
PHP コード:------------------------------------------ --- ----------------------------------
class BaseClass {
function __construct() {
print " BaseClass コンストラクター内";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "サブクラス コンストラクター内";
}
}
$obj = new BaseClass( );
$obj = new SubClass();
?>
---------------------------- -------------------------------------------------- --
■デストラクター
ビルダーとは逆に、オブジェクトを解放する際に自動的に呼び出せるメソッドをデストラクターといいます。
PHP4はデストラクタをサポートしており、PHP終了時にregister_shutdown_function()という関数にログインすることで同様の実装方法しかありません。 PHP5 は、クラス内でオブジェクトが解放されるときのアクションを指定できるデストラクターを正式にサポートしています。
デストラクターは __destruct というメソッドです。オブジェクトの内部参照カウンタが 0 に達すると、__destruct() が呼び出され、オブジェクトによって使用されていたメモリが解放されます。
PHP コード:------------------------------------------ --- ----------------------------------
class MyDestructableClass {
function __construct() {
print " Inconstructorn";
$this->name = 'MyDestructableClass';
}
function __destruct() {
print '$this->name . "n";
}
}
$obj = new MyDestructableClass();
?>
-------------------------------------- ----- --------------------------------------
また、ビルダーの場合も同様で、親クラスのデストラクタを自動的に呼び出すことができません。必要に応じて、
parent::__destruct();
■Access
PHP4 の場合、存在しない属性にアクセスすると、システムはそれに対応する新しい属性を自動的に生成します。
PHP コード:------------------------------------------ --- ----------------------------------
class Hoge {
}
$obj = new Hoge ;
$obj->prop = "これは新しいプロパティです";
-------------------------------- -------------------------------------------------- --
上記のように、存在しないプロパティに値が代入されると、その置換ポイントで新しいプロパティが自動的に生成されます。同様に、存在しないプロパティにアクセスしても、NULL 値を持つ変数に代入された場合と同様に、エラーは発生しません。
PHP5 で追加された追加機能は、任意の属性へのアクセスを制御する機能です。クラス内に __set() や __get() などのメソッドがある場合、上記のアクションの代わりにここのメソッドが呼び出されます。例:
PHP コード:------------------------------------------ ------ --------------------------------------
クラスHoge {
function __set($name, $value) {
print "($name, $value)nで__set()を呼び出す";
$this->$name = $value;
}
}
$obj = 新しいホゲ;
$obj->a = '123';
$obj->a = '456';
$obj->b = '789';
?>
-------- -------------------------------------------------- ------------------------
ここでは、未定義のプロパティの置換メソッドとして__setメソッドを使用し、値を代入しています。値を表示した後の未定義プロパティ。
PHP コード:------------------------------------------ --- ----------------------------------
$obj->a = '123';
------------------------------------------------- -- --------------------------------
この文を実行すると、この時点では属性aが存在しないため、したがって、代わりに __set メソッドが呼び出されます。
__set() は (a, 123) で呼び出されます
次に、
$obj->a = '456';
今度は、属性 a が存在するので、再度 $obj->a を代入します。したがって、__set は呼び出されず、値は通常どおり属性 a に代入されます。
$obj->b = '789';
今回は、最初のaの場合と同様に、値を別の属性bに代入し、
__set()が(b, 789 )で呼び出されます
__set メソッドとは異なり、存在しないプロパティへの参照がある場合、__get メソッドが呼び出されます。この 2 つを組み合わせて、プロパティへのアクセスを見てみましょう。実際、これを使用して、状況に応じて異なる応答を行うことができるクラスを作成できます。
PHP コード:------------------------------------------ --- ----------------------------------
class Hoge {
public $properties;
function __set ($name, $value) {
$this->properties[$name] = $value;
}
function __get($name) {
return $this->properties[$name];
}
}
$obj = new Hoge;
$obj->a = '123';
$obj->b = '456';
echo $obj->a;
echo $obj-> ;b ;
print_r($obj);
?>
--------------------------------- - ---------------------------------------------
でこの例では、クラス内のすべてのプロパティへのアクセスは $properties にロードされるため、追加するプロパティはオブジェクトに直接添付されません。これは理解しにくい例ですが、たとえば、この例の $properties への保存をファイルまたはデータベースへの保存に変更してみると面白いでしょう。実際、オブジェクトでは多くの複雑な操作を簡単に実装できます。
__set や __get とは少し異なりますが、次の例のように、オブジェクトのメソッドを呼び出す場合、__call を使用することもできます。
メソッド methodname がこのクラスに存在しない場合、通常は次のエラーが発生します:
致命的エラー: 未定義のメソッド Class::methodname() への呼び出し
ただし、このクラスに __call メソッドが存在する場合は、代わりに, __callが呼び出されます。 __call には 2 つのパラメータがあります。最初のパラメータは呼び出されるメソッドの名前で、2 番目のパラメータは呼び出されるパラメータの配列です。様々な利用方法があることを考慮し、以下の例以外にも様々な利用方法が考えられます。
PHP コード:------------------------------------------ --- ----------------------------------
クラス プロキシ {
private $object;
function __call ($name, $params) {
if (isset($this->object)) {
if (method_exists($this->object, $name)) {
return call_user_func_array(array($this- > object, $name), $params);
}
}
class Hoge {
function add($var1, $var2) {
return $var1 + $var2;
}
}
$p = new Proxy(new Hoge);
$result = $p ->add(1, 2);
echo "result: $result
n";
$result = $p->sub(5, 3) ;
echo "結果: $result
n";
?>
--------------------------------- ---------------- ----------------------------------
新しいオブジェクト モデル
PHP のオブジェクト処理部分が完全に書き直され、パフォーマンスが向上し、機能が追加されました。以前のバージョンの PHP では、オブジェクトは組み込み変数タイプ (整数や文字列など) と同じように扱われていましたが、変数がオブジェクトに割り当てられたとき、またはオブジェクトがパラメーターとして渡されたときに、コピーが取得されるという欠点がありました。オブジェクトの。新しいバージョンでは、オブジェクトは値ではなくハンドルによって参照されます。 (ハンドルはオブジェクトの識別子と考えることができます)
多くの PHP プログラマーは、以前のオブジェクト モデルの「コピーの癖」に気づいていない可能性があるため、以前の PHP プログラムは変更を加える必要がないか、わずかな変更だけで済みます。実行準備完了
プライベート メンバーと保護されたメンバー
PHP 5 では、クラス プロパティにいつアクセスできるかを定義するプライベート メンバー変数と保護されたメンバー変数が導入されました。
例
クラスの保護されたメンバー変数はこのクラスの拡張クラスでアクセスできますが、プライベート メンバー変数はこのクラスでのみアクセスできます。
クラス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(); /* 出力する必要があります */
print "MyClass2::printHello() " 。 $this->こんにちは; /* 何も出力しません */
print "MyClass2::printHello() " . $this->バー; /* 印刷すべきではありません (宣言されていません)*/
print "MyClass2::printHello() " 。 $this->フー; /* 出力する必要があります */
}
}
$obj = new MyClass();
print $obj->Hello; /* 何も出力しません */
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:: aPrivateMethod() が呼び出された.n";
}
保護された関数 aProtectedMethod() {
echo "Foo::aProtectedMethod() が呼び出された.n";
$this->aPrivateMethod();
}
}
クラス バーextends Foo {
public function aPublicMethod() {
echo "Bar::aPublicMethod() called.n";
$this->aProtectedMethod();
}
}
$o = new Bar;
$o- >aPublicMethod();
?>
以前コード内のユーザーは、「public」、「protected」、または「private」などのメソッドを独自に定義していましたが、実行する必要はありませんでした。
例:
abstract class AbstractClass {
abstract public function test();
}
class ImplementedClass extends AbstractClass {
public function test() {
echo "ImplementedClass::test() called.n";
}
}
$o = new ImplementedClass;
$o->test();
?>
抽象クラスは例示できません。以前は、コード内のユーザーが独自に定義したクラスまたはメソッドで「抽象」キーワードを使用することはできませんでしたが、実行する必要はありませんでした。
例
例:
インターフェース Throwable {
public function getMessage();
}
class Exception 実装 Throwable {
public function getMessage() {
// ...
}
?>
タイプ定義
タイプを保持する必要がないと同時に、PHP 5 にはタイプ定義が導入されており、
例
例:
interface Foo {
function a(Foo $foo);
}
interface Bar {
function b(Bar $bar);
}
class FooBar は実装しますFoo, Bar {
function a(Foo $foo) {
// ...
}
function b(Bar $bar) {
// ...
}
}
$a = new FooBar;
$b = 新しい FooBar;
$a->a($b);
$a->b($b);
?>>
これらの型定義は、型定義が必要な場合に限り、実行中に実行されるのではなく、実行中に検査されます。これは、次のことを意味します。 ?>
等以下:
function foo($object) {
if (!($objectinstanceof ClassName)) {
die("引数 1 は ClassName のインスタンスである必要があります");
}
}
?>
この対話法はオブジェクトまたはクラスにのみ使用され、内部構築型には使用できません。 -------------------------------------------------
Final
PHP 5 では、「final」関連の文字定義が子クラス内でカバーできない構造またはメソッドを導入しています。 >
オブジェクトクローン
PHP 4 は、オブジェクトのバージョンアップ時に、ユーザーがタイプまたはメソッドで決定することはできませんが、すぐに実行できます。 、PHP 4 は、1 ビットずつ、オブジェクトのようなものを作成します。毎回正確なレプリカを構築する必要はありません。コピー メカニズムが必要になる良い例は、GTK ウィンドウを表すオブジェクトがあり、そのオブジェクトがそのウィンドウのすべてのリソースを所有している場合です。コピーを作成するときに、元のウィンドウのすべてのプロパティを所有する新しいウィンドウが必要になる場合があります。新しいウィンドウのリソースを所有する必要があります。別の例としては、別のオブジェクトを参照するオブジェクトがあり、親オブジェクトをコピーするときに、その参照先オブジェクトの新しいインスタンスを作成して、コピーがそれを参照するようにしたい場合があります。
オブジェクトのコピーは、オブジェクトの __clone() メソッドを呼び出すことで完了します:
$copy_of_object = $object->__clone();
?>
開発者がオブジェクトの新しいコピーの作成を要求すると、ZEND エンジンは__clone() メソッドが定義されているかどうかを確認してください。未定義の場合、デフォルトの __clone() メソッドを呼び出して、オブジェクトのすべてのプロパティをコピーします。このメソッドが定義されている場合、コピーに必要なプロパティを設定する役割を果たします。便宜上、エンジンはソース オブジェクトからすべてのプロパティをインポートする関数を提供します。これにより、最初に値を含むソース オブジェクトのコピーを取得し、変更する必要があるプロパティを上書きするだけで済みます。
例:
class MyCloneable {
static $id = 0;
function MyCloneable() {
$this->id = self::$id++;
}
function __clone() {
$this-> name = $that->name;
$this->address = "ニューヨーク";
$this->id = self::$id++;
}
}
$obj = new MyCloneable();
$obj->name = "Hello";
$obj->address = "テルアビブ";
print $obj->id . "n";
$obj = $obj-> ;__clone();
print $obj->id . "n";
print $obj->name . "n";
?>統一されたコンストラクター メソッド名
ZEND エンジンにより、開発者はクラスのコンストラクター メソッドを定義できます。コンストラクター メソッドを持つクラスが作成されると、コンストラクター メソッドが最初に呼び出されます。コンストラクター メソッドは、クラスが正式に使用される前の初期化に適しています。
PHP4では、コンストラクターの名前はクラス名と同じです。派生クラスで親クラスを呼び出すのが一般的であるため、大規模なクラス継承内でクラスを移動する場合、PHP4 は少し扱いにくくなります。派生クラスを別の親クラスに移動する場合、親クラスのコンストラクター名は異なる必要があります。この場合、派生クラスでの親クラスのコンストラクターの呼び出しに関するステートメントを書き直す必要があります。
PHP 5 では、コンストラクター メソッドを __construct() という名前で呼び出す標準的な方法が導入されています。
PHP 5 では、__construct() という名前でコンストラクター メソッドを宣言する標準的な方法が導入されています。
例
class BaseClass {
function __construct() {
print "In BaseClass コンストラクターン";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructorn";
}
}
$obj = new BaseClass();
$obj = new SubClass();
?>
下位互換性のために、PHP5 がクラス内で __construct() メソッドを見つけられない場合、古いメソッド (クラス名) を通じてコンストラクターを見つけます。これは、互換性の問題が発生する可能性があるのは、__construct() というメソッド名が前のコードで使用されている場合のみであることを意味します。
------------------------------------------------- --------------------------------
破壊メソッド
デストラクタメソッドを定義すると非常に便利です。デストラクター メソッドは、デバッグ情報を記録し、データベース接続を閉じ、その他の仕上げ作業を行うことができます。 PHP 4 にはそのようなメカニズムはありませんが、PHP はリクエストの最後に実行する必要がある関数の登録をすでにサポートしています。
PHP 5 では、Java などの他のオブジェクト指向言語と同様のデストラクターの概念が導入されています。オブジェクトへの最後の参照が破棄されると、パラメーターを受け取らないクラス メソッド名 %__destruct()% であるオブジェクトのデストラクターが、
PHP5 では、Java などの他のオブジェクト指向言語と同様のデストラクター メソッドが導入されています。オブジェクトへの最後の参照がクリアされると、システムはオブジェクトがメモリから解放される前にオブジェクトをメモリから解放します。 __destruct() という名前のデストラクター メソッドを呼び出します。
例:
class MyDestructableClass {
function __construct() {
print "Inconstructorn";
$this->name = "MyDestructableClass";
}
function __destruct() {
print "$this-" . >name . "n";
}
}
$obj = new MyDestructableClass();
?>
コンストラクター メソッドと同様に、エンジンはこのメソッドを呼び出すために、親クラスのデストラクター メソッドを呼び出しません。 、サブクラスのデストラクター メソッドのparent::__destruct() ステートメントを介して呼び出す必要があります。
定数
PHP 5 では、クラス定数の定義が導入されました。
class Foo {
const constant = "constant";
}
echo "Foo::constant = " . Foo::constant .
PHP5 では定数内の式が許可されていますが、定数内の式はコンパイル時に評価されるため、実行時に定数の値を変更することはできません。
class Bar {
const a = 1const b = 1const c = a | b;
}
?> code 「const」キーワードは定義されていませんが、編集しなくても機能します。
例外
PHP 4 には例外処理がありませんでした。PHP 5 では、他のプログラミング言語と同様の例外モデルが導入されました。
例:
class MyExceptionFoo extends Exception {
function __construct($Exception) {
parent::__construct($Exception);
}
}
try {
throw new MyExceptionFoo("Hello");
} catch (MyException $Exception) {
print $Exception->getMessage();
}
?> 'catch'、'throw'、および 'try' キーワードは前のユーザー定義クラスまたはメソッドで定義されていません。コードですが、編集しなくても機能します。
関数はオブジェクトの値を返します
PHP 4 では、関数によって返されたオブジェクトを逆参照したり、それらのオブジェクトに対してさらにメソッド呼び出しを行うことはできませんでしたが、Zend Engine 2 の登場により、次のことが可能になりました:
PHP4 では、関数はそうではありません。 ZEND エンジン 2 では、オブジェクトの値を返し、返されたオブジェクトに対してメソッド呼び出しを行うことができます。
class Square {
function drawing() {
print "Squaren";
}
}
function ShapeFactoryMethod($shape) {
switch ($shape) {
case "Circle":
return new Circle();
case "Square ":
return new Square();
}
}
ShapeFactoryMethod("Circle")->draw();
ShapeFactoryMethod("Square")->draw();
?>
;静的クラスで静的メンバー変数が初期化可能になりました
Example
class foo {
static $my_static = 5;
}
print foo::$my_static;
?>
Static メソッド
PHP5 では定義するためのキーワード 'static' が導入されました。 a 静的メソッド。オブジェクトの外部から呼び出すことができます。
例:
class Foo {
public static function aStaticMethod() {
// ...
}
}
Foo::aStaticMethod();
?>
仮想変数 $this は静的メソッドでは無効です。
instanceof
PHP5 では、オブジェクトが特定のオブジェクトのインスタンスであるか、特定のオブジェクトの派生であるか、または特定のインターフェイスを使用しているかを判断するために、キーワード instanceof が導入されました。
例:
classbaseClass { }
$a = newbaseClass;
if ($ainstanceofbasicClass) {
echo "Hello World";
}
?>
静的関数変数
すべての静的変数が処理されるようになりましたこれにより、開発者はコンパイル時に静的変数を参照によって指定できるようになります。この変更により効率は向上しますが、静的変数への間接参照は不可能になります。
アドレスによって渡される関数のパラメータでは、デフォルト値を定義できます
例:
function my_function(&$var = null) {
if ($var === null) {
die("$var には値が必要です");
}
}
?>
__autoload()
未定義のクラスを初期化するとき、エンジンは自動的に __autoload() インターセプター関数を呼び出します。クラス名は、__autoload() インターセプター関数への唯一のパラメーターとして渡されます。
例:
function __autoload($className) {
include_once $className . ".php";
}
$object = new ClassName;
?>
メソッドと属性の呼び出しのオーバーロード
generic __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";
}
}
function __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;
$foo->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);
?>