1、__tostring()
当输出变量时,自动调用,需要一个return;
<?php
class Person{
private $name = "";
function __construct($name = ""){
$this->name = $name;
}
function __tostring(){//在类中定义一个__toString方法
return "Hello,".$this->name."!<br/>";
}
}
$WBlog = new Person('WBlog');
echo $WBlog;//直接输出对象引用则自动调用了对象中的__toString()方法
?>
2、__call($funcname,$args)
当类调用一个不存在的函数时会自动调用,参数有两个$funcname为不存在的方法的函数名,$args为该函数的参数
<?php
class Person{
private $name = "";
function __construct($name = ""){
$this->name = $name;
}
function __call($funcname,$args)
{
echo "你所调用的函数:$funcname(参数:<br />";
var_dump($args);
echo ")不存在!";
}
}
$WBlog = new Person('WBlog');
$WBlog->funcA(1,2,3,4,5,6);
?>
3、__clone()
当复制一个类时,复制出来的类会自动调用此方法,此方法相当于复制出来的类的构造函数__construct(),如果在__clone中使用$this来获取属性,$this指的时复制出来的类,而不是原本的类
<?php
class Person{
private $name = "";
function __construct($name = ""){
$this->name = $name;
}
function __clone()
{
$this->name = "李四";//将name重新赋值为李四$this指的是复制出来的类$p1
}
function say()
{
echo "你好我是{$this->name}<br>";
}
}
$WBlog = new Person('WBlog');
$p1 = clone $WBlog;//复制出一个新的类,__clone自动调用了
$WBlog->say();
$p1->say();
?>
这个函数只能在类外使用,当我们在一个文件里面要使用到别的类的时候,这个类就会自动执行,这样可以减少代码量并且提高写代码的速度
test.php
<?php
function __autoload($classname)
{
echo $classname;
include($classname.'.php');
}
class Person{
private $name = "";
function __construct($name = ""){
$this->name = $name;
}
function __clone()
{
$this->name = "李四";//将name重新赋值为李四$this指的是复制出来的类$p1
}
function say()
{
echo "你好我是{$this->name}<br>";
}
}
$one = new One();
?>
One.php
<?php
class One
{
function __construct()
{
echo "1111111111111111";
}
}
?>
5、__sleep()与_weakup()
__sleep()是在一个对象串行化的时候调用的函数,这个函数可以使得串行化的时候可以部分串行化
__weakup()则是一个对象反串行化时调用的函数。
例如下面有一个例子。
Person类
<?php
class Person{
public $name = "";
public $age = "";
public $word = "";
function __construct($name,$age,$word){
$this->name = $name;
$this->age = $age;
$this->word = $word;
}
function say()
{
echo "你好我是{$this->name}<br>我的年龄是{$this->age}<br>我的工作是{$this->word}";
}
}
?>
write类//将person类串行化保存成一个文本
<?php
function __autoload($className)
{
include $className.'.php';
}
$p = new Person("张三",10,"程序猿");
$str = serialize($p);//将$p这个类串行化
file_put_contents("db.txt",$str);
?>
read类//把文本反串行化为一个类
<?php
function __autoload($className)
{
include $className.'.php';
}
$str = file_get_contents("db.txt");//从文件中读取出串行化后的数据
$p = unserialize($str);//将$p这个类反串行化
$p->say();
/*输出
你好我是张三
我的年龄是10
我的工作是程序猿
*/
?>
如果我们想只保存姓名和年龄不想保存职业,那么我们可以使用__sleep()进行处理
增加__sleep后的Person类
<?php
class Person{
public $name = "";
public $age = "";
public $word = "";
function __construct($name,$age,$word){
$this->name = $name;
$this->age = $age;
$this->word = $word;
}
function say()
{
echo "你好我是{$this->name}<br>我的年龄是{$this->age}<br>我的工作是{$this->word}";
}
function __sleep()
{
return array("name", "age");
}
}
?>
最后read()只会输出
你好我是张三
我的年龄是10
我的工作是
如果我们想read输出的时候年龄增加一岁
<?php
class Person{
public $name = "";
public $age = "";
public $word = "";
function __construct($name,$age,$word){
$this->name = $name;
$this->age = $age;
$this->word = $word;
}
function say()
{
echo "你好我是{$this->name}<br>我的年龄是{$this->age}<br>我的工作是{$this->word}";
}
function __sleep()
{
return array("name", "age");
}
function __wakeup()
{
$this->age += 1;
}
}
?>
最后read输出的结果
你好我是张三
我的年龄是10
我的工作是