对象直接赋值,新变量保存的是对象的引用。
例:
class a{
public $number;
}
$b = new a();
$c = $b;
$b->number = 1234;
echo $c->number;
结果:
1234
如果使用clone关键字,则进行深复制。
__clone函数时当执行对象复制时自动执行的函数,类似于__construct。
function __clone(){
echo "clone<br/>";
}
$e = clone $b;
echo intval($e===$b);
结果:
clone
0
__toString()是在直接打印对象时执行的方法,我们可以用该方法打印类的一些相关信息,该方法必须有返回值。
get_class_methods(__CLASS__) 获得当前类的方法。
get_object_vars($this) 获得当前对象的属性。
__call() 在调用方法不存在的方法时执行。
例:
class x{
function _x(){
echo "xxxxxx";
}
function __call($methodName,$args){ //$methodName为调用的方法名,args为包含所有参数的数组.
echo "方法名:".$methodName."<br/>";
echo "调用参数:<br/>";
print_r($args);
echo "<br/>方法不存在";
}
}
$y = new x();
$y->_x1(1,2,3,4,5); //调用不存在的方法,这时__call()会运行.
结果:
方法名:_x1
调用参数:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )
方法不存在
__isset() 当外部调用isset()函数时执行。
例:
class Person{
private $name,$age,$money;
function __construct($name='', $age='', $money=''){
$this->name = $name;
$this->age = $age;
$this->money = $money;
}
function __isset($var){
$array = array("name", "age");
if(in_array($var, $array)){
echo $var."属性存在,值为:".$this->$var."<br/>";
}elseif(in_array($var,array_keys(get_object_vars($this)))){
echo "不允许检测私有属性<br/>";
}else{
echo "属性不存在<br/>";
}
}
}
$lisi = new Person("李四", 22, 15000);
isset($lisi->name);
isset($lisi->age);
isset($lisi->money);
结果:
name属性存在,值为:李四
age属性存在,值为:22
不允许检测私有属性
__unset() 在外部调用unset()函数时执行。使用方法类似__isset()。
serialize()函数:序列化除resource外的任何类型。对象序列化时只保存属性,不保存方法。实现跨文件访问。
unserialize()函数:反序列化,即将序列化字符串还原为序列化之前的状态。
__wakeup() 在对象反序列化时自动执行。通过此函数可使对象在序列化与反序列化之后可以自动执行一些重要的方法。例如连接数据库。
__sleep() 可以指定要序列化的内容,以数组方式返回。