课程名称:大话PHP设计模式
课程章节: 4-3PHP魔术方法的使用
主讲老师:Rango
课程内容:
PHP魔术方法的使用
1、__get / __set
2、__call / __callStatic
3、__toString
4、__invoke
课程收获:
学习到了4类魔术方法的作用和如何使用
__get和__set魔术方法。
__get :当试图获取一个不存在的对象属性时, 类会自动调用__get
__set :当对一个不存在的对象属性进行赋值时 ,类会自动调用__set
class Objects
{
protected $array = array();
function __set($key,$value)
{
var_dump(__METHOD__); //Test\Objects::__set
$this->array[$key] = $value;
}
function __get($key)
{
var_dump(__METHOD__); //Test\Objects::__get
return $this->array[$key];
}
}
$obj = new Objects();
$obj->title = "hello";
echo $obj->title; //hello
__call和__callStatic魔术方法。
__call:当试图获取一个不存在的对象方法时, 类会自动调用__call
__callStatic:当试图获取一个不存在的对象静态方法时,类会自动调用__callStatic (区别就是这个是用在类的静态方法)
class Objects
{
function __call($func, $param)
{
var_dump($func ,$param);
return "magic funcation\n";
}
static function __callStatic($func, $param)
{
var_dump($func ,$param);
return "magic static funcation\n";
}
}
$obj = new Objects();
echo $obj->test1("hello",123);
//test1
//array(2) { [0]=> string(5) "hello" [1]=> int(123) }
//magic funcation
echo $obj::test2("hellol",1234);
//test2
//array(2) { [0]=> string(5) "hellol" [1]=> int(1234) }
//magic static funcation
__toString魔术方法。
__toString: 当直接输出对象引用时候,会自动调用__toString魔术方法中返回的字符串
namespace Test;
class Objects
{
function __toString()
{
return __CLASS__;
}
}
$obj = new Objects();
echo $obj; //Test\Objects
__invoke魔术方法。
__invoke: 当调用函数的方式调用一个对象时,__invoke魔术方法会被自动调用。
class Objects
{
function __invoke($param)
{
var_dump($param);
return "invoke";
}
}
$obj = new Objects();
echo $obj("test1");
//test1
//invoke
扩展
__construct、__destruct 魔术方法。
__construct: 构造方法,当一个对象被创建时会调用此方法
__destruct : 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法
class Person
{
public $name;
public $age;
public $sex;
/**
* 显示声明一个构造方法且带参数
*/
public function __construct($name="", $sex="男", $age=22)
{
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
/**
* say 方法
*/
public function say()
{
echo "我叫:" . $this->name . ",性别:" . $this->sex . ",年龄:" . $this->age;
}
}
$Person1 = new Person();
echo $Person1->say(); //我叫:,性别:男,年龄:22
$Person2 = new Person("小明");
echo $Person2->say(); //我叫:小明,性别:男,年龄:22
$Person3 = new Person("李四","男",25);
echo $Person3->say(); //我叫:李四,性别:男,年龄:25