TypechoJoeTheme

Lonhaiy的个人博客

登录
用户名
密码

Lonhaiy

如果结果不如你所愿,就在尘埃落定前奋力一搏
标签搜索
PHP

PHP 常用魔术方法

2022-08-26
/
0 评论
/
1,039 阅读
/
正在检测是否收录...
08/26

PHP 常用魔术方法

一、 __construct(),类的构造函数

php中构造方法是对象创建完成后第一个被对象自动调用的方法。在每个类中都有一个构造方法,如果没有显示地声明它,那么类中都会默认存在一个没有参数且内容为空的构造方法。

1、 构造方法的作用

通常构造方法被用来执行一些有用的初始化任务,如对成员属性在创建对象时赋予初始值。

2、 构造方法的在类中的声明格式

function __constrct([参数列表]){
    方法体 //通常用来对成员属性进行初始化赋值
}
在类中声明构造方法需要注意的事项:
1、在同一个类中只能声明一个构造方法,原因是,PHP不支持构造函数重载。
2、构造方法名称是以两个下画线开始的__construct()
<?php
class Student{
    public $name;
    public $age = 18;
    //显示声明一个构造方法且带参数
    public function __construct($n,$age){
        $this->name = $n;
        $this->age = $age;
    }

    public function info(){
        echo '我是:'.$this->name.' 今年:'.$this->age;
    }
}

$obj = new Student('张三',20);
$obj->info();

二、__destruct(),类的析构函数

析构方法允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件、释放结果集等。

析构方法是PHP5才引进的新内容,与构造方法对应

析造方法的声明格式与构造方法 __construct() 比较类似,也是以两个下划线开始的方法 __destruct() ,这种析构方法名称也是固定的。

1、 析构方法的声明格式

function __destruct(){
 //方法体
}

注意:析构函数不能带有任何参数。

2、 析构方法的作用

一般来说,析构方法在PHP中并不是很常用,它属类中可选择的一部分,通常用来完成一些在对象销毁前的清理任务。
<?php
class Student{
    public $name;
    public $age = 18;
    //显示声明一个构造方法且带参数
    public function __construct($n,$age){
        $this->name = $n;
        $this->age = $age;
    }

    public function info(){
        echo '我是:'.$this->name.' 今年:'.$this->age.'<br>';
    }
    //析构函数
    public function __destruct(){
        echo "销毁 " . $this->name . "<br>";
    }
}

$obj = new Student('张三',20);
$obj->info();

三、 __call(),在对象中调用一个不可访问方法时调用。

该方法有两个参数,第一个参数 $function_name 会自动接收不存在的方法名,第二个 $arguments 则以数组的方式接收不存在方法的多个参数。

1、 __call() 方法的格式:

function __call(string $function_name, array $arguments){
    // 方法体
}

2、 __call() 方法的作用:

为了避免当调用的方法不存在时产生错误,而意外的导致程序中止,可以使用 __call() 方法来避免。

该方法在调用的方法不存在时会自动调用,程序仍会继续执行下去。

<?php
class Student{
    //私有的成员属性
    private $name = "张三";
    private $age  = 24;
    // 当访问不存在或不可访问的方法时,魔术方法__call()自动调用
    // 参数:$func是传递过来的方法名称,$arrs是传递过来的参数数组
    public function __call($func,$arrs){
        echo "方法{$func}(".implode(',', $arrs).")不存在或不可访问!";
    }
}
//创建学生类对象
$obj = new Student();
// 调用对象中不存在的方法,则自动调用了对象中的__call()方法
$obj->showInfo("张三",24);

四、 __callStatic(),用静态方式中调用一个不可访问方法时调用

此方法与上面所说的 call() 功能除了 callStatic() 是未静态方法准备的之外,其它都是一样的。
<?php
class Student{
    //私有的成员属性
    private $name = "张三";
    private $age  = 24;
    //用静态化方式访问不存在或不可访问的方法时,魔术方法__callStatic()自动调用
    //参数:$func是传递过来的方法名称,$args是传递过来的参数数组
    public static function __callStatic($func,$args)
    {
        echo "方法{$func}(".implode(',',$args).")不存在或不可访问!";
    }
}
//用静态化方法调用showInfo()方法
Student::showInfo('张三',24,'男');

五、 __get(),获得一个类的成员变量时调用

在 php 面向对象编程中,类的成员属性被设定为 private 后,如果我们试图在外面调用它则会出现“不能访问某个私有属性”的错误。那么为了解决这个问题,我们可以使用魔术方法 __get()

魔术方法__get()的作用:
在程序运行过程中,通过它可以在对象的外部获取私有成员属性的值。

<?php
class Student{
    // 私有的成员属性
    private $name = "张三";
    private $age = 24;
    // 当访问不可访问是属性时,__get()魔术方法会自动调用
    public function __get($n){
        return $this->$n;
    }
}
// 创建学生类对象
$obj = new Student();
// 访问私有的属性
echo "{$obj->name}的年龄是{$obj->age}岁";
?>

六、 __set(),设置一个类的成员变量时调用

__set( $property, $value ) 方法用来设置私有属性, 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值。
<?php
class Student{
    // 私有的成员属性
    private $name = "张三";
    private $age = 24;
    // 当给不可访问的属性赋值时,__set()魔术方法自动调用
    public function __set($n,$v){
        $this->$n = $v;
    }
}
// 创建学生类对象
$obj = new Student();
// 修改私有属性
$obj->name = '李四';
$obj->age = 22;

var_dump($obj);
?>

七、 __isset()

__isset()的作用:当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
<?php
class Student{
    //私有的成员属性
    private $name = "张三";
    private $age = 24;
    // 当对不可访问的属性应用isset()或者empty()时,__isset()会自动调用
    public function __isset($n){
        return isset($this->$n);
    }
}
// 创建学生类对象
$obj = new Student();
// 判断私有属性是否存在
if(isset($obj->name)){
    echo "存在";
}else{
    echo "不存在或不可访问";
}
?>

八、 __unset(),当对不可访问属性调用unset()时被调用。

在对象里面加上了__unset()这个方法之后,在对象外部使用“unset()”函数删除对象内部的私有成员属性时,对象会自动调用__unset()函数来帮我们删除对象内部的私有成员属性。
<?php
class Student{
    //私有的成员属性
    private $name = "张三";
    private $age  = 24;
    // 当对私有的属性应用unset()时,魔术方法__unset()自动调用
    public function __unset($n){
        unset($this->$n);
    }
}
//创建学生类对象
$obj = new Student();
// 删除对象属性
unset($obj->name);
var_dump($obj);
赞(0)
版权属于:

Lonhaiy的个人博客

本文链接:

http://www.lonhaiy.com/index.php/archives/26/(转载时请注明本文出处及文章链接)

评论 (0)
Lonhaiy
如果结果不如你所愿,就在尘埃落定前奋力一搏
20 文章数
5,716 评论量

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月