ホームページ  >  記事  >  バックエンド開発  >  PHP5 の新機能: よりオブジェクト指向になった PHP_PHP チュートリアル

PHP5 の新機能: よりオブジェクト指向になった PHP_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 16:00:25832ブラウズ

PHP のオブジェクト処理部分の中核は、より多くの機能を提供し、パフォーマンスを向上させるために完全に再開発されました。 PHP の以前のバージョンでは、オブジェクトは基本型 (数値、文字列) と同じ方法で処理されました。この方法の欠点は、オブジェクトを変数に代入するとき、またはオブジェクトをパラメータに渡すときに、オブジェクトが完全にコピーされてしまうことです。新しいバージョンでは、上記の操作は値の代わりに参照 (参照はオブジェクトの識別子として理解できます) を渡します。

多くの PHP プログラマーはオブジェクトの古い処理方法を知らないかもしれません。実際、ほとんどの PHP アプリケーションは問題なく動作します。または、最小限の変更のみが必要です。

プライベートメンバーと保護されたメンバー
PHP5 では、プライベートメンバー変数と保護されたメンバー変数の概念が導入されました。これを使用して、クラス メンバーの可視性を定義できます。


保護されたメンバーにはサブクラスからアクセスできますが、プライベート メンバーにはクラス自体からのみアクセスできます。

class 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() "
print "MyClass::printHello() ) " . $this->Foo;
}
}

class MyClass2 extends MyClass {
protected $Foo;

function printHello() {
MyClass::printHello(); /* すべき print MyClass2::printHello( ) " . $this->Hello; /* 何も出力しないでください */
" MyClass2::printHello() " . $this->Bar; /* 出力しないでください (宣言されていません)*/
Print "MyClass2 :: Printhello ()". $ this-& gt; /*印刷する必要があります*/

$ obj = new myclass () ;; out anything */
print $obj->Bar; /* 何も出力しません */
print $obj->Foo; /* 何も出力しません */
$obj->printHello( ); /* 出力する必要があります */

$obj = new MyClass2();
print $obj->Hello; /* 何も出力しません */
print $obj- >Bar;何も出力しません */
print $obj->Foo; /* 何も出力しません */
$obj->printHello();

Private メソッドと保護されたメソッド
PHP5 も導入プライベート メソッドとプロテクト メソッドの概念。

例:
class Foo {
private function aPrivateMethod() {
echo "Foo::aPrivateMethod() added.n"; }

protected functionaProtectedMethod d() {
echo "Foo:: aProtectedMethod() が呼び出された.n";
$this->aPrivateMethod();
}
}

class Bar extends Foo {
public function aPublicMethod() {
echo "Bar::a PublicMethod() が呼び出された.n" ;
シンボルを使用したコード(パブリック、プロテクト、プライベート) は変更せずに実行できます。

抽象クラスと抽象メソッド
Php5 では、抽象クラスと抽象メソッドの概念も導入されています。抽象メソッドはメソッドの署名を宣言するだけで、その実装は提供しません。抽象メソッドを含むクラスは抽象として宣言する必要があります。

例:
abstract class AbstractClass {
abstract public function test();
}

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

$o = new ImplementedClass;
$o->test();
?>

抽象クラスはインスタンス化できません。抽象クラスを使用していない古いコードは変更せずに実行できます。

インターフェース
Php5ではインターフェースが導入されました。クラスは複数のインターフェイスを実装できます。

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

class MyException 実装 Throwable {
public function getMessage() {
// ...
}
}
?>

インターフェイスを使用しない古いコードは変更せずに実行できます



クラスの型ヒント

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


interface Foo {
function a(Foo $foo);

interface Bar {
function b(Bar $bar)
}

class FooBar の実装 F oo , Bar {
function a (Foo $foo) {
// ...
}

function b(Bar $bar) {
...
}
}

$a = 新しい F ooBar
$ b = 新しい FooBar; $a->a($b);
$a->b($b);
?> 他の厳密に型指定された言語と同様に、php5 クラスの型ヒントはコンパイル時ではなく実行時にチェックされます。 。つまり:

function foo(ClassName $object) {
// ...
}
?>

は次のコードと同じです:

function foo( $ object) {
if (!($objectinstanceof ClassName)) {
die("引数 1 は ClassName のインスタンスである必要があります")
}
}
?> この構文はクラスにのみ適用されます。クラス 組み込み型。

Final

PHP 5 では、最終メンバーと最終メソッドを宣言するための Final キーワードが導入されました。 Final メンバーと Final メソッドはサブクラスによってオーバーライドできません。


class Foo {
final function bar() {
// ...
}
}
?> さらに一歩進んで、クラスをfinalとして宣言できます。クラスをfinalと宣言すると、クラスが継承されなくなります。最終クラスのメソッドはデフォルトで Final であるため、再度宣言する必要はありません。


final class Foo {
// クラス定義
}

// 次の行は不可能
// class Bork extends Foo {}
?>

プロパティをfinalとして定義することはできません

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->名前 = "こんにちは";
$obj->アドレス = "テルアビブ";

$obj_cloned = クローン $obj_id; . "n";
print $obj_cloned->address

Php5 では、クラスのコンストラクターを宣言できます。方法。コンストラクターを持つクラスは、新しいオブジェクトを作成するたびにこのメソッドを呼び出します。そのため、コンストラクターは、オブジェクトが使用される前に初期化するのに適しています。

Php4 では、コンストラクターの名前は、コンストラクターの名前と同じです。クラス。サブクラスのコンストラクターから親クラスのコンストラクターを呼び出すことが非常に一般的であり、継承システムからクラスを再配置することによって親クラスが変更されると、クラスのコンストラクターを変更する必要が生じることが多いことを考慮すると、php4 のアプローチは明らかにあまり優れていません。 。 合理的。

Php5 では、コンストラクター関数を宣言する標準的な方法 __construct() が導入されています。次のようになります。

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

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

下位互換性を維持するために、php5 が __construct() を見つけられない場合は、昔ながらのコンストラクター メソッド、つまりクラスと同じ名前のメソッドを探します。簡単に言えば、古いコードに __construct() メソッドが含まれている場合にのみ、互換性の問題が発生します。

破壊メソッド
オブジェクト指向プログラミングの場合、デストラクター メソッドを定義できることは非常に便利な機能です。デストラクター メソッドは、デバッグ情報の記録、データベース接続の終了、その他のクリーンアップ作業に使用できます。 Php4 にはデストラクター メソッドはありませんが、PHP4 はリクエストの終了時に呼び出される関数を登録する機能をすでにサポートしています。

Php5で導入されたデストラクターメソッドの概念は、他のオブジェクト指向言語(Javaなど)と一致しています。このオブジェクトへの最後の参照が破棄されると、デストラクター メソッドが呼び出され、呼び出しの完了後にメモリが解放されます。注: デストラクター メソッドはパラメーターを受け入れません。


class MyDestructableClass {
function __construct() {
print "コンストラクター内";
$this->name = "MyDestructableClass" } function __destruct() {
print "破壊" . $this->name . "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 句が見つからない場合は、次の 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- & gt; Exception = $ ExceptionI ON;

} u Function Display () {
Print "MyException: $ this- >例外n";
}
}

try {
throw new MyExceptionFoo('Hello');
}
catch (MyException $Exception) {
$Exception->Display();
catch (例外$Exception) {
echo $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 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
print $obj- >my_prop;
?>

静的メソッド
PHP 5 では、クラスをインスタンス化せずに呼び出すことができる静的メソッドが導入されました。


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

Foo::aStaticMethod()
?>

疑似変数 $this静的メソッドでは使用できません。

instanceof
Php5 では、instanceof キーワードが導入され、オブジェクトがクラスのインスタンスであるか、派生クラスのインスタンスであるか、または特定のインターフェイスを実装しているかをテストするために使用できるようになりました。 baseClass { }

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

関数 __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 = 新しい Caller();
$a = $foo->test(1, "2", 3.4, true);
var_dump($a);
?> 

次代
オブジェクトの使用時間に応じて、次代の方法で再ロードされます。省スペースの実行は、次のクラスのすべてのプロパティです。 1;
公開 $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 メソッドをオーバーライドすることで、オブジェクトから文字列への変換を制御できます。


class Foo {
function __toString() { ;
}
}

$obj = 新しい Foo;

echo $obj; // __toString() を呼び出します
?> 
Reflection API
Php5 には、タイプ、インターフェース関数、数値、メソッドの逆プロセスをサポートするために、完全なリフレクション 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 には、マルチプロトコルの環境下でより効率的に実行できるようにする、まったく新しい内部保存管理機構があります。



http://www.bkjia.com/PHPjc/317134.html

www.bkjia.com

tru​​e

技術記事 PHP はオブジェクト処理部分の内部コアを完全に新しくし、より多くの機能を提供すると同時にパフォーマンスも向上しました。 以前のバージョンの PHP では、処理オブジェクトと処理の基本型 (数字、文字列...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。