PHPでは、 IS_A()関数は、オブジェクトが特定のクラスに属しているかそのサブクラスに属しているかを判断するための実用的なツールです。この関数は通常、特に多型操作、依存関係注入、オブジェクト工場などのオブジェクト指向プログラミングモードでタイプチェックに使用されます。ただし、オブジェクトがシリアル化(シリアル化() )および脱介入( Unserialize() )のプロセスを受けた後、 IS_A()の判断メカニズムには、noteworsyの行動と詳細があります。この記事では、実際の例で詳細に説明します。
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
var_dump(is_a($dog, 'Dog')); // true
var_dump(is_a($dog, 'Animal')); // true
var_dump(is_a($dog, 'stdClass')); // false
IS_A() 2つのパラメーターを受け入れます。1つ目はオブジェクト、2つ目はクラス名(文字列)です。オブジェクトがそのクラスまたはそのサブクラスのインスタンスである場合、 trueを返します。
PHPのSerialize()は、オブジェクトを文字列形式に変換し、 unserialize()を介して復元できます。基本的な例は次のとおりです。
$dog = new Dog();
$serialized = serialize($dog);
$unserialized = unserialize($serialized);
var_dump(is_a($unserialized, 'Dog')); // true
現時点では、クラスの定義がまだ存在する限り、オブジェクトがシリアル化され、脱色されていても、 IS_A()はオブジェクトのクラスを正しく判断できます。
敏arialの鍵は、クラスの定義にあります。クラスが降下中に利用できない場合、PHPは__PHP_INCUMPLETE_CLASSに復元します。現時点では、 IS_A()判断は無効になります。
$serializedDog = 'O:3:"Dog":0:{}'; // から serialize(new Dog())
file_put_contents('dog.txt', $serializedDog);
// 実行中に次のコードが定義されていないと仮定します Dog 親切
$unserialized = unserialize(file_get_contents('dog.txt'));
var_dump(is_a($unserialized, 'Dog')); // false
var_dump(get_class($unserialized)); // __PHP_Incomplete_Class
IS_A()は、不完全なクラスオブジェクトを認識できません。したがって、関連するクラスが脱介入の前に定義されるか、自動的にロードされていることを確認する必要があります。
最新のPHPプロジェクトは、PSR-4または同様の仕様を使用して、自動負荷メカニズムを実装しています。たとえば、作曲家を通じて:
spl_autoload_register(function ($class) {
include 'classes/' . $class . '.php';
});
IS_A()またはUnserialize()にアクセスする前にクラスファイルが正しくロードされている限り、判断は正常に機能します。逆に、クラスが未定義の場合、 IS_A()は常にfalseを返します。
一部のアプリケーションでは、API通信やタスクキューなどのシステム間でシリアル化されたオブジェクトが送信されます。次のコードを検討してください。
$dog = new Dog();
$data = serialize($dog);
// それを想定してください API 送信
$url = 'https://m66.net/api/receive';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POSTFIELDS, ['payload' => $data]);
curl_exec($ch);
受信者は、犬のクラスが存在することを確認する必要があります。そうしないと、 IS_A()を使用してオブジェクトタイプを正しく決定することはできません。
// レシーバーコードスニペット
$data = $_POST['payload'];
$obj = unserialize($data);
if (is_a($obj, 'Dog')) {
// 論理処理
} else {
// エラー処理
}
エラーを回避するには、非正解説のオブジェクトが脱色されるのを防ぐために、ホワイトリストメカニズムを使用する必要があります。
IS_A()は、オブジェクトのクラスまたはその親クラスを効果的に判断できます。
クラスが存在する限り、オブジェクトのシリアル化と降下の後もタイプ情報を保持できます。
クラスの定義が欠落している場合、 unserialize()は__PHP_INCOMPLETE_CLASSを生成し、 IS_A()判断の障害をもたらします。
脱介入を使用する前に、常に関連するクラスをロードしてください。
システム全体で送信または持続するオブジェクトデータの場合、セキュリティの脆弱性を防ぐために、クラスと脱派化ロジックを慎重に検証する必要があります。
IS_A()およびシリアル化メカニズムの正しい使用は、コードの堅牢性を改善するだけでなく、システムのスケーラビリティとセキュリティの観点から保証を提供します。