1、一个对象克隆另一个对象的时候,类里边的__clone方法自动执行。
只要一个对象一诞生,就要有初始化的动作。如果副本对象和原来的对象一模一样就会有问题,所以,这个时候需要调用__clone()方法。__clone()里边的$this代表副本中的对象。$that代表原对象。
class A{
public $num = 1;
public function show(){
echo $this->num;//1
}
function __clone(){
echo ++$this->num;//2
}
}
$a = new A();
$b = $a;
echo intval($a===$b);//1
echo $a->show();
$b = clone $a;
//echo intval($a===$b);//0,内容虽然一样,但是在内存中的地址不同
2、实例化的对象不可以直接用echo输出,但是如果类中有__toString方法,就可以输出相应的信息。
class B{
private $host;
private $dbname;
private $user;
private $pwd;
function __construct($host,$dbname,$user,$pwd){
$this->host = $host;
$this->dbname = $dbname;
$this->user = $user;
$this->pwd = $pwd;
}
public function connect(){
echo '连接数据库';
}
public function gettable(){
echo '获得表名';
}
public function insert(){
echo '插入数据库';
}
function __toString(){
$method = get_class_methods(__CLASS__);//获得当前类的所有方法(数组形式)
$methodString = implode('、',$method);
//return $methodString;//__construct、connect、gettable、insert、__toString
$vars = get_object_vars($this);//获得当前对象的所有属性(数组形式)
$varsString = implode('、',$vars);
return $varsString;//localhost、mydb、admin、admin
}
}
$b = new B('localhost','mydb','admin','admin');
echo $b;//如果类中没有__toString方法会报错
如果没有toString()方法,直接输出对象对发生致命性错误。
输出对象时应注意:echo或print_r函数后面直接跟输出的对象,中间不要加其他多余的字符,否则__toString()方法不会被执行,例如这种情况:echo '输出对象'.$obj;
3、实例化的对象执行没有定义的方法或无权限访问的方法会报错,但是通过__call方法可以避免报错,并输出一些提示信息!
class C{
public function show(){
echo 'show';
}
function __call($methodName/*方法名*/,$args/*参数*/){
echo $methodName;
}
}
$c = new C();
$c->go();
4、__get():当我们调用一个权限上不允许调用的属性或不存在的属性时,__get魔术方法会自动调用,并且自动传参,参数值是属性名。
class Person{
public $name = 'fxxy';
protected $age = 23;
private $sex = 'man';
function __get($var){
echo '你想访问我的'.$var.'属性';
}
}
$person = new Person();
echo $person->name;//fxxy
echo $person->age;//你想访问我的age属性
echo $person->sex;//你想访问我的sex属性
echo '<pre/>';
print_r($person);
5、__set():当我们给一个权限上不允许直接访问或者是不存在的属性设置属性值时,__set魔术方法会自动调用,并且自动传参,第一个参数数属性名,第二个参数是属性值。
class Person{
public $name;
protected $age;
private $sex;
public function __set($a,$b){
echo '你想给我的'.$a.'赋值'.'并且值是'.$b.'<br/>';
}
}
$person = new Person();
$person->name = 'fxxy';//fxxy
$person->age = '28';//你想给我的age赋值并且值是28
$person->sex = 'man';//你想给我的sex赋值并且值是man
echo $person->name.'<br/>';
6、用isset()判断某个某个属性属性是否存在时,__isset()自动执行。
用unset()清除一个权限上不允许访问或者是不存在的属性时,__unset()自动执行。
class Person{
public $name = 'fxxy';
protected $age = '28';
private $sex = 'man';
function __isset($a){
echo '你想判断我的'.$a.'值是否存在'.'<br/>';
}
function __unset($b){
echo '你想删除我的'.$b.'属性值'.'<br/>';
}
}
$person = new Person();
if(isset($person->name)){
echo $person->name.'<br/>';
}
if(isset($person->sex)){
echo '有这个值'.'<br/>';
}else{
echo '没有这个值'.'<br/>';
}
unset($person->age);
/*
//运行结果如下:
fxxy
你想判断我的sex值是否存在
没有这个值
你想删除我的age属性值
*/
7、__sleep():在使用serialize()函数时,如果实例化的对象包含__sleep()方法,则会先执行__sleep()方法,这个方法返回一个数组,数组元素就是类属性,可以包括全部的类属性,也可以随便包括其中的几个。
__wakeup():unserialize()函数可以重新还原一个被serialize()函数序列化的对象,__wakeup()方法则是恢复在序列中可能丢失的数据库连接及相关工作!
class Person{
public $name;
public $sex;
private $age;
public function __construct($name,$sex,$age){
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
public function __sleep(){
return array('name','age');
}
public function __wakeup(){
$age+=1;
return $this->name;
}
}
$person = new Person('fxxy','man',28);
$p1 = serialize($person);
echo $p1.'<br/>';
$p2 = unserialize($p1);
echo $p2->name;
因为对象是存储在内存中的,为了提高程序运行效率,当某个对象使用完成之后,就会被垃圾回收机制回收,所以它不可能永久的保存在内存中,这样的话如果其他页面也需要用到这个对象,就比较困难了,这个时候可以把对象利用serialiaze()方法序列化,然后保存在到一个或数据库中,这样的话其他页面就可以随时调用了,然后想要删除这个序列化的对象也是很简单的。
8、__autoload()方法:
其他的魔术方法都是在类中添加起作用,这是一个唯一不在类中添加的方法。
只要在页面中使用到一个类,只要用到类名,就会自动将类名传给__autoload()的参数。
这里用到4个文件:test.php、OneAction.class.php、TwoAction.class.php、ThreeAction.class.php。
test.php文件中的代码是:
function __autoload($className){
include $className.'.class.php';
}
$one = new OneAction();
$two = new TwoAction();
$three = new ThreeAction();
OneAction.class.php文件中的代码是:
<?php
class OneAction{
public function __construct(){
echo 'oneAction'.'<br/>';
}
}
?>
TwoAction.class.php文件中的代码是:
<?php
class TwoAction{
public function __construct(){
echo 'twoAction'.'<br/>';
}
}
?>
ThreeAction.class.php文件中的代码是:
<?php
class ThreeAction{
public function __construct(){
echo 'threeAction'.'<br/>';
}
}
?>
需要注意的是:__autoload()方法中的参数是类名,当本脚本中实例化对象的时候找不到某个类,就会自动调用autoload魔术方法,所以魔术方法内部的inlude文件地址与类的名称要相对应!
- 0、php安装
- 1、选择PHP作为首选后端语言的原因
- 2、PHP基本语法
- 3、PHP中变量和常量的区别
- 4、PHP中单引号和双引号的区别
- 5、PHP检测数据类型的几种方式
- 6、PHP数据类型转换
- 7、return、break、continue的区别
- 8、PHP代码重用
- 9、字符串移除或添加函数
- 10、PHP中字符串大小写切换以及翻转和加密
- 11、PHP字符串截取和截取函数
- 12、PHP字符串替换和比较函数
- 13、PHP字符串url解析和实体转换
- 14、addslashes在预定义字符串前添加反斜杠
- 15、PHP中的数组基本概念
- 16、数组函数implode、explode、in_array、each、list
- 17、PHP数组函数(count、reset、end、next、current、key)
- 18、ZendStudio软件破解安装包免费下载
- 19、【图文】ZendStudio汉化方法
- 20、数组函数in_array、array_search、array_change_key_case、array_chu
- 21、关闭PHP提示的方法(运行出现Notice : Use of undefined constant 的完美解决方案
- 22、PHP数组函数(array_diff_ukey、array_diff_uassoc、array_intersect
- 23、PHP数组函数(array_fill、array_filter、array_flip、array_key_exis
- 24、PHP数组去重及向前向后删除元素的函数
- 25、PHP数组函数(array_map、array_walk、array_walk_recursive)
- 26、PHP数组函数(compact、extract)
- 27、PHP数组函数(array_merge、array_merge_recursive)
- 28、PHP数组函数(range、array_count_values、array_product)
- 29、PHP数组函数(array_reduce、array_slice、array_splice、array_sum)
- 30、PHP数组排序函数总结
- 31、PHP中面向对象的基本概念及定义对象的方法
- 32、PHP创建对象与构造函数
- 33、PHP对象的释放
- 34、PHP面向对象的特性(抽象、封装、继承、多态)
- 35、PHP面向对象的public、private、protected之间的区别
- 36、PHP面向对象中的final和const的用法
- 37、PHP面向对象的static关键字
- 38、PHP中的单例模式
- 39、$this、self、parent详解
- 40、PHP中面向对象的抽象类和抽象方法
- 41、PHP面向对象中的接口interface
- 42、PHP面向对象中的魔术方法
- 43、面向对象方法get_object_vars、is_subclass_of、interface_exists
- 44、PHP中的数学函数方法总结
- 45、PHP文件处理disk_total_space、disk_free_space、dirname、file_exis
- 46、PHP目录操作rename和scandir
- 47、PHP操作目录opendir、readdir、glob
- 48、PHP打开fopen、读取fread、写入文件fwrite
- 49、PHP文件处理file_get_contents、file_put_contents、fgetc、fgets、fg
- 50、PHP截取字符串出现乱码的解决方法(UTF8和GBK)
- 51、PHP文件内容分页操作,避免乱码
- 52、PHP文件操作函数file、set_include_path、copy
- 53、PHP文件操作函数filemtime、filectime、fileatime、touch
- 54、PHP文件操作指针函数feof、ftell、fseek、rewind、fpassthru
- 55、PHP文件操作pathinfo、realpath、flock、tempnam、tmpfile
- 56、设置php.ini配置实现表单文件上传流程
- 57、PHP将上传到临时文件夹的文件移动到服务器指定文件夹内
- 58、PHP+input表单实现多文件上传
- 59、PHP通过超链接实现文件下载
- 60、发送header文件头信息实现文件下载
- 61、PHP中的日期时间_时区时间戳函数使用
- 62、PHP操作COOKIE缓冲区影响COOKIE传递方式
- 63、PHP中SESSION定义、建立、删除方式
- 64、PHP.INI配置文件中关于session的设置
- 65、HP中Session缓存的概念与用法
- 66、PHP自定义Session处理机制
- 67、通过MYSQL数据库操作Session会话完整源码类
- 68、PHP连接数据库实现分页代码
- 69、HTTP缓存实现原理详解
- 70、PHP连接数据库实现搜索+分页功能
- 71、PHP图像处理之建立画布填充颜色、打开不同图像类型处理
- 72、PHP颜色或图像填充及不同填充方式
- 73、PHP图像处理之画线&定义线样式&宽度&风格&笔刷
- 74、PHP图像处理:绘制色素及矩形图
- 75、PHP图像处理之画圆、弧线、网站饼状统计图绘制
- 76、PHP图像处理之绘制多边行及文字绘制
- 77、PHP 图像处理之获得文字宽高属性&图片水印函数功能
- 78、PHP生成图片验证码demo【OOP面向对象版本】
- 79、PHP图像处理 图像处理之处理文字及获得文字尺寸属性,imagecopymerge imagecop
- 80、替换用户输入的QQ表情
- 81、PHP封装MYSQL数据库操作类源码
- 82、PHP与XML技术结合使用解析