PHP——常用的魔术方法

php规定以两个下划线(__)开头的方法都保留为魔术方法

php是面向对象的语言,但是 之前的php语言还真不是,所以有一些面向对象的标准实现并不完善,例如重载。但我们可以通过一些魔术方法来弥补。

很多情况下,我们在创造对象的成员属性的时候,只有在某一刻才能确定下来,这在之前或者之后都不可以,但我们没有办法给我们的成员属性一个函数值(属性里面不支持),所以这个时候我们就需要一个特定的方法-——魔术手法

例如:

<?phpclass human{//成员属性var $name;var $sexfunction human(){echo '#########';  //echo() 函数输出一个或多个字符串。}function wawaku(){echo '555555555~';}
}
$one=new huamn;
var_dump($one);

当我 方法名与类名相同的时候,我一创建$one=new huamn; 这个对象,就会输出echo '#########' 这就是创建之时,所以在之后,我添加这样一句话:

<?phpclass human{//成员属性var $name;var $sex//成员方法   //魔术方法1:构造方法 function human(){echo '#########';$this->sex = mt_rand(0,1) ? '男':'女';}function wawaku(){echo '555555555~';}
}
$one=new human;
var_dump($one);       //var_dump() 函数用于输出变量的相关信息。

当我的构造方法里面有参数,

  function human($a)

那么我的 $one后面也要加一个括号,并且填上相应的参数

$one=new human('a');

注:该方法仅仅只是举例,在实际生活中不建议使用。因为一旦我们更改类名,我们就必须将所有的human全部更改成相同的名字,否则构造失败

在实际生活中,我们更加常用的是使用函数,例如__construct()

<?phpclass human{//成员属性var $name;var $sex//成员方法   //魔术方法1:构造方法 function __construct($name){$this->sex = mt_rand(0,1) ? '男':'女';$this->name = $name;}function wawaku(){echo '555555555~';}
}
$one=new human('hcj');
var_dump($one);

所以,

简单来说,魔术方法是一种特殊的函数

常见魔术函数

构造方法和解析方法

1.__construct()——构造方法

__construct()是构造函数

  • 触发时机:在对象实例化(创建对象)的时候自动触发

  • 作用:初始化成员属性

  • 参数:可以有,可以没有,取决于设定与逻辑

  • 返回值:没有

  • 注意:如果构造方法具有参数,且参数没有默认值,在实例化对象时,必须在类名后面的括号内添加实参

  • <?phpclass human{//成员属性var $name;var $sex;var $id;    //成员方法   //魔术方法1:构造方法 function __construct($name){$this->sex = mt_rand(0,1) ? '男':'女';$this->name = $name;$this->id = uniqid();     //uniqid()  生成一个唯一的 ID}function wawaku(){echo '555555555~';}
    }
    $one=new human('hcj');
    var_dump($one);
    

2. __desctruct()——析构方法

__desctruct()析构函数,不需要显示的调用,系统会自动调用这个方法。而且析构函数不需要参数(因为不需要调用)

  • 触发时机:在销毁对象的时候自动触发(unset() 或者 页面执行完毕)

  • 作用:回收对象使用过程中的资源,配合 unset 使用

  • 参数:没有

  • 返回值:没有

  • <?phpclass human {var $name;var $sex;var $id;function __construct($name){$this->sex = mt_rand(0,1) ? '男':'女';$this->name = $name;$this->id = uniqid();     //uniqid()  生成一个唯一的 ID}function __destruct($name){echo '@@@@@@@@@@';unset($this->id);}
    }$one=new human('hcj');var_dump($one);unset($one);
    //注:在这里我们无法检测到,因为此时,one已经注销,无法查看id情况
    

**面向对象的三大特征:

  • 封装
  • 继承
  • 多态(一种思想)

面向对象的封装特性

  1. 封装特性:在一个对象产生之后,对象的部分成员属性和成员方法逻辑上是不允许对象外部调用或者使用的。这就是封装特性的由来

  2. 封装的关键字:private 私有的

    • private 的特征:

      1. 被 private 修饰的成员属性不能在类的外部进行访问,可以在类的内部访问。
      2. 被 private 修饰的成员方法不能在类的外部进行访问,可以在类的内部访问。
      3. var 和 private只能选取一个(包括 public 和 protected )
      <?phpvar xiyiji {private $color = '白色';var $pinpai = '海尔';var $weight = '20kg';var $rongliang = '6.5L';private $mada = '三菱重工';//成员方法//洗衣服方法private function xiyi() {echo '洗衣服';$this->settime();}private function tuoshui() {echo'脱水';}private function settime() {echo'定时功能';echo $this->mada.'开启定时功能';}
      }
      //实例化一个洗衣服对象
      $one= new xiyiji();
      var_dump($one);
      echo $one->xiyi();
      //发现可以调用,  洗衣服三菱重工开启定时功能
      //尝试修改 private 修饰的成员属性值
      '''$one->made = '学习园地';
      var_dump($one);'''
      //发现查看,更改失败,所以我们需要魔术方法开一个后门
      //魔术方法   __get()
      
  3. 魔术方法: __get(访问后门)

    • 触发时机:访问私有成员属性的时候自动触发
    • 功能:1. 防止报错 2. 为私有成员属性访问提供后门
    • 参数:一个 访问私有成员属性名称
    • 返回值:可以有,可以没有,实际情况决定
    • 注意:__get 函数只能进行查看无法进行修改。
   <?phpvar xiyiji {//成员属性private $color = '白色';var $pinpai = '海尔';var $weight = '20kg';var $rongliang = '6.5L';private $mada = '三菱重工';//成员方法//洗衣服方法private function xiyi() {echo '洗衣服';$this->settime();}private function tuoshui() {echo'脱水';}private function settime() {echo'定时功能';echo $this->mada.'开启定时功能';}function __get($pro) {     //__get 当我调用私有成员属性,就会调用这个方法,但不是所有的私有成员属性我都需要看,所以要有一个判断if($pro == 'name'){echo '######';// echo $this->color;return $this->$pro;}else{return '禁止查看';}}
}
//实例化一个洗衣服对象
$one= new xiyiji();
var_dump($one);
echo $xiyiji->color;
echo  '<hr/>';
echo $xiyi->settime;
//xiyiji->color='red';  发现失败
  1. 魔术方法: __set()

    • 出发时机:对私有成员属性进行设置值时自动触发
    • 功能:1. 屏蔽错误 2. 为私有成员属性设置提供后门
    • 参数:两个 $a 私有成员属性的原值 $b 私有成员属性的新值
    • 返回值:没有返回值
<?phpclass Person {//成员属性var $name = '李兰英';private $sex = '男';var $age = '38';//成员方法function say(){echo '佛爷吉祥';}function nn(){echo '哗啦啦啦啦~';}//魔术方法 __set($a,$b){  $a 私有成员属性的原值   $b 私有成员属性的新值function __set($a,$b){if($pro == 'sex'){echo '##';//var_dump($a);//var_dump($b);$this->$a = $b}else{echo  '禁止修改 ';//没有返回值}}
}}//实例化对象$lly = new Person;var_dump($lly);// 访问私有成员属性// echo $lly->sex;  // 设置私有成员属性$lly->sex = '人妖';var_dump($lly);
  1. 魔术方法:__isset

    • 触发时机:对私有成员属性进行 isset 进行检查时自动触发
    • 功能:代替对象外部的 isset函数检测,返回结果
    • 参数:1个 ,私有成员属性名
    • 返回值:一般返回 isset()检查结果
<?phpclass Person {//成员属性var $name = '李兰英';private $sex = '男';var $age = '38';//成员方法function say(){echo '佛爷吉祥';}function nn(){echo '哗啦啦啦啦~';}//魔术方法 __set($a,$b){  $a 私有成员属性的原值   $b 私有成员属性的新值function __set($a,$b){if($pro == 'sex'){echo '##';//var_dump($a);//var_dump($b);$this->$a = $b}else{echo  '禁止修改 ';//没有返回值}
}function __isset(){echo '######';var_dump($pro);// return isset($this->$pro);}}//实例化对象$lly = new Person;//检查姓名属性是否设置      非私有//$result = isset($lly->name);//var_dump($result);     ture   //外部的 isset 无法检测私有成员属性 返回值为 false'''检查私有属性'''$result = isset($lly->sex);    var_dump($result)
  1. 魔术方法:__unset

    • 触发时机:对私有成员属性进行 unset 进行检查时自动触发
    • 功能:代替对象外部的 unset函数检测,
    • 参数:1个 ,私有成员属性名
    • 返回值:无
<?phpclass Person {//成员属性var $name = '李兰英';private $sex = '男';var $age = '38';//成员方法function say(){echo '佛爷吉祥';}function nn(){echo '哗啦啦啦啦~';}function __unset(){//var_dump($a);if($pro == 'sex'){unset($this->$pro);  }}
}//实例化对象$lly = new Person;//删除一个属性  非私有''' unset($lly->name);var_dump($lly);'''//删除一个私有成员属性unset($lly->sex);;var_dump($lly)   

面向对象的继承特性

  1. 继承特性:

    • 继承格式:

      • class 类名 extends 父亲名{

        ​ 书写子类独有的方法和人书写;

        }

    • 概念:

      • 父亲:被其他类继承的解释父类,也叫做基类;
      • 子类:继承其他类的类就是子类,也叫做派生类。
    • 特点:

      1. 子类继承父类既具备父类中所有的成员属性和方法(私有 private 的除外)

      2. 子类继承父类之后可以具有子类独有的属性和方法。

        爷爷有的 父亲也有 父亲有的 爷爷不一定有

      3. 在继承时,子类允许出现和父亲同名的方法,这种情况不会冲突,而是子类的方法会覆盖父类的方法,这种方法叫重载(重新加载)。

      4. ​ 魔术方法可以被子类继承。

      5. 如果父类具有构造方法,子类也需要构造方法 ,此时需要在子类中重载父亲的构造方法,并且在构造方法中使用 parent::__construct ()进行调用父亲的构造方法,构造继承而来的父亲的成员属性。 也可以使用类名::__construct ()来调用父类的构造方法,不推荐使用。一旦父类名字改变,继承失效。

      6. 继承代码的时候不要瞎继承,人类不要继承鸟类。要有一定的逻辑关系。

    • php继承特点和和其他语言继承的区别:

      • php时单继承(生物学逻辑)语言 其他语言一般时多继承(社会学逻辑,一个徒弟多个师傅)。
<?php//继承特性 爷爷有的 父亲也有 父亲有的 爷爷不一定有//爷爷类class GrandFather{//成员属性var $familyname = '曹';var $lastName = '操';private $xifu = '老婆';//成员方法//吃饭function chi {echo '会吃饭';}function he {echo '会喝水';} function __construct{$this->lastName= '天骄';}
}'''   //父亲类class Father{//成员属性var $familyname = '曹';var $lastName = '操';var $money = '100';//成员方法//吃饭function chi {echo '会吃饭';}function he {echo '会喝水';} function piao {echo '足浴大会员';}
}
$father = new Father;
var_dump (Father);
//但一般不使用复制代码的方式去继承'''//父亲类class Father extends GrandFather{var $money = '100';function piao() {echo '足浴大会员';}     }function __construct{$this->sex = mt_rand(0,1) ? '男':'女';//$this->lastName= '天骄';//调用父亲的构造方法//GrandFather::__construct//调用父亲的构造方法2}$father = new Father;
var_dump (Father);

访问类型控制

  1. 三个封装关键字

    • private 私有封装化
    • public 公共的封装
    • protected 受保护的封装(只有在继承的时候才会受保护)
    • 子类同名的方法的封装等级必须大于或者等于父类的封装等级
    • private -1 protected-2 public-3
    • var是封装关键字,但不是标准的封装关键字,一般仅用于测试和学习。
      • var=%50 public

        • 原因:var只能修饰成员属性,不能修饰成员方法。
关键字/位置 类外 类内部 子类
private x x
public
protected x
<?phpclass libei {//成员属性protected $fname ='刘';private $lastname = '备';public $horse = '的卢';//方法private function cry(){echo '呜呜呜呜呜呜呜~';}protected function say(){echo '正在说话中';}public function zhandou(){echo '正在战斗中';}''' function texvisit(){echo $lb->horse;echo '<br/>';echo $lb->lastname;echo '<br/>';echo $lb->fname;类的内部可以访问}'''
}
//实例化一个刘备对象
$lb = new luibei();
//在类的外部访问成员属性
'''echo $lb->horse;
echo '<br/>';
echo $lb->lastname;
echo '<br/>';
echo $lb->fname;
只有的卢(public)才可以访问 剩下的无法访问
''''''class adou extends luibei{function texvisit(){echo $lb->horse;echo '<br/>';echo $lb->lastname;echo '<br/>';echo $lb->fname;
};//实例化阿斗对象$ad = new adou;$ad->texvisit();的卢可以   刘可以'''

PHP——常用的魔术方法(保姆级教学)相关推荐

  1. GitHub下载速度太慢的解决方法 保姆级教学

    GitHub下载速度太慢的解决方法   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客 本文原创为亓官劼,请大家支持 ...

  2. Fortran保姆级教学——考试所有知识点看这一篇就够了

    Fortran保姆级教学--考试所有知识点看这一篇就够了 临近期末本人复习的同时将整个fortran课堂知识整理了下来,希望学弟学妹们今后学这门课的时候不至于在csdn找不到系统的教程,也希望能帮到需 ...

  3. Java EE系列(九)——Java EE连接Mysql数据库(JDBC保姆级教学)

    最近几天,peter xiao所在的项目小组也逐渐开始进行做最后的Java web课程大作业了,我们组所做的是运动会报名服务系统,其中涉及到很多数据的增删查改,所以需要依靠Mysql数据库来解决这些问 ...

  4. 【量化回测必看!】Backtrader保姆级教学+免费行情源 SMA策略

    前言 想开始量化学习不知道如何入手?市面上的学习资料太多不知道该怎么看? 博主将从零基础讲解回测框架,一步步完成量化数据源的搭建,让你10天内成为量化高手 博主同时将视频课程内容在B站更新,可以关注& ...

  5. 「保姆级教学」入门级java程序——薪资转换器

    往期「保姆级教学」目录 「保姆级教学」iOS下JDK环境配置 文章目录 往期「保姆级教学」目录 前言 第二日任务 1.java基础语法 2.掌握java基本输入输出 3.掌握java基本数据类型和变量 ...

  6. 保姆级教学——集群环境搭建及创建集群

    保姆级教学--集群环境搭建及创建集群 新建虚拟机 一些默认,加载镜像开启虚拟机,在安装位置选择自己目录,然后建立分区,首先添加 挂载点,类型标准分区,文件系统ext4 加载分区,期望给2G, 类型标准 ...

  7. 英伟达的Nerf:instant_ngp在Windows10下的配置和使用--保姆级教学

    英伟达的Nerf:instant_ngp在Windows10下的配置和使用–保姆级教学 1.前言 Nerf的原理和厉害之处在这里就不做详细介绍了,本文主要是针对小白在Windows10环境下配置ins ...

  8. 手把手教你使用Hugo搭建个人博客网站|保姆级教学

    搭建个人博客网上目前用的比较多的博客框架是Hexo.Hugo.Jekyll.本文详细介绍利用最新的Hugo(基于Go语言的博客框架)在windows上搭建个人博客网站,从域名注册到后期维护,全程保姆级 ...

  9. 利用Anaconda安装pytorch和paddle深度学习环境+pycharm安装---免额外安装CUDA和cudnn(适合小白的保姆级教学)

    系列文章目录 ​​​​​​​深度学习原理-----线性回归+梯度下降法 深度学习原理-----逻辑回归算法 深度学习原理-----全连接神经网络​​​​​​​ 深度学习原理-----卷积神经网络 深度 ...

  10. 魔术方法php,PHP中常用的魔术方法

    我们在PHP中经常用到魔术方法,像构造方法,析构方法等等魔术变量,下面总结一下一些常用的魔术变量: __construct(),__destruct(),__clone(),__autoload(), ...

最新文章

  1. erlang进程的调度效率
  2. PMcaff微分享 | 为什么大部分女生爱星座?大部分男生恨星座?
  3. 数据库编程起别名的3中方式
  4. Mysql5.6.23免安装配置
  5. 【论文阅读】Abdominal multi-organ segmentation with organ-attention networks and statistical fusion
  6. 公众号文章发送pdf文件 pdf文件如何变成导出图片
  7. 再谈KMP/BM算法(II)
  8. 好用的pdf阅读器(便携)
  9. win 10 设置透明图表显示为黑色方块问题
  10. 关于支持电脑登录选项设置
  11. java手机游戏ios_我的世界JAVA版本ios版
  12. 【线性分类器】(四)万字长文解释拉格朗日乘子与支持向量机
  13. 南理工计算机学院贾修一,南京理工大学考研研究生导师简介-贾修一
  14. es中should查询使用注意
  15. javaScript模拟实现call
  16. RuntimeError: CUDA error: an illegal memory access was encountered的解决方法
  17. Html5工单系统,PESCMS Ticket(客服工单系统) V1.3.4 官方版
  18. 《C语言名题精选百则----8》
  19. 大数据从业者必读书籍《数据仓库工具箱》-第一章笔记
  20. 人工神经网络与神经网络,人工神经网络基本概念

热门文章

  1. 詹克团反攻比特大陆:一场失去人心的自我挽留
  2. Scrapy: 爬虫返回403错误
  3. 免费好用的判定节假日API来了
  4. 2022年了,微信透明头像怎么设置?不多说,安排(2)
  5. 项目开发中dev、test和prod是什么意思
  6. Linux - 增加用户、添加用户组
  7. 蜜罐 计算机术语,检测虚机和蜜罐方法的概念 -电脑资料
  8. 00002-微信小游戏--触摸事件
  9. 常用统计算法JAVA实现 - 峰度(07)
  10. kindle无缝迁移笔记