1.__set()、__get() 应用
通过类中定义__set()、__get()魔术方法可以避免多个成员变量重复去定义get、set方法。
- 使用原理当外部设置 $UserAppIndex->username=‘华山论剑’; 时调用 __set() 。
- 当 $UserAppIndex->username; 时调用__get()方法
注:这些魔术方法的参数都不能通过引用传递。重载方法都必须被声明为 public。
//定义
class Index
{
private $username='';
private $password='';
public function __set($name, $value)
{
$this->$name=$value;
}
public function __get($name)
{
return $this->$name;
}
public function __construct()
{
echo '这是 UserApp\Index';
}
}
//调用
$UserAppIndex = new Index();
$UserAppIndex->username='华山论剑';
echo $UserAppIndex->username;
2. __isset() 和 __unset()
5.1.0 新增 __isset() 和 __unset()
当类中成员变量不能外部访问,会自动调用 __isset()方法,这样可以直接在魔术方法中判断成员变量是否存在,
同样,你想删除成员变量会调用__unset()执行删除操作
//定义
class Index
{
private $username = '';
private $password = '';
public function __isset($name)
{
return isset($this->$name) ? true : false;
}
public function __unset($name)
{
unset($this->$name);
}
public function __construct()
{
echo '这是 UserApp\Index';
}
}
//调用
$UserAppIndex = new Index();
var_dump(isset($UserAppIndex->username));
unset($UserAppIndex->password );
3.__call()、__callStatic()
当调用方法不存在时避免产生错误类会自动调用__call()。
一样当静态方法不存在避免错误类自动调用__callStatic() ,__callStatic()必须为静态方法
//定义
class Index
{
private $username = '';
private $password = '';
public function __call($name, $arguments)
{
echo '您调用的函数'.$name. '不存在,' .json_encode($arguments) .'为函数的参数';
}
public static function __callStatic($name, $arguments)
{
echo '静态方法'.$name. '不存在,' .json_encode($arguments) .'为函数的参数';
}
public function __construct()
{
echo '这是 UserApp\Index';
}
}
//调用,下面调用直接输出
$UserAppIndex = new Index();
$UserAppIndex->go();//您调用的函数go不存在,[]为函数的参数
$UserAppIndex::to();//静态方法to不存在,[]为函数的参数
4.__invoke()
当把对象当函数使用时候,自动调用__invoke() 下面示例说明
//定义
class Index
{
private $username = '';
private $password = '';
public function __invoke($arguments)
{
echo '该函数的参数为:'.$arguments;
}
public function __construct()
{
echo '这是 UserApp\Index';
}
}
//调用
$UserAppIndex = new Index();
$UserAppIndex(123123); //该函数的参数为:123123
5.__toString()
这个方法可以用来测试,用echo、print
//定义
class Index
{
private $username = '';
private $password = '';
public function __toString()
{
return '我是tostring方法';
}
public function __construct()
{
echo '这是 UserApp\Index';
}
}
//调用
echo ($UserAppIndex);