PHPのマジックメソッド

WBOY
リリース: 2016-08-08 09:30:10
オリジナル
1082 人が閲覧しました

PHP マジック メソッド: <br>

__construct()、__destruct()、__call()、__callStatic()、__get()、__set()、__isset()、__unset()、__sleep()、__wakeup()、 __toString()、__invoke()、__set_state()、__clone()、__debugInfo() などのメソッドは、PHP では「マジック メソッド」と呼ばれます。マジック機能を使用しない限り、独自のクラス メソッドに名前を付けるときにこれらのメソッド名を使用することはできません。 <br>

__construct(),类的构造函数
__destruct(),类的析构函数
__call(),在对象中调用一个不可访问方法(私有或者不存在)时调用
__callStatic(),用静态方式中调用一个不可访问方法时调用
__get(),获得一个类的成员变量时调用
__set(),设置一个类的成员变量时调用
__isset(),当对不可访问属性调用isset()或empty()时调用
__unset(),当对不可访问属性调用unset()时被调用。
__sleep(),执行serialize()时,先会调用这个函数
__wakeup(),执行unserialize()时,先会调用这个函数
__toString(),类被当成字符串时的回应方法
__invoke(),调用函数的方式调用一个对象时的回应方法
__set_state(),调用var_export()导出类时,此静态方法会被调用。
__clone(),当对象复制完成时调用
ログイン後にコピー

__construct() と __destruct()<br> コンストラクター __construct() はオブジェクトの作成時に呼び出され、デストラクター __destruct() はオブジェクトの消滅時に呼び出されます

<?php &#160;
class ConDes
{
&#160;&#160;&#160; protected $a = &#39;&#39;;

&#160;&#160;&#160; function __construct(){
&#160;&#160;&#160;&#160;&#160;&#160;&#160; echo &#39;在构造函数中<br>';
    }

    function __destruct(){

        echo '在析构函数中<br>';
    }
}

$val = new ConDes();
unset($val);

?><pre name="code" class="php">
ログイン後にコピー
ログイン後にコピー
出力:

コンストラクター内とデストラクター内

オブジェクト内でアクセスできないメソッドが呼び出された場合、__call() と __callStatic() が呼び出されます。後者は静的メソッドです。

出力:

配列 (サイズ = 2)<br> 0 => 文字列 'オブジェクト コンテキスト内' (長さ = 17)<br> 1 => 文字列 '別の引数' (長さ = 11)<br> オブジェクト メソッド runTest とオブジェクト コンテキスト内の別の引数<br>静的メソッド runTest と静的コンテキスト内

__get()、__set()、__isset() および __unset()<br>これら 2 つの関数は、アクセスできないクラス メンバー変数を取得するとき、またはアクセスできないクラス メンバー変数を設定するときに呼び出されます。 <br>

出力:

__set<br>配列 (サイズ=1)<br> 'a' => 文字列 'aaaa' (長さ=4)<br>__get<br>配列 (サイズ=1)<br> 'a' => 文字列 'aaaa' (長さ=4) <br>__isset<br>set<br>__unset

__sleep()と__wakeup()<br>serialize()とunserialize()を実行すると、これら2つの関数が最初に呼び出されます。たとえば、オブジェクトをシリアル化する場合、そのオブジェクトにはデータベース リンクが含まれており、逆シリアル化中にリンク状態を復元したい場合は、これら 2 つの関数を再構築することでリンクを復元できます。

<code><span></span>

<?php  
class MethodTest  
{
    public function __call ($name, $arguments) {
    var_dump($arguments);
        echo "object method $name and ".implode(',',$arguments)."<br>";
    }

    public static function __callStatic ($name, $arguments) {
        echo "static method $name and ".implode(',',$arguments)."<br>";
    }
}

$obj = new MethodTest;
$obj->runTest('in object context','another arg');
MethodTest::runTest('in static context');  
?>
ログイン後にコピー
出力: <span>array (size=4)<br>  0 => string '1' (length=1)<br>  'id' => string '1' (length=1)<br>  1 => string 'm0sh1' (length=5)<br>  'username' => string 'm0sh1' (length=5)<br>sleep<br>wakeup<br>object(Connection)[2]<br>  public 'link' => resource(6, mysql link)<br>  private 'server' => string 'localhost' (length=9)<br>  private 'username' => string 'moshi' (length=4)<br>  private 'password' => string 'moshi' (length=5)<br>  private 'db' => string 'test' (length=4)<br>array (size=4)<br>  0 => string '1' (length=1)<br>  'id' => string '1' (length=1)<br>  1 => string 'm0sh1' (length=5)<br>  'username' => string 'm0sh1' (length=5)</span>

<span>__toString()<br>对象当成字符串时的回应方法。例如使用echo $obj;</span>

<code><span></span>

配列 (size=4)

0 => 文字列 '1' (length=1)<code><span></span><code><span></span> 'id' => 文字列 'm0sh1' (length=5)

'username' => string 'm0sh1' (length=5)

sleep<br>wakeup

object(Connection)[2]

public 'link' => resource(6, mysql link)<br> private 'サーバー' => 文字列 'localhost' (長さ=9)

プライベート 'ユーザー名' => 文字列 'moshi' (長さ=4)<br> プライベート 'パスワード' => 文字列 'moshi' (長さ=5) 'db' => 文字列 'test' (長さ = 4)

配列 (サイズ = 4)<br> 0 => 文字列 '1' (長さ = 1)<br> 'id' => 文字列 '1' (長さ = 1)

1 => 文字列 'm0sh1' (長さ=5)

'ユーザー名' => 文字列 'm0sh1' (長さ=5)<br><br>

__toString()<br>オブジェクトを文字列として扱う場合のレスポンスメソッド。たとえば、 echo $obj;<br><br><br><br><br>

<?php
class MethodTest  
{
    private $data = array();
    private $a = &#39;&#39;;
    public $bbb = &#39;&#39;;

    public function __set($name, $value){
        $this->data[$name] = $value;
		echo '__set';
		var_dump($this->data);
    }

    public function __get($name){
		echo '__get';
		var_dump($this->data);
        if(array_key_exists($name, $this->data))
            return $this->data[$name];
        return NULL;
    }

    public function __isset($name){
		echo '__isset';
        return isset($this->data[$name]);
    }

    public function __unset($name){
		echo '__unset';
        unset($this->data[$name]);
    }
}

$in = new MethodTest();
$in->a = 'aaaa';
$aaa = $in->a;
$res = isset($in->c)? 'set':'not set';
echo '<br>'.$res.'<br>';
unset($in->a);
?>
ログイン後にコピー
を使用して出力します。

<br>

<br>

これはオブジェクトです<br>このメソッドは文字列のみを返すことができ、このメソッドでは例外をスローできません。そうでない場合は、致命的なエラーが発生します。

<br><br>__invoke()

関数呼び出しでオブジェクトを呼び出す際のレスポンスメソッド。

rree

出力:

in invoke

boolean true🎜boolean false🎜🎜__set_state()🎜この静的メソッドは、クラスをエクスポートするために var_export() が呼び出されるときに呼び出されます。 🎜🎜
<?php
class Connection {
&#160;&#160;&#160; public $link;
&#160;&#160;&#160; private $server, $username, $password, $db;
&#160;&#160; &#160;
&#160;&#160;&#160; public function __construct($server, $username, $password, $db)
&#160;&#160;&#160; {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; $this->server = $server;
        $this->username = $username;
        $this->password = $password;
        $this->db = $db;
        $this->connect();
    }
    
    private function connect()
    {
        $this->link = mysql_connect($this->server, $this->username, $this->password);
        mysql_select_db($this->db, $this->link);
    }
    
    public function __sleep()
    {
    echo 'sleep<br>';
        return array('server', 'username', 'password', 'db');
    }
    
    public function __wakeup()
    {
    echo 'wakeup<br>';
        $this->connect();
    }
}


$a = new Connection('localhost','mosi','moshi','test');
$sql = 'select id,username from user limit 1';
$res = mysql_query($sql,$a->link);
$res = mysql_fetch_array($res);
var_dump($res);

$sres = serialize($a);
mysql_close($a->link);
//unset($a);

$unsres = unserialize($sres);
var_dump($unsres);
$sql = 'select id,username from user limit 1';
$ress = mysql_query($sql,$unsres->link);
$ress = mysql_fetch_array($ress);
var_dump($ress);


?>
ログイン後にコピー
🎜出力: 🎜🎜object(A)[1]🎜 public 'var1' => int 5🎜 public 'var2' => (length=3)🎜A::__set_state(array( 'var1' => 5, 'var2' => 'foo', ))🎜object(A)[2]🎜 public 'var1' => string 'var11' (length=5)🎜 public 'var2' => string 'foo' (length=3)🎜🎜__clone()🎜 オブジェクトのコピーが完了すると呼び出されます。 🎜rree🎜出力: 🎜等しい🎜クローンは許可されていませんエラー: 256🎜🎜🎜PHP マジック定数: ここで紹介します🎜🎜 🎜 上記では、関連するコンテンツも含めて PHP の魔法のメソッドを紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。 🎜 🎜 🎜
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート