博客列表 >PHP 常用魔术方法

PHP 常用魔术方法

Lon
Lon原创
2021年10月26日 11:02:101139浏览

PHP 常用魔术方法

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

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

1、 构造方法的作用

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

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

  1. function __constrct([参数列表]){
  2. 方法体 //通常用来对成员属性进行初始化赋值
  3. }

在类中声明构造方法需要注意的事项:
1、在同一个类中只能声明一个构造方法,原因是,PHP不支持构造函数重载。
2、构造方法名称是以两个下画线开始的__construct()

  1. <?php
  2. class Student{
  3. public $name;
  4. public $age = 18;
  5. //显示声明一个构造方法且带参数
  6. public function __construct($n,$age){
  7. $this->name = $n;
  8. $this->age = $age;
  9. }
  10. public function info(){
  11. echo '我是:'.$this->name.' 今年:'.$this->age;
  12. }
  13. }
  14. $obj = new Student('张三',20);
  15. $obj->info();

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

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

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

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

1、 析构方法的声明格式

  1. function __destruct(){
  2. //方法体
  3. }

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

2、 析构方法的作用

一般来说,析构方法在PHP中并不是很常用,它属类中可选择的一部分,通常用来完成一些在对象销毁前的清理任务。

  1. <?php
  2. class Student{
  3. public $name;
  4. public $age = 18;
  5. //显示声明一个构造方法且带参数
  6. public function __construct($n,$age){
  7. $this->name = $n;
  8. $this->age = $age;
  9. }
  10. public function info(){
  11. echo '我是:'.$this->name.' 今年:'.$this->age.'<br>';
  12. }
  13. //析构函数
  14. public function __destruct(){
  15. echo "销毁 " . $this->name . "<br>";
  16. }
  17. }
  18. $obj = new Student('张三',20);
  19. $obj->info();

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

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

1、 __call()方法的格式:

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

2、 __call() 方法的作用:

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

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

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

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

此方法与上面所说的 call() 功能除了 callStatic() 是未静态方法准备的之外,其它都是一样的。

  1. <?php
  2. class Student{
  3. //私有的成员属性
  4. private $name = "张三";
  5. private $age = 24;
  6. //用静态化方式访问不存在或不可访问的方法时,魔术方法__callStatic()自动调用
  7. //参数:$func是传递过来的方法名称,$args是传递过来的参数数组
  8. public static function __callStatic($func,$args)
  9. {
  10. echo "方法{$func}(".implode(',',$args).")不存在或不可访问!";
  11. }
  12. }
  13. //用静态化方法调用showInfo()方法
  14. Student::showInfo('张三',24,'男');

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

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

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

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

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

__set( $property, $value ) 方法用来设置私有属性, 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值。

  1. <?php
  2. class Student{
  3. // 私有的成员属性
  4. private $name = "张三";
  5. private $age = 24;
  6. // 当给不可访问的属性赋值时,__set()魔术方法自动调用
  7. public function __set($n,$v){
  8. $this->$n = $v;
  9. }
  10. }
  11. // 创建学生类对象
  12. $obj = new Student();
  13. // 修改私有属性
  14. $obj->name = '李四';
  15. $obj->age = 22;
  16. var_dump($obj);
  17. ?>

七、 __isset()

__isset()的作用:当对不可访问属性调用 isset() 或 empty() 时,__isset()会被调用。

  1. <?php
  2. class Student{
  3. //私有的成员属性
  4. private $name = "张三";
  5. private $age = 24;
  6. // 当对不可访问的属性应用isset()或者empty()时,__isset()会自动调用
  7. public function __isset($n){
  8. return isset($this->$n);
  9. }
  10. }
  11. // 创建学生类对象
  12. $obj = new Student();
  13. // 判断私有属性是否存在
  14. if(isset($obj->name)){
  15. echo "存在";
  16. }else{
  17. echo "不存在或不可访问";
  18. }
  19. ?>

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

在对象里面加上了__unset()这个方法之后,在对象外部使用“unset()”函数删除对象内部的私有成员属性时,对象会自动调用__unset()函数来帮我们删除对象内部的私有成员属性。

  1. <?php
  2. class Student{
  3. //私有的成员属性
  4. private $name = "张三";
  5. private $age = 24;
  6. // 当对私有的属性应用unset()时,魔术方法__unset()自动调用
  7. public function __unset($n){
  8. unset($this->$n);
  9. }
  10. }
  11. //创建学生类对象
  12. $obj = new Student();
  13. // 删除对象属性
  14. unset($obj->name);
  15. var_dump($obj);
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议