热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php__call__autoload__clone__toString__sleep

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

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

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

__call实例方法代码如下:

dostuff(); 
$x->fancy_stuff();

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

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

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

function __authload($class){  
    include_once("path".$class.".php");  
} 
$mysql=new mysql(); 
include_once("path/".$class.".php");

path/ 是类文件所在路径

$class 就是调用时的类名啦

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

3、__construct、__destruct

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

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 'gbk'");//设置数据库教程编码为gbk 
    } 
     
    //__destruct:析构函数,断开连接 
    function __destruct() 
    { 
        mysql_close($this->mconnid); //此处还有问题...... 
    } 
}

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

4、__clone

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

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

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

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

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

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

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

5、__tostring

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

class person 
{ 
    private $name = ""; 
    private $age = 0; 
    function __construct($name = "", $age = "") 
    { 
        $this->name = $name; 
        $this->age = $age; 
    } 
    function say() 
    { 
        echo "name:".$this->name."
"."age:".$this->age."
"; } }

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

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

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

function __tostring() 
{ 
    return "i am  person,my name is ".$this->name."
"; }

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

6、__sleep、__wakeup

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

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

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

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

object(user)#1 (2) { 
["name"]=> 
string(4) "haha" 
["id"]=> 
string(13) "47fa045529f69" 
} 
object(user)#2 (2) { 
["name"]=> 
string(4) "haha" 
["id"]=> 
string(13) "47fa04552a49a" 
}



本文地址:

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

推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
author-avatar
a怪周璇_981
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有