ホームページ  >  記事  >  バックエンド開発  >  PHPオブジェクト指向の重要な知識(2)_PHPチュートリアル

PHPオブジェクト指向の重要な知識(2)_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:42:28974ブラウズ

1. __toString:

オブジェクトを出力する際、クラスでメソッドが定義されている場合はメソッドの戻り値が出力され、それ以外の場合はPHPのデフォルトの動作に従って出力結果が出力されます。このメソッドは、Java の toString() に似ています。
コードをコピー
クラス TestClass {
パブリック関数 __toString() {
return "これは TestClass::__toString.n です";
}
}
$testObj = 新しい TestClass();
$testObj;
を印刷します
コードをコピー
実行結果は次のとおりです:
Stephens-Air:Desktop$ php Test.php
これは TestClass::__toString です。
2. __get と __set:
これら 2 つのメソッドは、クラス内の未宣言の属性アクセスを処理するために使用されます。オブジェクト ユーザーが宣言されていないオブジェクト プロパティにアクセスしようとすると、アクセスするプロパティの名前を引数として含む文字列を使用して __get() が呼び出されます。 __get() メソッドから返されるものはすべて、その値を持つプロパティが存在するかのように呼び出し元に直接返されます。さらに、属性が存在しても、そのアクセス可視性がプライベートまたは保護されている場合、これらの 2 つのインターセプト メソッドも呼び出されることに注意してください。逆に、属性が存在し、アクセス可能であれば、その属性にアクセスできます。これら 2 つのメソッドは呼び出されなくなります。以下は __get() インターセプト メソッドのサンプル コードです:
コードをコピー
クラス TestClass {
プライベート $privateField;
パブリック $publicField;
パブリック関数 __construct() {
$this->privateField = "これはプライベート Field.n";
$this->publicField = "これはパブリック Field.n です";
}
パブリック関数 __get($property) {
print "__get() が呼び出されます。n";
$method = "get${property}";
if (method_exists($this, $method)) {
return $this->$method();
}
return "これは未定義のフィールドです。n";
}
パブリック関数 getPrivateField() {
}
}
$testObj = 新しい TestClass();
$testObj->privateField;
を印刷します
print $testObj->未定義フィールド;
print $testObj->publicField;
コードをコピー
実行結果は次のとおりです:
Stephens-Air:Desktop$ php Test.php
__get() が呼び出されます。
これはプライベートフィールドです。
__get() が呼び出されます。
これは未定義のフィールドです。
これは公開フィールドです。
__set() メソッドを呼び出すルールは基本的に __get() と同じです。違いは、未定義または非表示のクラス属性の代入操作をインターセプトするために使用されることです。さらに、このメソッドは 2 つのパラメータ、つまり属性名と設定する値を受け取ります。以下のコード例を参照してください:
コードをコピー
クラス TestClass {
プライベート $privateField;
パブリック $publicField;
パブリック関数 __construct() {
$this->privateField = "これはプライベート Field.n";
$this->publicField = "これはパブリック Field.n です";
}
パブリック関数 __get($property) {
print "__get() が呼び出されます。n";
$method = "get${property}";
if (method_exists($this, $method)) {
return $this->$method();
}
return "これは未定義のフィールドです。n";
}
パブリック関数 __set($property, $value) {
print "__set が呼び出されます。n";
$method = "set${property}";
if (method_exists($this, $method)) {
$this->$method($value);
} 他 {
print "これは未定義のフィールドです。n";
}
}
パブリック関数 getPrivateField() {
$this->privateField;
を返す
}
public function setPrivateField($value) {
$this->privateField = $value;
}
}
$testObj = 新しい TestClass();
$testObj->privateField = "これは set.n 後のプライベート フィールドです";
$testObj->unknownField = "これは set.n 後の未定義フィールドです";
$testObj->publicField = "これは set.n 後のパブリック フィールドです";
$testObj->privateField;
を印刷します
print $testObj->未定義フィールド;
print $testObj->publicField;
复制幣
运行结果如下:
复制幣
Stephens-Air:Desktop$ php Test.php
__set が呼び出されます。
__set が呼び出されます。
これは未定義のフィールドです。
__get() が呼び出されます。
これは設定後のプライベートフィールドです。
__get() が呼び出されます。
これは未定義のフィールドです。
これは設定後のパブリックフィールドです。
复制幣
3. __isset和__unset:
この 2 つのメソッドは、承認された仕様と __get() および __set() に非常によく似ていますが、クラス内に存在しない、または不可視なプロパティが isset() および unset() によって使用される場合にのみ使用されます。個別にアクティベートされます。
复制幣
クラス TestClass {
プライベート $privateField;
public $publicField;
パブリック関数 __construct() {
$this->privateField = "定義されたプライベート フィールド";
$this->publicField = "定義されたパブリック フィールド";
}
パブリック関数 __isset($property) {
print "__isset が呼び出されます。n";
return isset($this->$property);
}
パブリック関数 __unset($property) {
print "__unset が呼び出されます。n";
if (isset($this->$property)) {
unset($this->$property);
}
}
}
$testObj = 新しい TestClass();
print 'isset($testObj->privateField) は '.(isset($testObj->privateField) ? "true" : "false")."n";
print 'isset($testObj->unknownField) は '.(isset($testObj->unknownField) ? "true" : "false")."n";
print 'isset($testObj->publicField) は '.(isset($testObj->publicField) ? "true" : "false")."n";
print "設定解除後....n";
//次の 2 つの関数が使用された後、$testObj の 2 つのオブジェクトのプロパティは両方とも使用できなくなります。
//さらに、出力結果からわかるように、publicField は可視プロパティであるため、__unset メソッドは 1 回だけ使用され、__unset はこのプロパティに依存せずに使用されます。
unset($testObj->privateField);
unset($testObj->publicField);
print 'isset($testObj->privateField) は '.(isset($testObj->privateField) ? "true" : "false")."n";
print 'isset($testObj->publicField) は '.(isset($testObj->publicField) ? "true" : "false")."n";
复制幣
运行结果如下:
复制幣
Stephens-Air:Desktop$ php Test.php
__isset が呼び出されます。
isset($testObj->privateField) は true です
__isset が呼び出されます。
isset($testObj->unknownField) は false です
isset($testObj->publicField) は true です
設定解除後……
__unset が呼び出されます。
__isset が呼び出されます。
isset($testObj->privateField) は false です
__isset が呼び出されます。
isset($testObj->publicField) は false です
复制幣
4. __電話:
__call() メソッドは非常に便利ですが、悪用されやすいインターセプト メソッドです。オブジェクト ユーザーが現在のオブジェクトの未定義のメンバー関数にアクセスしようとすると、__call() が自動的に呼び出され、2 つのパラメーター、つまり関数名と呼び出し関数に渡されるすべてのパラメーター (配列) が渡されます。 __call メソッドによって返される値はすべて、メンバー関数が実際に存在するかのように関数の呼び出し元に返されます。非常に便利なデリゲートの例を以下に示します。
コードをコピー
クラス DelegateClass {
関数 printMessage($arg1, $arg2) {
print "DelegateClass:delegatedMethod が呼び出されます。n";
print '$arg1 = '.$arg1.'and $arg2 = '.$arg2."n";
}
}
クラス TestClass {
プライベート$delegateObj;
パブリック関数 __construct() {
$this->delegateObj = new DelegateClass();
}
パブリック関数 __call($method, $args) {
$this->delegateObj->$method($args[0],$args[1]);
}
}
$testObj = 新しい TestClass();
$testObj->printMessage("hello","world");
コードをコピー
実行結果は次のとおりです:
Stephens-Air:Desktop$ php Test.php
DelegateClass:delegatedMethod が呼び出されます。
$arg1 = こんにちは、$arg2 = 世界
上記の例からわかるように、TestClass は printMessage メンバー メソッドを宣言していませんが、__call() メソッドの賢いブリッジングを通じてデリゲート オブジェクトに直接渡されます。個人的には、このテクニックは諸刃の剣であり、多用すべきではないと考えています。
5. コールバック関数:
コールバック関数のアプリケーション シナリオを説明する必要はありません。C/C++ にはコールバック関数の典型的な使用例が無数にあります。 ここでは、PHP でコールバック関数を使用するためのルールを簡単に示します。以下のサンプルコードと主要なコメントをご覧ください:
コードをコピー
クラス製品{
パブリック $name;
公開価格;
パブリック関数 __construct($name, $price) {
$this->name = $name;
$this->価格 = $price;
}
}
クラス ProcessSale {
プライベート $コールバック;
関数 registerCallback($cb) {
if (!is_callable($cb)) {
throw new Exception("コールバックを呼び出すことができません。");
}
$this->callbacks[] = $cb;
}
機能セール($product) {
print "{$product->name}: 処理 n";
foreach ($this->$cb としてコールバック) {
//呼び出し方法は以下の2つが利用可能です。
call_user_func($cb, $product);
$cb($product);
}
}
}
$logger = function($product) {
print "ロギング ({$product->name})n";
};
$processor = 新しい ProcessSale();
$processor->registerCallback($logger);
$プロセッサ->セール(新製品("靴",6));
「n」を印刷します;
$プロセッサ->セール(新製品("コーヒー",6));
コードをコピー
実行結果は次のとおりです:
コードをコピー
Stephens-Air:Desktop$ php Test.php
靴:加工
ロギング(靴)
ロギング(靴)
コーヒー: 加工
ロギング(コーヒー)
ロギング(コーヒー)
コードをコピー
6.使用(閉鎖):
Javascript には多数のクロージャ アプリケーションがあり、PHP のクロージャは use キーワードを通じて実装されます。クロージャ自体の概念については、簡単に言えば、関数内のコードは親スコープ内の変数にアクセスできます。以下のサンプルコードと主要なコメントをご覧ください:
コードをコピー
クラス製品{
public $name;
公開 $price;
パブリック関数 __construct($name, $price) {
$this->name = $name;
$this->price = $price;
}
}
クラス ProcessSale {
プライベート $callbacks;
function registerCallback($cb) {
if (!is_callable($cb)) {
throw new Exception("コールバックを呼び出すことができません。");
}
$this->callbacks[] = $cb;
}
関数セール($product) {
print "{$product->name}: 処理 n";
foreach ($this->$cb としてコールバック) {
$cb($product);
}
}
}
クラストータライザー{
静的関数 warnAmount($amt) {
$count = 0;
// ここの $amt と $count は両方とも包含量です。その中の &$count は参照形式であり、関数内部がこの量の値を変更すると、
//次回このパケット量を再度アクセスするとき、$count は以前に使用される変更後の値になります。
return function($product) use($amt, &$count) {
$count += $product->price;
print " count: $countn";
if ($count > $amt) {
print " 高価格に達しました: {$count}n";
}
};
}
}
$processor = 新しい ProcessSale();
$processor->registerCallback(Totalizer::warnAmount(8));
$プロセッサ->セール(新製品("靴",6));
$プロセッサ->セール(新製品("コーヒー",6));
复制幣
运行结果如下:
靴: 加工
カウント: 6
コーヒー: 加工中
カウント: 12
到達最高価格: 12
注:このブログ中の记录の知识点,是我学习PHP的過程中,遇得的一部PHP及其他面向オブジェクト语言相比较独特的場所,或は对我本人言确实必要对我习PHP的过织深さは特にありませんが、多くの人に楽しんでいただけることが望ましいです。

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

tru​​ehttp://www.bkjia.com/PHPjc/635016.html技術記事 1. __toString: オブジェクトが印刷されるときに、そのメソッドがそのメソッドをサポートする場合は、そのメソッドの戻り値が印刷され、PHP の省スペース実行で印刷結果が出力されます。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。