PHP学习4——面向对象
主要内容:
- 创建类
- 成员方法
- 构造方法
- 析构方法
- 封装
- 继承
- 接口
- 多态
- 静态成员
- 常用关键字
- 常用魔术方法
从PHP5开始引入了面向对象的全部机制,面向对象的特性符合软件工程的3个目标:重用性,灵活性,扩展性。
创建类
类前面不用public修饰,只要class,类的属性不能在初始化赋值(除非你写了构造方法来初始化赋值),属性的使用符号->,比如$aClass->name;
demo.php
<?php //声明ren类,默认public,不写 class ren{ public $name; public $sex; public $age; } //实例化ren类 $xiaoli=new ren(); //设置name属性 $xiaoli->name="小李"; //获取name属性 echo $xiaoli->name; ?>
输出
=》小李
成员方法
就是类中函数,只是在原先的函数声明前面加修饰符public,即可,调用方法$aClass->func(),在函数中使用该对象的属性使用关键字$this,比如$this->name;
class_func.php
<?php //声明ren类,默认public,不写 class ren{ public $name; public $sex; public $age; public function say(){ echo "我叫做".$this->name."<br/>"; } } //实例化ren类 $xiaoli=new ren(); //设置name属性 $xiaoli->name="小李"; //调用方法 $xiaoli->say(); ?>
输出
我叫做小李
构造方法
在类的方法中的一个特殊的方法,默认为public(不需要写),,写法:__construct(){},注意前面是2个下划线。
可以使用构造方法进行对象的初始化赋值
每一次实例化对象(new),都会执行。
construct.php
<?php //声明ren类,默认public,不写 class ren{ public $name; public $sex; public $age; //成员方法 public function say(){ echo "我叫做".$this->name."<br/>"; echo "性别:".$this->sex."<br/>"; echo "年龄:".$this->age."<br/>"; } //构造方法 function __construct($name,$sex,$age){ $this->name=$name; $this->sex=$sex; $this->age=$age; } } //实例化ren类,初始化对象赋值 $xiaoli=new ren("小李","男",25); //调用方法 $xiaoli->say(); ?>
输出
我叫做小李 性别:男 年龄:25
析构方法
和构造方法名称类似,但是不能带任何参数,写法:function __destruct(){}
在销毁一个类之前执行一些操作或完成功能,在对象被销毁时自动执行。
destruct.php
<?php //声明ren类,默认public,不写 class ren{ public $name; public $sex; public $age; //成员方法 public function say(){ echo "我叫做".$this->name."<br/>"; echo "性别:".$this->sex."<br/>"; echo "年龄:".$this->age."<br/>"; } //构造方法 function __construct($name,$sex,$age){ $this->name=$name; $this->sex=$sex; $this->age=$age; } //析构方法 function __destruct(){ echo "<br/>$this->name 这个对象被销毁了。<br/>"; } } //实例化ren类,初始化对象赋值 $xiaoli=new ren("小李","男",25); //调用方法 $xiaoli->say(); //对象自动销毁,执行__destruct ?>
输出
我叫做小李 性别:男 年龄:25 小李 这个对象被销毁了。
也可以使用unset方法手动销毁对象,比如$unset($xiaoli)
unset.php
<?php //声明ren类,默认public,不写 class ren{ public $name; public $sex; public $age; //成员方法 public function say(){ echo "我叫做".$this->name."<br/>"; echo "性别:".$this->sex."<br/>"; echo "年龄:".$this->age."<br/>"; } //构造方法 function __construct($name,$sex,$age){ $this->name=$name; $this->sex=$sex; $this->age=$age; } //析构方法 function __destruct(){ echo "<br/>$this->name 这个对象被销毁了。<br/>"; } } //实例化ren类,初始化对象赋值 $xiaoli=new ren("小李","男",25); $xiaobai=new ren("小白","女",23); //调用方法 unset($xiaoli,$xiaobai); //对象自动销毁,执行__destruct ?>
输出
小李 这个对象被销毁了。 小白 这个对象被销毁了。
封装
面向对象的3特性:封装,继承,多态
封装是面向对象的3特性之一(3特性为:封装,继承,多态)
类封装了代码,对象则封装了数据
访问关键字:public,private,protected
继承
这也是面向对象的3特性之一
继承使用的关键字为extends
继承可以拓展原先的类的属性和方法,还可以直接使用原先的类的属性和方法,节省了一大推敲代码的时间!
不过继承的是public,protected的属性和方法,至于private乃是师傅的私家珍藏(俗称“留一手”),是不会让继承的!
PHP的面向对象的设计,和Java语言的设计非常的类似,难道是copy“借鉴”了Java的吗?也许吧!
jicheng.php
<?php //声明tool类 class tool{ function on(){ echo "<br/>启动<br/>"; } function run(){ echo "运行<br/>"; } function off(){ echo "关闭<br/>"; } } //继承tool类 class fan extends tool{ function app(){ $this->on(); $this->run(); $this->off(); } } $fan=new fan(); $fan->app(); ?>
输出
启动 运行 关闭
接口
PHP5也是单继承的,只能extends一个类,但是可以实现(相当于继承)多个接口(接口相当于是所有方法都是抽象方法,抽象类)
接口的关键字interface,实现接口implements
interface.php
<?php //声明接口 interface tool{ //全都是默认的public abstract 的方法 function on(); function run(); function off(); } //实现接口 class fan implements tool{ function on(){ echo "<br/>风扇启动<br/>"; } function run(){ echo "风扇运行<br/>"; } function off(){ echo "风扇关闭<br/>"; } } ?>
多态
由于PHP是弱类型语言,并不支持完全的多态。
多态就是根据不同的对象来做出不同的反应,运行同一个方法,但是得到的却是不同的结果。
duotai.php
<?php //声明接口 interface tool{ //全都是默认的public abstract 的方法 function on(); function run(); function off(); } //实现接口 class fan implements tool{ function on(){ echo "<br/>风扇启动<br/>"; } function run(){ echo "风扇运行<br/>"; } function off(){ echo "风扇关闭<br/>"; } } //实现接口 class engine implements tool{ function on(){ echo "<br/>发动机启动<br/>"; } function run(){ echo "发动机运行<br/>"; } function off(){ echo "发动机关闭<br/>"; } } //状态类 class toolStatus{ function ts($tool){ $tool->on(); $tool->run(); $tool->off(); } } //应用多态 $fan=new fan(); $engine=new engine(); $toolStatus=new toolStatus(); $toolStatus->ts($fan); $toolStatus->ts($engine); ?>
输出
风扇启动 风扇运行 风扇关闭 发动机启动 发动机运行 发动机关闭
静态成员
类中一种特殊成员,不会被实例化到对象中,所以不用实例化对象即可调用。
关键字static,比如public static $name,public static function say(){};
在类的内部使用静态的成员使用关键字self::$name,self表示类,2个冒号是作用域限定符,$name就是静态成员。
在程序中使用静态成员,写法:
static.php
<?php //声明tool类 class tool{ //声明静态方法 static function on(){ echo "<br/>启动<br/>"; } function run(){ //内部调用静态方法 self::on(); echo "运行<br/>"; } function off(){ echo "关闭<br/>"; } } //外部调用静态方法,不用实例化对象 tool::on(); $fan=new tool(); $fan->run(); ?>
输出
启动 启动 运行
常用关键字
final,被final(最终的)修饰的类不能被继承,修饰的属性不能被修改,比如public final function say(){}
clone,建立一个对象的副本,比如$newClass=clone $aClass;他会自动调用类的__clone(){}方法
常用的魔术方法
function __construct($name,$age){}构造方法
function __destruct(){}析构方法
function __clone(){}拷贝方法
function __set($name,$value)设置方法
function __get($name)获取方法
function __call($func,$values)
function static __callStatic($func,$values)
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
选择技术方向都要考虑哪些因素
本文主要是作者读安晓辉老师的《程序员程序员职场进阶 32 讲 》中关于“选择技术方向都要考虑哪些因素”这部分做的一些笔记和自己的思考。在这里分享给各位! 文章很短,所以各位只需要花3分钟左右就可以阅读完成哦! 选择一种技术可能会考虑到的决定因素 就业机会 选择一门就业面广的技术还是比较重要的。我的很多学PHP的同学现在都在培训班学Java,真的!!!但是也不是说,你选择就业面光的就能找到好工作,你选择就业面稍微偏窄一点的就找不到好工作。这个只能说是一种概率性问题,就业面广确实比较容易找到工作比如Java。 难易程度 我当时是在C/C++语言与Java中选择了Java,因为我感觉Java学起来确实要比C++简单一些。 个人兴趣 兴趣是你能坚持下来的一个很重要的条件。 薪资水平 薪资虽然不是人的唯一追求,但是一定是必备的追求。 发展前景 你肯定不愿意看到这种情况发生:选择了一门技术,结果一年后它就没人用、没市场了。所以我们在选择时就要考虑这一点,做一些预判。 选择技术时存在两种考虑:一种是选择稳定的、经典的技术;一种是卡位将来的市场缺口,选择将来可能需要用到的技术。 他人推荐 我们在懵懵懂...
- 下一篇
探讨Java中的父子类转化问题
有两个问题: (1)子类对象可以转化为父类对象吗? (2)父类对象可以转化为子类对象吗? ------------------------------------------------------------------------------------------------------------------------------------ 第(1)个问题应该都不陌生,也没什么好探讨的,肯定可以,因为在多态中经常用到。 如:class Father{} calss Son extends publc Father{} Father f = new Son(); //父类引用指向子类对象 其中,new Son()表示在在堆中分配了一段空间来存放类Son中的数据, 并返回一个Son的对象,并赋值给Father的引用f,即f指向子类的对象, 此时,子类的对象并没有定义一个名字。 定价于: Son s = new Son(); Father f = s; ------------------------------------------------------...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Red5直播服务器,属于Java语言的直播服务器