在外部调用类中不公开的属性时(private
,protected
),程序会抛出错误信息
Fatal error: Uncaught Error: Cannot access private property Db::$name。
有了__get()和__set()后,当外部调用类中不开的属性时,程序会自动调用__get()、__set()方法。
在类中未声明魔术方法__get()、__set() 方法时,外部调用私有属性会报错:
class User
{
private $name = '大笑哈哈';
}
$user = new User;
echo $user->name ; //Fatal error: Uncaught Error: Cannot access private property User::$name
//Fatal error: Uncaught Error: Cannot access private property User::$name
__get($name)
当使用__get() 函数时,程序会自动调用__get()函数,__get($name)函数必须接收一个参数。看如下代码:
class User
{
private $name = '大笑哈哈';
//__get() 必须接受一个参数。
public function __get($name)
{
return $name;
}
}
$user = new User;
echo $user->name; //name ;自动调用__get函数,并返回了当前调用的属性名称。
__set($name ,$value);
__set($name ,$value) ,设置不公开的属性。必须接受两个参数。实例代码:
class User
{
private $name;
public function __set($name ,$value)
{
$this->$name = $value;
}
public function getName()
{
return $this->name;
}
}
$user = new User;
$user->name = '大笑哈哈';
echo $user->getName(); //'大笑哈哈';在外部修改了类中私有属性。
__call($method ,$args);
__call($method ,$args) 当调用类中不存在的方法时,则会调用__call方法,该方法接受两个参数,$method为当前调用不存在的方法名称,$args为方法中的参数,参数可能有多个,所有$args参数为数组,看实例代码:
class User
{
/*
$method [String] 方法名称
$args [Array] 方法参数
*/
public function __call($method ,$args)
{
var_dump($method ,$args);
}
}
$user = new User;
//User类中没有index 方法,那么程序会自动调用__call方法。
$user->index('大笑哈哈');// 返回__call方法的结果。string(5) "index" array(1) { [0]=> string(12) "大笑哈哈" }