首页 > 代码库 > PHP面向对象的魔术方法
PHP面向对象的魔术方法
<?php
/**
* Created by PhpStorm.
* User: fu
* Date: 2017/7/19
* Time: 9:41
*/
class Person{
protected $name;
private $age;
private $mobile;
function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
/**
* 测试使用的不能直接访问的函数
* @param $info
*/
protected function test1($info){
echo ‘我的信息:‘.$info;
}
private function test2(){
echo ‘我不能被直接访问哦~!~!~‘;
}
// /**
// * @return mixed
// */
// public function getName()
// {
// return $this->name;
// }
/**
* __get魔术方法,当在类的外部调用不能直接访问的属性时,该函数方法被自动调用
* 下面的格式是该魔术方法的标准形式,不能改变
* 魔术方法必须是公共的(public),且不能定义为静态的(static),除了__callStatic
* __get必须有返回值,所以最后结束的肯定是return语句
* @param $name 被访问的属性的名称,它必须是一个字符串
*/
public function __get($name){
// echo ‘在类中查找对应名称的属性:‘.$name;
if(isset($this->$name)){
return $this->$name;
}else{
return null;
}
}
/**
* 魔术方法__set,当设置类中的不能直接访问的属性时,自动调用该函数方法
* 下面的格式是该魔术方法的标准形式,不能改变
* __set不需要返回值
* @param $name 需要设置值的类的属性名称
* @param $value 需要设置的值
*/
public function __set($name, $value){
/*
* property_exists 它用于判断类当中是否包含某个指定名称的属性
*/
if (property_exists($this, $name)){
$this->$name=$value;
}
}
/**
* 魔术方法,判断类中的属性是否被设置了
* 当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
* @param $name 传入的是类的属性名称
* @return bool 如果属性存在,则返回true;如果不存在,返回false
*/
function __isset($name){
if (property_exists($this, $name)){
return isset($this->$name);
}else{
return false;
}
}
function __unset($name){
if (property_exists($this, $name)){
$this->$name = null;
}else{
return null;
}
}
/**
* 在对象中调用一个不能直接访问的非静态方法时,__call() 会被自动调用。
* @param $name 被访问的函数方法的名称,字符串格式
* @param $arguments 传递过来的函数方法的参数,数组格式
*/
function __call($name, $arguments){
// echo ‘需要被访问的函数名称:‘.$name;
// var_dump($arguments);
if(method_exists($this, $name)){
call_user_func_array(array($this, $name), $arguments);
}else{
echo ‘没有对应的函数可以被调用‘;
}
}
/**
* 魔术方法,当以字符串格式输出类的对象时,默认被自动调用
* 该函数方法结束必须有一个return语句,且返回的值必须是字符串
*/
function __toString(){
return ‘姓名:‘.$this->name.‘,年龄:‘.$this->age;
// return 100;
}
/**
* 当类的对象被克隆时自动调用执行
* 在这里可以修改被克隆的数据值
*/
function __clone(){
echo ‘<br>数据对象被复制了一个备份<br>‘;
$this->age = 35;
}
}
$p = new Person(‘李四‘, 30);
//$p->test1(‘成都‘);
//echo ‘<br><br>‘;
//$p->test2();
//echo ‘<br><br>‘;
//$p->test3();
//echo ‘<br><br>‘;
//echo $p;
//print $p;
echo ‘<br><br>‘;
print_r($p);
echo ‘<br><br>‘;
$p2 = clone $p;
$p2->name = ‘王五‘;
print_r($p2);
//echo ‘<br><br>‘;
//var_dump($p);
//echo $p->name;
//echo $p->age;
//echo $p->mobile;
//var_dump($p);
//
//
//$p->name = ‘成都‘;
//$p->mobile = ‘13066666666‘;
//$p->birth = ‘2000-01-01‘;
//
//unset($p->age);
//echo ‘<br><br>修改后的对象值:‘;
//var_dump($p);
//
//
//if(isset($p->name)){
// echo ‘OK‘;
//}else{
// echo ‘No‘;
//}
PHP面向对象的魔术方法