魔术方法和构造函数__construct和复制对象时自动调用的函数__clone相似,都是在执行某一操作时会被调用,通常和一个关键字相连。
__组()
通常情况下在类中会定义私有属性,这是为了保护数据而使用的措施,但是也给我们带来了麻烦。想要修改它们的值时,是通过调用我们定义的接口函数来完成的。每次需要修改变量都要调用不同的接口,这是比较麻烦的,所以PHP提供了一个魔术方法__set()来方便我们的赋值操作
__set()语法:authority(访问控制关键字)function __set($ varname(要赋值的成员属性名),$ value(要给成员属性付的值)){.....}
__set()函数接受两个参数
代码演示:
<?php
class test{
public $name;
private $age;
private $sex;
public function __set($varname,$value){
if($varname=='age'){
if($value<130&&$value>10){
$this->age=$value;
}else{
echo 'age赋值错误<br>';
}
}
if($varname=='sex'){
if($value=='男'||$value=='女'){
$this->sex=$value;
}else{
echo 'sex赋值错误<br>';
}
}
}
public function info(){
echo '我叫'.$this->name.'<br>';
echo '我是'.$this->sex.'孩<br>';
echo '我今年'.$this->age.'岁了<br>';
}
}
$tom=new test();
$tom->name='汤姆';
$tom->age=18;
$tom->sex='男';
$tom->info();
$tom->sex='女';
$tom->info();
$tom->age=140;
$tom->info();
?>
从上面的代码可以看出,虽然两个成员属性是私有的,但是也可以在外部赋值,这就是__set()发挥了作用
__得到()
__get()的作用是在类的外部访问类的私有成员属性的时候,会自动调用__get()方法返回属性的值,它有一个参数用来接收属性名
__get()语法:authority(访问控制关键字)函数__get($ varname(要访问的成员方法名)){....}
代码示例:
<?php
class test{
private $name;
private $age;
private $sex;
public function __get($varname){
if($varname=='name'){
echo '我的名字是'.$this->name.'<br>';
return;
}
if($varname=='age'||$varname=='sex'){
echo '我的性别和年龄是保密的<br>';
}else{
echo '不存在你要访问的成员属性<br>';
}
}
public function __construct($name,$age,$sex){
$this->name=$name;
$this->age=$age;
$this->sex=$sex;
}
}
$tom=new test('汤姆',19,'男');
$tom->name;
$tom->age;
$tom->sex;
$tom->school;
?>
注意:如果中的条件判断语句是两个等号,不要丢掉,这是血的教训啊,眼都要找瞎了
从代码可以看出,语句在外部直接访问了类的私有成员属性而程序是没有报错的,这是因为调用了__get()方法。当然,我们也可以在__get()方法中加一些条件限制,来控制访问的权限
__呼叫()
__call()函数用于对象访问的函数不存在或没有足够的访问权限时会被系统自动调用
__call()语法:authority(访问控制关键字)函数__call($ varname(要调用的成员方法名),$ value(要调用方法的参数列表)){.....}
代码示例:
<?php
class test{
public function __call($varname,$value){
echo '你调用的函数'.$varname.'不存在或不可访问<br>';
}
public function say(){
echo '我向你问好<br>';
}
private function hello(){
echo '我向你说hello<br>';
}
}
$tom=new test();
$tom->say();
$tom->hello();
$tom->get();
?>
从上面的代码可以看出,在访问不存在的成员函数得到()和私有函数你好()时,自动调用了__call()并输出提示
__callStatic
__callStatic()的功能和__call()的功能是一样的,只不过是针对静态函数的.__ callStatic()是针对调用静态函数而定义的函数
__callstatic()语法:public(访问控制关键字必须为public)static(必须被修饰为静态方法)function __callStatic($ varname,$ values){....}
代码示例:
<?php
class test{
public static function __callStatic($varname,$value){
echo '你调用的函数'.$varname.'不存在或不可访问<br>';
}
public static function say(){
echo '我向你问好<br>';
}
private static function hello(){
echo '我向你说hello<br>';
}
}
test::say();
test::hello();
test::get();
?>
静态方法这样调用: