Rumah php教程 php手册 php __call __autoload __clone __toString __sleep

php __call __autoload __clone __toString __sleep

Jun 02, 2016 am 09:14 AM

1、__call

__call( $method, $arg_array ) 当调用一个未定义的方法是调用此访求,php5 的对象新增了一个专用方法 __call(),这个方法用来监视一个对象中的其它.

方法:如果你试着调用一个对象中不存在的方法,__call 方法将会被自动调用.

__call实例方法代码如下:

1

2

3

4

5

6

7

8

9

<?php

class foo {

  function __call($name,$arguments) {

    print("did you call me? i&#39;m $name!");

  }

}

$x = new foo();

$x->dostuff();

$x->fancy_stuff();

Salin selepas log masuk

这个特殊的方法可以被用来实现"过载(overloading)"的动作,这样你就可以检查你的参数并且通过调用一个私有的方法来传递参数.

1

2

3

4

5

6

7

2、__autoload

__autoload 函数,它会在试图使用尚未被定义的类时自动调用,看下面的实例,写好了一个msyql类,mysql.php:

class mysql{ 

     funciton __construct(){ 

      ............ 

    

}

Salin selepas log masuk

现在我在index.php页面要用到mysql 类,我就这样,代码如下:

1

2

3

4

5

function __authload($class){ 

    include_once("path".$class.".php"); 

}

$mysql=new mysql();

include_once("path/".$class.".php");

Salin selepas log masuk

path/ 是类文件所在路径

$class 就是调用时的类名啦

后面的.php 当然是扩展名啦,一个类文件可能感觉不到有多好用,如果类文件很多的时候,每个类都要include一下,那太麻烦了,只要每个页面之前写一个 __autoload() 即可,通过调用此函数,脚本引擎在 php 出错失败前有了最后一个机会加载所需的类.

3、__construct、__destruct

构造函数与析构函数[__construct __destruct()],他在类class中的作用是初始化与销毁变量下面我们来看看实例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

class db

{

  function __construct()

  {            

        

    $this->mconnid=mysql_connect ($this->dbhost,$this->dbuser,$this->dbpwd);//建立连接

        mysql_select_db($this->dbname, $this->mconnid);    //选择数据库

        mysql_query("set names &#39;gbk&#39;");//设置数据库教程编码为gbk

    }

      

    //__destruct:析构函数,断开连接

    function __destruct()

    {

        mysql_close($this->mconnid); //此处还有问题......

    }

}

Salin selepas log masuk

这时我们在用时就不需要考虑数据连接与关闭了,只要$aa = new db();就ok了.

4、__clone

__clone魔术方法,我们知道对象是可以直接赋值的,比如

$p2 = $p1;//这里是一个对象有两个引用,那么我执行:$p1->say();$p2->say();是都可以执行的,而且效果一样.

我们还有一种方法:$p3 = clone $p1;//注意clone是克隆关键字,这里与上面的不同是$p3是一个新的对象,同时我们在类里加入一个方法:

1

2

3

4

function __clone()

{

    $this->name = "我是副本"//注意:这里的$this是克隆产生的对象本身,不    是当前类

}

Salin selepas log masuk

//然后我们执行:$p3->say();

//打印出:name:我是副本 age:20

到这里我们明白,__clone()方法是在克隆对象的时候执行的方法,它的作用是对新克隆出来的副本进行属性初始化等操作.

5、__tostring

__tostring方法在将一个对象转化成字符串时自动调用,如果我有一个类:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

class person

{

    private $name = "";

    private $age = 0;

    function __construct($name = "", $age = "")

    {

        $this->name = $name;

        $this->age = $age;

    }

    function say()

    {

        echo "name:".$this->name."<br/>"."age:".$this->age."<br/>";   

    }

}

Salin selepas log masuk

现在我去实例化这个类,然后去打印这个实例:

$p1 = new person("liuzy",20);echo $p1; //直接打印会出错

显然这样直接打印对象是会出现错误的,因为对象是引用句柄,不能直接打印,这时,我们可以用到__tostring()方法,我们在person类里加一个__tostring()方法:

1

2

3

4

function __tostring()

{

    return "i am  person,my name is ".$this->name."<br/>";

}

Salin selepas log masuk

然后再刷新页面,发现什么了?现在我们明白,__tostring()是在直接打印对象时执行的方法,我们可以用该方法打印类的一些相关信息,注意:是两个下划线,方法必须有返回值.

6、__sleep、__wakeup

__sleep 串行化的时候用,__wakeup 反串行化的时候调用,在php进行序列化时,serialize() 检查类中是否有 __sleep(),如果有,则该函数将在任何序列化之前运行,该函数必须返回一个需要进行序列化保存的成员属性数组,并且只序列化该函数返回的这些成员属性.

该函数有两个作用:第一,在序列化之前,关闭对象可能具有的任何数据库连接等,第二,指定对象中需要被序列化的成员属性,如果某个属性比较大而不需要储存下来,可以不把它写进__sleep要返回的数组中,这样该属性就不会被序列化,相反地,unserialize() 从字节流中创建了一个对象之后,马上检查是否具有__wakeup 的函数的存在,如果存在,__wakeup 立刻被调用,使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

<?php

   class user 

   

       public $name

       public $id;

       function __construct() 

       

           $this->id = uniqid();          //give user a unique id 赋予一个不同的id 

       }

       function __sleep() 

       {    

           return(array("name"));        //do not serialize this->id 不串行化id

       }

       function __wakeup() 

       

           $this->id = uniqid();         //give user a unique id

       

   }

   $u = new user; 

   $u->name = "haha";

   $s = serialize($u);                   //serialize it 串行化 注意不串行化id属性,id的值被抛弃

   $u2 = unserialize($s);                //unserialize it 反串行化 id被重新赋值

     

   //$u and $u2 have different ids $u和$u2有不同的id

   var_dump($u);                         

   var_dump($u2);

Salin selepas log masuk

---------- php debug ----------

1

2

3

4

5

6

7

8

9

10

11

12

object(user)#1 (2) {

["name"]=>

string(4) "haha"

["id"]=>

string(13) "47fa045529f69"

}

object(user)#2 (2) {

["name"]=>

string(4) "haha"

["id"]=>

string(13) "47fa04552a49a"

}

Salin selepas log masuk

                         


本文地址:

转载随意,但请附上文章地址:-)

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)