Heim > Backend-Entwicklung > PHP-Tutorial > magische Methode in PHP

magische Methode in PHP

WBOY
Freigeben: 2016-08-08 09:30:10
Original
1082 Leute haben es durchsucht

Magische PHP-Methoden:

__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), Methoden wie __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() und __debugInfo() werden in PHP „Magic-Methoden“ genannt. Sie können diese Methodennamen nicht verwenden, wenn Sie Ihre eigenen Klassenmethoden benennen, es sei denn, Sie möchten deren magische Funktionalität nutzen.

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

__construct() und __destruct()
Der Konstruktor __construct() wird aufgerufen, wenn das Objekt erstellt wird, und der Destruktor __destruct() wird aufgerufen, wenn das Objekt stirbt 🎜>

<?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">
Nach dem Login kopieren
Ausgänge:
Nach dem Login kopieren
Im Konstruktor und im Destruktor

__call() und __callStatic() werden aufgerufen, wenn eine nicht zugängliche Methode im Objekt aufgerufen wird. Letzteres ist eine statische Methode.

Ausgabe:
<?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');  
?>
Nach dem Login kopieren
Array (Größe=2)

0 => Zeichenfolge „im Objektkontext“ (Länge=17)
1 => Zeichenfolge „anderes Argument“ (Länge=11)
Objektmethode runTest und in Objektkontext, ein weiteres Argument
statische Methode runTest und im statischen Kontext

__get(), __set(), __isset() und __unset()

beim Abrufen eines nicht zugänglichen Klassenmitglieds Diese beiden Funktionen werden aufgerufen beim Festlegen einer unzugänglichen Klassenmitgliedsvariablen. <br><br>

Ausgabe:
<?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);
?>
Nach dem Login kopieren
__set

array (size=1)
'a' => string 'aaaa' (length=4)
__get
array (size=1)
'a' = > Zeichenfolge 'aaaa' (Länge=4)
__isset
nicht gesetzt
__unset

__sleep() und __wakeup()

Wenn wir serialize() und unserialize ausführen () werden diese beiden Funktionen zuerst aufgerufen. Wenn wir beispielsweise ein Objekt serialisieren, verfügt das Objekt über eine Datenbankverknüpfung. Wenn wir den Verknüpfungsstatus während der Deserialisierung wiederherstellen möchten, können wir die Verknüpfung wiederherstellen, indem wir diese beiden Funktionen wiederherstellen.

<p><code><span></span>

<?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);


?>
Nach dem Login kopieren
Ausgabe:

<code><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>array (size=4)

0 => string '1' (length=1)

'id' => string '1' (length=1) 1 => string 'm0sh1' (Länge=5)

'username' => string 'm0sh1' (länge=5)

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

object(Connection)[2 ]

public 'link' => resources(6, mysql link)<span></span> private 'server' => string 'localhost' (length=9)

private 'username' => length=4)
<?php  
class TestClass  
{
    public function __toString() {
        return &#39;this is a object&#39;;
    }
}

$class = new TestClass();
echo $class;  
?>
Nach dem Login kopieren
private 'password' => string 'moshi' (length=5)

private 'db' => string 'test' (length=4)<span></span>array (size =4 )<span></span> 0 => Zeichenfolge '1' (Länge=1)

'id' => Zeichenfolge '1' (Länge=1)

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


<?php
class Invoke{
	public function __invoke(){
		echo 'in invoke<br>';
	}
}

class noInvoke{

}

$obj = new Invoke();
$obj();

var_dump(is_callable($obj));

$obj2 = new noInvoke();
//$obj2();
var_dump(is_callable($obj2));
Nach dem Login kopieren

<p>__toString ()<br>Die Antwortmethode, wenn das Objekt als Zeichenfolge behandelt wird. Verwenden Sie beispielsweise echo $obj;<br></p>

<br><br>

<?php  
class A  
{
    public $var1;
    public $var2;
	public static function __set_state ($arr) {
        $obj = new A;
        $obj->var1 = 'var11';
        $obj->var2 = $arr['var2'];
        return $obj;
    }
}

$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';
var_dump($a);  
var_export($a);  

eval('$ress = '.var_export($a,true).';');
var_dump($ress);

?>
Nach dem Login kopieren
, um Folgendes auszugeben:

<br><br>dies ist ein Objekt<br><br>Diese Methode kann nur eine Zeichenfolge zurückgeben und nicht werfen eine Ausnahme in dieser Methode, andernfalls tritt ein schwerwiegender Fehler auf. <br><br>

__invoke()

Die Antwortmethode beim Aufrufen eines Objekts durch Aufrufen einer Funktion.

<?php  
class Singleton {  
    private static $_instance = NULL;

    // 私有构造方法 
    private function __construct() {}

    public static function getInstance() {
        if (is_null(self::$_instance)) {
            self::$_instance = new Singleton();
        }
        return self::$_instance;
    }

    // 防止克隆实例
    public function __clone(){
        die('Clone is not allowed error: ' . E_USER_ERROR);
    }
}


$a = Singleton::getInstance();
$b = Singleton::getInstance();

if( $a === $b ){
	echo 'equal<br>';
}

$c = clone $b;
?>
Nach dem Login kopieren
Ausgabe:
in invoke

boolean true
boolean false

__set_state()
Diese statische Methode wird aufgerufen, wenn var_export() aufgerufen wird, um eine Klasse zu exportieren.

Ausgabe:

object(A)[1] public 'var1' => int 5 public 'var2' => string 'foo ' (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() when object Wird aufgerufen Der Kopiervorgang ist abgeschlossen. Ausgabe: gleichKlonen ist nicht zulässig, Fehler: 256PHP Magic-Konstanten: Einführung hier Das Obige hat die magischen Methoden in PHP vorgestellt, einschließlich der relevanten Inhalte. Ich hoffe, dass es für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage