PHPにはオブジェクト指向部分に関連するマジックメソッドが多数あり、これらのメソッドはオブジェクト指向の実装に便利です
。
ほとんどのクラスにはコンストラクターと呼ばれる特別なメソッドがあります。オブジェクトが作成されると、コンストラクターが自動的に呼び出されます。これは通常、いくつかの便利な初期化タスクを実行するために使用されます
コンストラクターの宣言は、その名前が 2 つのアンダースコア __construct() でなければならないことを除いて、他の操作の宣言と同じです。これは PHP5 での変更であり、PHP4 バージョンではコンストラクターの名前はクラス名と同じである必要があります。下位互換性のため、クラスに __construct() という名前のメソッドがない場合、PHP はクラスと同じ名前のメソッドを検索します
サブクラスにコンストラクタが定義されている場合、その親クラスのコンストラクタは暗黙的に呼び出されません。親クラスのコンストラクターを実行するには、子クラスのコンストラクターでparent::__construct()を呼び出す必要があります。サブクラスがコンストラクターを定義していない場合、通常のクラスメソッドと同様に親クラスから継承されます (プライベートとして定義されていない場合)
建設法の反対は破壊法です。デストラクタメソッドはPHP5から新しく追加された内容です。PHP4にはデストラクタメソッドはありません。デストラクター メソッドは、オブジェクトが破棄される前に自動的に呼び出されるメソッドで、主にファイルを閉じる、結果セットを解放するなどの特定の操作を実行します。
コンストラクターメソッドと同様に、クラスのデストラクターメソッド名はアンダースコア2つ_ _destruct()である必要があります。デストラクターはパラメーターを受け取ることができませんリーリー
立ち入り禁止物件
get()
アクセスできない属性 (プロテクト、プライベート) を読み取る場合、__get() が呼び出され、属性名が最初のパラメーター (文字列) としてこのメソッドに渡されますリーリー
セット()
アクセスできない属性 (プロテクト、プライベート) に値を割り当てる場合、__set() が呼び出され、属性名が最初のパラメーター (文字列) としてこのメソッドに渡され、値が 2 番目のパラメーター (混合) として渡されます。リーリー
アクセスできないプロパティ(プロテクト、プライベート)に対して isset() または empty() が呼び出された場合、__isset() が呼び出されます
リーリー
アクセスできないプロパティ(プロテクト、プライベート)に対してunset()が呼び出された場合、__unset()が呼び出されます
リーリー
オブジェクトのコピー
クローン()clone() メソッドは、オブジェクトのクローン作成時に自動的に呼び出されます。このメソッドは、クローンされたコピーを再初期化するために使用できます。
clone() メソッドには、this と that という 2 つのオブジェクトへの参照が自動的に含まれます。これはコピー オブジェクトへの参照であり、あれは元のオブジェクトへの参照です。リーリー
__toString()メソッドは、文字列として扱われる場合にクラスがどのように応答するかを決定するために使用され、オブジェクトの文字列表現を直接取得するときに自動的に呼び出される最も便利な方法です。オブジェクト参照 リーリー
オブジェクト内でアクセスできないメソッドを呼び出す場合、__call()が呼び出されます
callStatic()静的コンテキストでアクセスできないメソッドを呼び出す場合、__callStatic()が呼び出されます リーリー
PHP5では、まだ定義されていないクラスを使用しようとしたときに自動的に呼び出される__autoload()関数を定義できます。この関数を呼び出すことで、スクリプト エンジンは、PHP がエラーで失敗する前に、必要なクラスをロードする最後のチャンスを得ることができます リーリー
sleep()
在调用serialize()函数将对象串行化时,检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误
__sleep()函数不需要接受任何参数,但需要返回一个数组,在数组中包含需要串行化的属性。未被包含在数组中的属性将在串行化时被忽略。如果没有在类中声明__sleep()方法,对象中的所有属性都将被串行化
wakeup()
在调用unserialize()函数将对象反串行化对象时,则会自动调用对象中的__wakeup()方法,用来在二进制串重新组成一个对象时,为新对象中的成员属性重新初始化
wakeup()经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作
<?<span style="color: #000000;">php </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Connection { </span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$link</span><span style="color: #000000;">; </span><span style="color: #0000ff;">private</span> <span style="color: #800080;">$server</span>, <span style="color: #800080;">$username</span>, <span style="color: #800080;">$password</span>, <span style="color: #800080;">$db</span><span style="color: #000000;">; </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> __construct(<span style="color: #800080;">$server</span>, <span style="color: #800080;">$username</span>, <span style="color: #800080;">$password</span>, <span style="color: #800080;">$db</span><span style="color: #000000;">) { </span><span style="color: #800080;">$this</span>->server = <span style="color: #800080;">$server</span><span style="color: #000000;">; </span><span style="color: #800080;">$this</span>->username = <span style="color: #800080;">$username</span><span style="color: #000000;">; </span><span style="color: #800080;">$this</span>->password = <span style="color: #800080;">$password</span><span style="color: #000000;">; </span><span style="color: #800080;">$this</span>->db = <span style="color: #800080;">$db</span><span style="color: #000000;">; </span><span style="color: #800080;">$this</span>-><span style="color: #000000;">connect(); } </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> connect() { </span><span style="color: #800080;">$this</span>->link = <span style="color: #008080;">mysql_connect</span>(<span style="color: #800080;">$this</span>->server, <span style="color: #800080;">$this</span>->username, <span style="color: #800080;">$this</span>-><span style="color: #000000;">password); </span><span style="color: #008080;">mysql_select_db</span>(<span style="color: #800080;">$this</span>->db, <span style="color: #800080;">$this</span>-><span style="color: #000000;">link); } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> __sleep() { </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">array</span>('server', 'username', 'password', 'db'<span style="color: #000000;">); } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> __wakeup() { </span><span style="color: #800080;">$this</span>-><span style="color: #000000;">connect(); } } </span>?>
invoke()
当尝试以调用函数的方式调用一个对象时,__invoke()方法会被自动调用
<?<span style="color: #000000;">php </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> CallableClass { </span><span style="color: #0000ff;">function</span> __invoke(<span style="color: #800080;">$x</span><span style="color: #000000;">) { </span><span style="color: #008080;">var_dump</span>(<span style="color: #800080;">$x</span><span style="color: #000000;">); } } </span><span style="color: #800080;">$obj</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> CallableClass; </span><span style="color: #800080;">$obj</span>(5);<span style="color: #008000;">//</span><span style="color: #008000;">int(5)</span> <span style="color: #008080;">var_dump</span>(<span style="color: #008080;">is_callable</span>(<span style="color: #800080;">$obj</span>));<span style="color: #008000;">//</span><span style="color: #008000;">bool(true)</span> ?>
【补充】
set_state()
当调用var_export()导出类时,set_state()方法会被调用,本方法的唯一参数是一个数组,其中包含按 array('property' => value, ...) 格式排列的类属性
[注意]var_export()返回关于传递给该函数的变量的结构信息,它和var_dump()类似,不同的是其返回的表示是合法的PHP代码,也就是说,var_export返回的代码,可以直接当作php代码赋给一个变量。 而这个变量就会取得和被var_export一样的类型的值
<?<span style="color: #000000;">php </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> A { </span><span style="color: #0000ff;">public</span> <span style="color: #800080;">$var1</span><span style="color: #000000;">; </span><span style="color: #0000ff;">public</span> <span style="color: #800080;">$var2</span><span style="color: #000000;">; </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> __set_state(<span style="color: #800080;">$an_array</span><span style="color: #000000;">) { </span><span style="color: #800080;">$obj</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> A; </span><span style="color: #800080;">$obj</span>->var1 = <span style="color: #800080;">$an_array</span>['var1'<span style="color: #000000;">]; </span><span style="color: #800080;">$obj</span>->var2 = <span style="color: #800080;">$an_array</span>['var2'<span style="color: #000000;">]; </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$obj</span><span style="color: #000000;">; } } </span><span style="color: #800080;">$a</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> A; </span><span style="color: #800080;">$a</span>->var1 = 5<span style="color: #000000;">; </span><span style="color: #800080;">$a</span>->var2 = 'foo'<span style="color: #000000;">; </span><span style="color: #0000ff;">eval</span>('$b = ' . <span style="color: #008080;">var_export</span>(<span style="color: #800080;">$a</span>, <span style="color: #0000ff;">true</span>) . ';'<span style="color: #000000;">); </span><span style="color: #008000;">/*</span><span style="color: #008000;"> object(A)[2] public 'var1' => int 5 public 'var2' => string 'foo' (length=3) </span><span style="color: #008000;">*/</span> <span style="color: #008080;">var_dump</span>(<span style="color: #800080;">$b</span><span style="color: #000000;">); </span>?>