首页 > 代码库 > php--魔术方法

php--魔术方法

PHP 中以两个下划线开头的方法,__construct(), __destruct (), __call(), __callStatic(),__get(), __set(), __isset(), __unset (), __sleep(), __wakeup(), __toString(), __set_state,() __clone() __autoload()等,被称为"魔术方法"Magic methods)。

作用:

魔术方法的引入是对面向对象编程思想的进一步实现,重载就是通过魔术方法来实现的。

 

为了更好的支持面向对象

为了实现向后兼容性,如果 PHP 5 在类中找不到 __construct() 函数并且也没有从父类继承一个的话,它就会尝试寻找旧式的构造函数,也就是和类同名的函数。因此唯一会产生兼容性问题的情况是:类中已有一个名为 __construct() 的方法却被用于其它用途时。

 

<?php
/**
* Created by PhpStorm.
* User: fu
* Date: 2017/7/19
* Time: 14:38
*/

class City{

protected $name;
private $area;

function __construct($name, $area){
$this->name = $name;
$this->area = $area;
}

/**
* __get魔术方法,它是在外部访问该类中不能直接访问的属性时自动被调用
* 魔术方法都有其默认的定义格式,不能随意的更改
* 魔术方法不能被添加static静态的修饰符,除了__callstatic
* __get魔术方法必须有一个返回值
* @param $name 它对应的是类中的被声明的属性的名称,格式为字符串
*/
function __get($name){
// echo ‘我被调用了:‘.$name;
if(isset($this->$name)){
return $this->$name;
}else{
return null;
}
}

/**
* __set魔术方法,在给类中无法直接访问的属性赋值时自动调用
* @param $name 被赋值的类中的属性名称,字符串格式
* @param $value 被赋予的值
*/
function __set($name, $value){
// echo ‘我被调用了:‘.$name.‘===‘.$value;
/*
* property_exists 检测类或者对象中是否包含指定名称的属性
*/
if(property_exists($this, $name)){
$this->$name = $value;
}else{
echo ‘类中没有对应的属性:‘.$name.‘<br>‘;
}
}

function __isset($name){
if(property_exists($this, $name)){
return isset($this->$name);
}
}
function __unset($name){
// echo ‘需要销毁的属性:‘.$name;
if(property_exists($this, $name)){
$this->$name = null;
}else{
unset($this->$name);
}
}



protected function test(){
echo ‘<br>我不能直接访问test函数方法‘;
}
protected function test1($info){
echo ‘<br>获取的信息:‘.$info;
}
private function test2($num1, $num2){
echo ‘<br>计算结果:‘.($num1+$num2);
}

/**
* __call 魔术方法
* @param $name 需要被访问的类中的函数方法的名称, 格式字符串
* @param $arguments 对应的函数方法的参数值, 格式为数组
*/
function __call($name, $arguments){
/*
* method_exists 判断类中是否包含某个指定名称的函数方法
*/
if(method_exists($this, $name)){
// $this->$name();
// call_user_func(array($this, $name), $arguments[0]);
/*
* call_user_func_array 使用它来访问类中的函数方法,参数个数随意
*/
call_user_func_array(array($this, $name), $arguments);
}else {
echo ‘没有找到对应的函数方法<br>‘;
}
}

/**
* __toString魔术方法,当使用字符串的方式来输出类的对象时被自动调用
* 它要求必须返回一个字符串结果
*/
function __toString(){

return ‘<br>城市名称:‘.$this->name.‘,面积:‘.$this->area;
}

/**
* __clone魔术方法,当类的对象被克隆时自动被调用
* 默认的克隆时浅克隆模式
* 该方法可以实现克隆时修改某些属性的值
*/
function __clone(){
echo ‘<br>调用了clone的魔术方法<br>‘;
$this->area = ‘3333平方公里‘;
}

}



$city = new City(‘成都‘, ‘3000平方公里‘);
$city2 = clone $city;
var_dump($city);
echo ‘<br>‘;
var_dump($city2);
echo ‘<br>‘;

//var_dump($city);
//echo ‘<br>‘;
//print_r($city);
//echo ‘<br>‘;
//print $city;
//echo $city;

//$city->test();
//$city->test1(‘哈哈哈哈‘);
//$city->test2(100,200);

//echo ‘名称:‘.$city->name.‘<br>‘;
//echo ‘面积:‘.$city->area.‘<br>‘;
//echo ‘人口:‘.$city->people.‘<br>‘;
//echo ‘<br>‘;
//$city->name = ‘重庆‘;
////$city->people = ‘15000000‘;
//
//unset($city->name);
//
//echo ‘名称:‘.$city->name.‘<br>‘;
//echo ‘面积:‘.$city->area.‘<br>‘;
//echo ‘人口:‘.$city->people.‘<br>‘;
//echo ‘<br>‘;
//var_dump($city);

//$test = false;
//if(isset($test))
// echo ‘OK‘;

//if(isset($city->people)){
// echo ‘====有值====‘;
//}else{
// echo ‘====没有获取到值====‘;
//}

 

php--魔术方法