首页 > 代码库 > 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--魔术方法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。