方法一: __contruct()
作用:在每次类被实例化的时候被调用
<?php
class Index
{
//魔术方法 __contruct
public function __construct()
{
echo "123";
}
}
$index= new Index();
//执行结果 页面显示123
方法二:__call($function_name,$args)
作用:在对象中调用一个不可访问方法时调用
该方法有两个参数
functionname:不可访问的方法名称
args : 对不可访问的方法传入的参数值
class Index
{
public function __call($function_name,$args = array())
{
echo $function_name . "<br />" . json_encode($args);
}
private function aa(){}
}
$index= new Index();
$index->aa(123,456,"111");
方法三 : __toString()
作用 : 类被当成字符串时的回应方法, 输出的内容需要返回
<?php
class Index
{
public function __toString()
{
return "aaaa";
}
}
$index= new Index();
echo $index;
方法四 : __destruct()
作用 : 类的析构函数
析构方法允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件、释放结果集等。
一般来说,析构方法在PHP中并不是很常用,它属类中可选择的一部分,通常用来完成一些在对象销毁前的清理任务。
<?php
class Index
{
public function __destruct()
{
echo "bbbbbb";
}
}
$index= new Index();
unset($index); //销毁上面创建的对象$Person
方法五 : __get()
作用 : 获得一个类的成员变量时调用
在 php 面向对象编程中,类的成员属性被设定为 private 后,如果我们试图在外面调用它则会出现“不能访问某个私有属性”的错误。那么为了解决这个问题,我们可以使用魔术方法 __get()。
$fieldName : 不能直接方法的属性名
<?php
class Index
{
private $age = 22;
public function __get($fieldName)
{
return $this->$fieldName;
}
}
$index= new Index();
echo $index->name;
方法六:__set()
作用 : 设置一个类的成员变量时调用
__set(
property,
value )` 方法用来设置私有属性, 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值。
<?php
class Index
{
private $name;
public function __set($fieldName,$value)
{
$this->$fieldName = $value;
}
public function getName()
{
return $this->name;
}
}
$index= new Index();
$index->name = "谭勇";
echo $index->getName();
方法七 : __isset()
作用 : 当对不可访问属性调用isset()或empty()时调用
在看这个方法之前我们看一下isset()函数的应用,isset()是测定变量是否设定用的函数,传入一个变量作为参数,如果传入的变量存在则传回true,否则传回false。
那么如果在一个对象外面使用isset()这个函数去测定对象里面的成员是否被设定可不可以用它呢?
分两种情况,如果对象里面成员是公有的,我们就可以使用这个函数来测定成员属性,如果是私有的成员属性,这个函数就不起作用了,原因就是因为私有的被封装了,在外部不可见。那么我们就不可以在对象的外部使用isset()函数来测定私有成员属性是否被设定了呢?当然是可以的,但不是一成不变。你只要在类里面加上一个__isset()方法就可以了,当在类外部使用isset()函数来测定对象里面的私有成员是否被设定时,就会自动调用类里面的__isset()方法了帮我们完成这样的操作。
__isset()的作用:当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
<?php
class Index
{
private $age = 22;
public function __isset($fieldName)
{
echo $fieldName;
}
}
$index= new Index();
if(isset($index->age))
{
}
方法八 : __unset()
作用 : 当对不可访问属性调用unset()时被调用。
看这个方法之前呢,我们也先来看一下 unset() 函数,unset()这个函数的作用是删除指定的变量且传回true,参数为要删除的变量。
那么如果在一个对象外部去删除对象内部的成员属性用unset()函数可以吗?
这里自然也是分两种情况:
1、 如果一个对象里面的成员属性是公有的,就可以使用这个函数在对象外面删除对象的公有属性。
2、 如果对象的成员属性是私有的,我使用这个函数就没有权限去删除。
虽然有以上两种情况,但我想说的是同样如果你在一个对象里面加上__unset()这个方法,就可以在对象的外部去删除对象的私有成员属性了。在对象里面加上了__unset()这个方法之后,在对象外部使用“unset()”函数删除对象内部的私有成员属性时,对象会自动调用__unset()函数来帮我们删除对象内部的私有成员属性。
<?php
class Index
{
private $age = 22;
public function __unset($fieldName)
{
echo $fieldName;
}
}
$index= new Index();
unset($index->age);
方法九 : __sleep()
serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,则该方法会优先被调用,然后才执行序列化操作。
此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。
如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。
注意:
__sleep() 不能返回父类的私有成员的名字。这样做会产生一个 E_NOTICE 级别的错误。可以用 Serializable 接口来替代。
作用:
__sleep() 方法常用于提交未提交的数据,或类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,这个功能就很好用。
<?php
class Index
{
public $name = "谭勇";
public function __sleep()
{
echo "我被执行了";
return array('name'); // 这里必须返回一个数值,里边的元素表示返回的属性名称
}
}
$index= new Index();
echo serialize($index);
方法十 : __wakeup()
作用 : 执行unserialize()时,先会调用这个函数
如果说 __sleep() 是白的,那么 __wakeup() 就是黑的了。
那么为什么呢?
因为:
与之相反,unserialize()
会检查是否存在一个 __wakeup()
方法。如果存在,则会先调用 __wakeup
方法,预先准备对象需要的资源。
作用:
__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。
<?php
header("content-type:text/html;charset=utf-8");
class Index
{
public $name = "谭勇";
public function __sleep()
{
echo "我被执行了";
return array('name'); // 这里必须返回一个数值,里边的元素表示返回的属性名称
}
public function __wakeup()
{
echo "我是__wakeup";
$this->name="勇哥";
}
}
$index= new Index();
$a = serialize($index);
$aindex = unserialize($a);
echo $aindex->name;
方法十一 : __invoke()
作用 : 调用函数的方式调用一个对象时的回应方法
当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
注意:
本特性只在 PHP 5.3.0 及以上版本有效。
<?php
header("content-type:text/html;charset=utf-8");
class Index
{
public function __invoke()
{
echo "我是一个对象";
}
}
$index= new Index();
$index();
方法十二 : __clone()
作用 : 当对象复制完成时调用
在多数情况下,我们并不需要完全复制一个对象来获得其中属性。但有一个情况下确实需要:如果你有一个 GTK 窗口对象,该对象持有窗口相关的资源。你可能会想复制一个新的窗口,保持所有属性与原来的窗口相同,但必须是一个新的对象(因为如果不是新的对象,那么一个窗口中的改变就会影响到另一个窗口)。还有一种情况:如果对象 A 中保存着对象 B 的引用,当你复制对象 A 时,你想其中使用的对象不再是对象 B 而是 B 的一个副本,那么你必须得到对象 A 的一个副本。
作用:
对象复制可以通过 clone 关键字来完成(如果可能,这将调用对象的 __clone() 方法)。对象中的 __clone() 方法不能被直接调用。
语法:
$copy_of_object = clone $object;
注意:
当对象被复制后,PHP 5 会对对象的所有属性执行一个浅复制(shallow copy)。所有的引用属性 仍然会是一个指向原来的变量的引用。
当复制完成时,如果定义了 __clone() 方法,则新创建的对象(复制生成的对象)中的 __clone() 方法会被调用,可用于修改属性的值(如果有必要的话)。
<?php
header("content-type:text/html;charset=utf-8");
class Index
{
public function __clone()
{
echo "你正在克隆我";
}
}
$index= new Index();
$index_1 = clone $index;