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
www.bkjia.comtruehttp://www.bkjia.com/PHPjc/635016.html技術記事 1. __toString: オブジェクトが印刷されるときに、そのメソッドがそのメソッドをサポートする場合は、そのメソッドの戻り値が印刷され、PHP の省スペース実行で印刷結果が出力されます。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
-
2024-10-22 09:46:29
-
2024-10-13 13:53:41
-
2024-10-12 12:15:51
-
2024-10-11 22:47:31
-
2024-10-11 19:36:51
-
2024-10-11 15:50:41
-
2024-10-11 15:07:41
-
2024-10-11 14:21:21
-
2024-10-11 12:59:11
-
2024-10-11 12:17:31