ホームページ  >  記事  >  バックエンド開発  >  h5 PHP5 の新機能: よりオブジェクト指向の PHP

h5 PHP5 の新機能: よりオブジェクト指向の PHP

WBOY
WBOYオリジナル
2016-07-29 08:35:07871ブラウズ

PHP のオブジェクト処理部分の中核は、より多くの機能を提供し、パフォーマンスを向上させるために完全に再開発されました。 PHP の以前のバージョンでは、オブジェクトは基本型 (数値、文字列) と同じ方法で処理されました。この方法の欠点は、オブジェクトを変数に代入するとき、またはオブジェクトをパラメータに渡すときに、オブジェクトが完全にコピーされてしまうことです。新しいバージョンでは、上記の操作は値の代わりに参照 (参照はオブジェクトの識別子として理解できます) を渡します。
多くの PHP プログラマーはオブジェクトの古い処理方法を知らないかもしれません。実際、ほとんどの PHP アプリケーションは問題なく動作します。または、最小限の変更のみが必要です。
プライベートメンバーと保護されたメンバー
PHP5 では、プライベートメンバー変数と保護されたメンバー変数の概念が導入されました。これを使用して、クラス メンバーの可視性を定義できます。

保護されたメンバーにはサブクラスからアクセスできますが、プライベート メンバーにはクラス自体からのみアクセスできます。
class MyClass {
private $Hello = "Hello, World!n";
protected $Bar = "Hello, Foo!n";
protected $Foo = "Hello, Bar!n"; printHello() {
print $this->Foo;
}
function printHello() {
MyClass::printHello();印刷する必要があります */
Print "MyClass2::printHello () " . $this->Hello; /* 何も出力しません */
" MyClass2::printHello() " /* 出力しませんprint (宣言されていません)* /
PRINT "MyClass2 :: Printhello ()". $ This- & gt; foo;/*Should prop*/}}}} o o o $ o = new myclass () を出力しません。 anything */
print $obj->Bar; /* 何も出力しません */
print $obj->Foo; /* 何も出力しません */
$obj-> ;printHello() ; /* 出力する必要があります */
$obj = new MyClass2();
print $obj->Hello; /* 何も出力しません */
print $obj->Bar; out anything */
print $obj->Foo; /* 何も出力しません */
$obj->printHello();
プライベートメソッドと保護されたメソッド
PHP5保護されたメソッドも紹介されています。
例:
class Foo {
private function aPrivateMethod() {
echo "Foo::aPrivateMethod() added.n"; }
protected function aProtectedMethod() {
echo "Foo::aProtectedMethod( ) added.n";
$this->aPrivateMethod();
}
}
class Bar extends Foo {
public function aPublicMethod() {
echo "Bar::aPublicMethod() added.n ";
$this ->aProtectedMethod();
}
}
$o = new Bar;
$o->aPublicMethod();
?> クラスを使用しなかった古いコードにはアクセス修飾子 (public、protected) がありませんでした。 、プライベート) コードは変更せずに実行できます。
抽象クラスと抽象メソッド
Php5 では、抽象クラスと抽象メソッドの概念も導入されています。抽象メソッドはメソッドの署名を宣言するだけで、その実装は提供しません。抽象メソッドを含むクラスは抽象として宣言する必要があります。
例:
abstract class AbstractClass {
abstract public function test();
}
class ImplementedClass extends AbstractClass {
public function test() {
echo "ImplementedClass:: test() used.n";
}
}
$o = new ImplementedClass;
$o->test();
抽象クラスはインスタンス化できません。抽象クラスを使用していない古いコードは変更せずに実行できます。
インターフェース
Php5ではインターフェースが導入されました。クラスは複数のインターフェイスを実装できます。
例:
interface Throwable {
public function getMessage();
}
class MyException 実装 Throwable {
// ...
}
}
?>インターフェイスを使用しない古いコードは変更せずに実行できます

クラスの型ヒント
PHP5 はまだ型付けが弱いですが、関数パラメーターを定義するときに、クラスの型ヒントを使用して、渡されることが期待されるオブジェクトの型を宣言できます

インターフェース Foo {
関数 a(Foo $foo);
インターフェース Bar {
関数 b(Bar $bar)
}
クラス FooBar 実装 Foo, Bar {
関数 a(Foo $foo); ) {
, ,
$a- >b($b);
?>
他の厳密に型指定された言語と同様、php5 クラスの型ヒントはコンパイル時ではなく実行時にチェックされます。 。つまり、
function foo(ClassName $object) {
// ...
}
?>
は次のコードと同じです:
function foo($object) {
if (!($objectinstanceof ClassName)) {
die("引数 1 は ClassName のインスタンスである必要があります");
}
}
?> この構文はクラスにのみ適用され、組み込み型には適用されません。
Final
PHP 5 では、final メンバーと Final メソッドを宣言するための Final キーワードが導入されました。 Final メンバーと Final メソッドはサブクラスによってオーバーライドできません。
example
<?phpクラスをfinalと宣言すると、クラスが継承されなくなります。最終クラスのメソッドはデフォルトで Final であるため、再度宣言する必要はありません。

final class Foo {
// クラス定義
}
// 次の行は不可能
// class Bork extends Foo {}
?>
プロパティをfinalとして定義することはできません
Previous Old Final を使用しないコードは変更せずに実行できます。
オブジェクトの複製
Php4 には、ユーザーがオブジェクトのコピー プロセスを制御するための独自のコピー コンストラクター (コピー コンストラクター) を定義できるメカニズムがありません。 Php4 はバイナリ コピーを実行するため、オブジェクトのすべてのプロパティを非常に正確に複製します。
オブジェクトのすべてのプロパティを正確にコピーすることは、私たちが常に望んでいることではないかもしれません。 GTK Window オブジェクトなどのコピー コンストラクターが必要であることを示す例があります。 a には必要なリソースがすべて保持されています。この GTK ウィンドウをオブジェクト b にコピーするときは、b が新しいリソース オブジェクトを保持することを推奨します。別の例: オブジェクト a をオブジェクト c にコピーすると、オブジェクト a にはオブジェクト c が含まれます。オブジェクト b には、オブジェクト c への参照ではなく、新しいオブジェクト c のコピーが含まれる方が望ましい場合があります。 (翻訳者注: ここで説明しているのは、シャロー クローン作成とディープ クローン作成です。)
オブジェクトのコピーは、clone キーワードを通じて実行されます (Clone は、クローン化されたオブジェクトの __clone() メソッドを呼び出します)。オブジェクトの __clone メソッドを直接呼び出すことはできません。
$copy_of_object = clone $object;
?>
開発者がオブジェクトのコピーを作成すると、php5 は __clone() メソッドが存在するかどうかを確認します。存在しない場合は、デフォルトの __clone() メソッドを呼び出して、オブジェクトのすべての属性をコピーします。 __clone() メソッドが定義されている場合、 _clone() メソッドは新しいオブジェクトのプロパティを設定します。便宜上、エンジンはデフォルトですべてのプロパティをコピーします。したがって、__clone() メソッドでは、変更する必要があるプロパティを上書きするだけで済みます。以下のように:

class MyCloneable {
static $id = 0;
function MyCloneable() {
$this->id = self::$id++; }
function __clone() {
this->address = "ニューヨーク";
$this->id = self::$id++; }
}
$obj = new MyCloneable();
$obj->address = "テルアビブ";
$obj->id . "n";
$obj_cloned->id ; $obj_cloned->name . "n";
print $obj_cloned->address
?>Php5 では、開発者がクラスのコンストラクター メソッドを宣言できます。コンストラクターを持つクラスは、新しいオブジェクトを作成するたびにこのメソッドを呼び出すため、コンストラクターはオブジェクトを使用する前に初期化するのに適しています。
Php4 では、コンストラクターの名前はクラスの名前と同じです。サブクラスのコンストラクターから親クラスのコンストラクターを呼び出すことが非常に一般的であり、継承システムからクラスを再配置することによって親クラスが変更されると、クラスのコンストラクターを変更する必要が生じることが多いことを考慮すると、php4 のアプローチは明らかにあまり優れていません。 。 合理的。了Php5 では、関数を宣言するための標準メソッド __ConStruct () が導入されています。次のようになります:
example
& lt;? PHP
Class BaseClass {
Function __ConStruct ORN ";
}}}
Class Subclass extends BaseClass {
function __construct() ) {
parent::__construct();
print "In SubClassconstructorn";
$obj = new BaseClass();
下位互換性を維持するには、 php5 が __construct() を見つけられない場合、昔ながらのコンストラクター メソッド、つまりクラスと同じ名前のメソッドを探します。簡単に言えば、古いコードに __construct() メソッドが含まれている場合にのみ、互換性の問題が発生します。
破棄メソッド
オブジェクト指向プログラミングの場合、デストラクター メソッドを定義できることは非常に便利な機能です。デストラクター メソッドは、デバッグ情報の記録、データベース接続の終了、その他のクリーンアップ作業に使用できます。 Php4 にはデストラクター メソッドはありませんが、php4 はリクエストの終了時に呼び出される関数を登録する機能をすでにサポートしています。
Php5 で導入されたデストラクター メソッドの概念は、他のオブジェクト指向言語 (Java など) と一致しています。このオブジェクトへの最後の参照が破棄されると、デストラクター メソッドが呼び出され、呼び出しの完了後にメモリが解放されます。注: デストラクター メソッドはパラメーターを受け入れません。
例 & & lt ;? PHP
Class MyDestructableClass {
Print "in Constructorn";"}
function __destruct () {
Print "DestRoying" . n";
}
}
$obj = new MyDestructableClass();
?>
構築メソッドと同様に、親クラスのデストラクタ メソッドは暗黙的に呼び出されません。サブクラスは、parent::__destruct() を呼び出すことで、独自のデストラクター内でこれを明示的に呼び出すことができます。
定数
Php5 ではクラスレベルの定数が導入されました。
class Foo {
const constant = "constant";
echo "Foo::constant ."n";
const を使用しない古いコードまだ正常に動作しています。
例外
Php4 には例外制御がありません。 Php5 では、他の言語 (Java) と同様の例外制御モデルが導入されています。 php5 はすべての例外のキャッチをサポートしていますが、finally 句はサポートしていないことに注意してください。
catch ステートメント ブロックでは、例外を再スローできます。複数の catch ステートメントが存在することもあります。この場合、キャッチされた例外は上から下に向かって順番に catch ステートメントと比較され、タイプが一致する最初の catch ステートメントが実行されます。最後まで検索しても一致する catch 句が見つからない場合は、次の try/catch ステートメントを探します。キャッチできなかった最後の例外が表示されます。例外がキャッチされると、プログラムは catch ステートメント ブロックの下で実行を開始します。

class MyException {
function __construct($Exception) {
$this->Exception = $Exception;
function Display() {
print "MyException: $this->Exceptionn" ; }
}
class MyExceptionFoo extends MyException {
function __construct($Exception) {
$this->Exception = $Exception; }
function Display() {
print "MyException: $this->Exceptionn" ; }
}
try {
throw new MyExceptionFoo('Hello');
}
catch (MyException $Exception) {
$Exception->Display()
}
echo $Exception; ;
}
?>
上記の例は、Exception を継承しない例外クラスを定義できることを示していますが、Exception を継承して独自の例外を定義することをお勧めします。これは、システムの組み込み Exception クラスは多くの有用な情報を収集できるが、それを継承しない例外クラスはこの情報を取得できないためです。次の PHP コードは、システムの組み込み Exception クラスを模倣します。各属性の後にはコメントが続きます。各プロパティにはゲッターがあります。これらのゲッター メソッドはシステムの内部処理によって呼び出されることが多いため、これらのメソッドは Final としてマークされます。

class Exception {
function __construct(string $message=NULL, int code=0) {
if (func_num_args()) {
$this->message = $message;
}
$this->code = $code;
$this->file = __FILE__; // throw 句の
$this->line = __LINE__; // throw 句の
$this->trace = debug_backtrace();
$this->string = StringFormat($this);
}
protected $message = '不明な例外';  // 例外メッセージ
protected $code = 0; // ユーザー定義の例外コード
protected $file;    // 例外のソース ファイル名
protected $line;    // 例外のソース行
private $trace;      // 例外のバックトレース
private $string;    // 内部のみ!!
final function getMessage() {
return $this->message;
}
final function getCode() {
return $this->code;
}
final function getFile() {
return $this->file;
}
final function getTrace() {
return $this->trace;
}
final function getTraceAsString() {
return self::TraceFormat($this);
}
function _toString() {
return $this->string;
}
静的プライベート関数stringformat(例外$例外){
// ... phpスクリプトで使用できない関数
//関連するすべての情報を文字列として返す
}
//... PHP スクリプトでは使用できない関数
// バックトレースを文字列として返す
}
}
?> 
私が定義した場合、例外ベースのクラスから継承されているものは互換性の問題です。古いコードはこの特性の影響を受けません。
class Circle {
function draw() {
print "Circlen";
}
}
class Square {
function draw() {
print "Square";
}
}
function ShapeFactoryMethod($shape) {
switch ($shape) {
case "Circle":
return new Circle();
case "Square":
return new Square();
}
}
ShapeFactoryMethod("Circle")->draw();
ShapeFactoryMethod("正方形")->draw();
?> 
静的に変化量を初期化できます。

class foo {
static $my_static = 'bla';
print foo::$my_static
$obj-> ;my_prop;
?>
静的メソッド
PHP 5 では、クラスをインスタンス化せずに呼び出すことができる静的メソッドが導入されました。

class Foo {
public static function aStaticMethod() {
// ...
}
}
Foo::aStaticMethod()
?>
疑似変数 $this は使用できません。メソッドメソッドで使用される静的。
instanceof
Php5 では、instanceof キーワードが導入され、オブジェクトがクラスのインスタンスであるか、派生クラスのインスタンスであるか、または特定のインターフェイスを実装しているかをテストするために使用できるようになりました。 }
$a = newbaseClass;
if ($ainstanceofbaseClass) {
echo "Hello World";
?>
静的関数変数
今度は、静的変数がコンパイル段階で処理されます。したがって、プログラマは参照によって静的変数に値を割り当てることができます。これによりパフォーマンスが向上しますが、静的変数への間接参照は使用できません。
参照によって渡される関数パラメータにもデフォルト値を設定できるようになりました。

function my_function(&$var = null) {
if ($var === null) {
die("$var には値が必要です")
}
}
?> ;
__autoload()
__autoload() 宣言されていないクラスが初期化されると、インターセプト関数が自動的に呼び出されます。クラスの名前は、__autoload() 関数に自動的に渡されます。また、__autoload() にはパラメータが 1 つだけあります。

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";
$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 "OK!n";
}
}
}
$foo = new Setter();
$foo->n = 1;
$foo->a = 100;
$foo->a++;
$foo->z++;
var_dump($foo);
?> 
例: __call()
class Caller {
private $x = array(1, 2, 3);
function __call($m, $a) {
print "メソッド $m が呼び出されました:n";
var_dump($a);
return $this->x;
}
}
$foo = 新しい 発信者();
$a = $foo->test(1, "2", 3.4, true);
var_dump($a);
?> 
次代
それぞれがオブジェクトの使用時に使用される場合、次の方法で再ロードされます。
公開 $y = 2;
}
$obj = 新しい Foo;
foreach ($obj as $prp_name => $prop_value) {
// プロパティ
を使用}
?> 
1 つのクラスのすべてのオブジェクトは、このクラスが 1 つの空のインターフェイスを実現している場合、代替え可能です。: 通過可能。 
インターフェイス IteratorAggregate と Iterator は、指定されたクラスのオブジェクトがコード内でどのように処理されるかを許可します。IteratorAggregateインターフェイスのあるメソッド:getIterator() 必ず一数グループを返します

class ObjectIterator implements Iterator {
private $obj;
プライベート $num;
関数 __construct($obj) {
$this->obj = $obj;
}
関数 rewind() {
$this->num = 0;
}
関数 valid() {
return $this->num < $this->obj->max;
}
function key() {
return $this->num;
}
function current() {
switch($this->num) {
case 0: return "1st";
ケース 1: 「2 番目」を返します。
ケース 2: 「3 番目」を返します。
デフォルト: return $this->num."th";
}
}
function next() {
$this->num++;
}
}
class Object implements IteratorAggregate {
public $max = 3;
function getIterator() {
return new ObjectIterator($this);
}
}
$obj = 新しい オブジェクト;
// this foreach ...
foreach($obj as $key => $val) {
echo "$key = $valn";
}
// は、次の 7 行を for ディレクティブと照合します。
$it = $obj->getIterator();
for($it->rewind(); $it->hasMore(); $it->next) {
$key = $it->current();
$val = $it->key();
echo "$key = $valn";
}
unset($it);
?> 
新しい __toString メソッド
__toString メソッドをオーバーライドすることで、オブジェクトから文字列への変換を制御できます。
}
}
$obj = 新しい Foo;
echo $obj; // __toString() を呼び出します
?> 
Reflection API
Php5 には、タイプ、インターフェイス、関数、メソッドの逆プロセスをサポートするために、完全な Reflection API が導入されています。 http://sitten-polizei.de/php/reflection_api/docs/ language.reflection.html

class Foo {
public $prop;
function Func($name) {
echo "Hello $name";
}
}
reflection_class::export('Foo');
reflection_object::export(new Foo);
reflection_method::export('Foo', 'func');
reflection_property::export('Foo', 'prop');
reflection_extension::export('standard');
?> 
新しい内部保存管理機構
Php5 には、マルチプロトコルの環境下でより効率的に実行できるようにする、まったく新しい内部保存管理機構があります。
以上は h5 について説明しました PHP5 の新しい特性: よりオブジェクト化された PHP には、h5 の側面の内容が含まれており、PHP 教則に関心のある友人の助けになることが望まれます。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。