PHP 5にstdClass内部保持クラスを追加

2734 ワード

stdClassクラスはPHPの内部保持クラスで、初期にはメンバー変数もメンバーメソッドもなく、すべてのマジックメソッドがNULLに設定されており、変数パラメータを渡すことができますが、呼び出す方法はありません.stdClassクラスは継承できますが、それだけでは意味がありません.
このクラスはPHPの保存クラスであり、すべてのクラスのベースクラスではありません.
 
  
class foo {}
$bar = new foo();
echo $bar instanceof stdClass?'yes':'no';
//output:no

もう1つの例は、
 
  
// CTest does not derive from stdClass
class CTest {
public $property1;
}
$t = new CTest;
var_dump($t instanceof stdClass); // false
var_dump(is_subclass_of($t, 'stdClass')); // false
echo get_class($t) . "
"; // 'CTest'
echo get_parent_class($t) . "
"; // false (no parent)
?>

(object)強制変換ではstdClassのインスタンスが得られます.
PHPのstdClassクラスの理解
stdClassはPHP 5で流行し始めた.stdClassもzendの保存クラスです.stdClassはPHPのベースクラスです
すべてのクラスはほとんどこのクラスを継承するので、いつでもnewされ、この変数をobjectにすることができます.同時に、
この基類にはもう一つの特殊な場所がありますが、方法がありません.new stdClass()の変数を使うと、
$a->test()という使い方はあり得ません.PHP 5のオブジェクトのユニーク性、オブジェクトはどこでも呼び出され、
いずれも参照アドレス型なので、相対的に消費されるリソースは少なくなります.コピーを参照するのではなく、他のページに値を割り当てるときに直接変更されます.
以上の定義の多くは正しいが、致命的な診断エラー:stdClassはPHPのベースクラスであり、すべてのクラスがほとんどこのクラスを継承している.簡単な例を見てみましょう
 
  
class EmptyClass {

}
$object = new EmptyClass();
if ($object instanceof stdClass) {
echo 'yes';
}else{
echo 'no';
}

実行コード、出力「no」は、stdClassクラスがすべてのクラスのベースクラスではないことを十分に示しています.PHPの保存クラス、またはstrlen関数のような役割にすぎません.ソースコードの次元からstdClassクラスの実装を見てみましょう.登録されている場所はZend/zend_です.buildin_functions.cファイルにあります.次のようになります.
 
  
ZEND_MINIT_FUNCTION(core) { /* {{{ */
zend_class_entry class_entry;
/* stdClass */
INIT_CLASS_ENTRY(class_entry, "stdClass", NULL);
zend_standard_class_def = zend_register_internal_class(&class_entry TSRMLS_CC);

/* , , Exception ,SPL */
zend_register_default_classes(TSRMLS_C);
return SUCCESS;
}
/* }}} */

これはzend_builtin_Moduleのモジュール初期化関数は、PHPカーネルでモジュール初期化操作を行うと自動的にロードされ、stdClassクラスの登録操作も実行されます.このコードからstdClassクラスは、メンバー変数もメンバーメソッドもないクラスであることがわかります.そのすべてのマジックメソッドは、親、インタフェースなどが初期化時にNULLに設定されます.PHPではクラスに対して動的にメソッドを追加できないため、このクラスは動的プロパティを処理するためにしか使用できません.これも一般的な使い方です.
まとめてみます.
stdClassクラスはPHPの内部保持クラスで、初期にはメンバー変数もメンバーメソッドもなく、すべてのマジックメソッドがNULLに設定されており、変数パラメータを渡すことができますが、呼び出す方法はありません.stdClassクラスは継承できますが、それだけでは意味がありません.
公式マニュアル参考:http://www.php.net/manual/en/language.oop5.basic.php#92123