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)
PHP学习4——面向对象的更多相关文章
- 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 0025 Java学习笔记-面向对象-final修饰符、不可变类
final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...
- 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...
- C#学习笔记——面向对象、面向组件以及类型基础
C#学习笔记——面向对象.面向组件以及类型基础 目录 一 面向对象与面向组件 二 基元类型与 new 操作 三 值类型与引用类型 四 类型转换 五 相等性与同一性 六 对象哈希码 一 面向对象与面向组 ...
- PHP学习之-面向对象
PHP学习之-面向对象 1.什么是对象 "世界万物皆对象",一切可以被抽象出来的东西都是对象.像花,草.看不到的"概念"都是对象. 2.对象的基本组成 a.属性 ...
- 前端学习:JS(面向对象)代码笔记
前端学习:JS(面向对象)代码笔记 前端学习:JS面向对象知识学习(图解) 创建类和对象 创建对象方式1调用Object函数 <body> </body> <script ...
- Python学习之==>面向对象编程(二)
一.类的特殊成员 我们在Python学习之==>面向对象编程(一)中已经介绍过了构造方法和析构方法,构造方法是在实例化时自动执行的方法,而析构方法是在实例被销毁的时候被执行,Python类成员中 ...
- canvas学习和面向对象(二)
Canvas 学习(二) 上一篇Canvas 学习(一)中我是用canvas绘制了一些基本和组合的图形. 现在开始绘制图片和动画帧,以及面向对象的升级版本. 还是一样,看代码,所有的代码都托管在git ...
- Python学习一(面向对象和函数式编程)
学习了一周的Python,虽然一本书还没看完但是也收获颇多,作为一个老码农竟然想起了曾经荒废好久的园子,写点东西当做是学习笔记吧 对Python的语法看的七七八八了,比较让我关注的还是他编程的思想,那 ...
随机推荐
- Performance profile of a typical interior scene
------------------------------- Num faces: 7000k+ Num lights: 38 Num textures: 79 Textures on disk: ...
- UWP平台Taglib编译(2)
此文已由作者郑博授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 #endif // _WIN32 } class FileStream::FileStreamPrivate ...
- LeetCode 刷题指南(1):为什么要刷题
虽然刷题一直饱受诟病,不过不可否认刷题确实能锻炼我们的编程能力,相信每个认真刷题的人都会有体会.现在提供在线编程评测的平台有很多,比较有名的有 hihocoder,LintCode,以及这里我们关注的 ...
- Three Religions CodeForces - 1149B (字符串,dp)
大意: 给定字符串S, 要求维护三个串, 支持在每个串末尾添加或删除字符, 询问S是否能找到三个不相交的子序列等于三个串. 暴力DP, 若不考虑动态维护的话, 可以直接$O(len^3)$处理出最少需 ...
- sublime基本命令和使用
Ctrl+Shift+p Package Control Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)Ctrl+G 跳转到相应的行Ctrl+J 合并行(已选 ...
- scrapy连接MongoDB
Scrapy中连接MongoDB所需要做的工作如下: 1.settings中需要设置的部分: # 启动管道组件 ITEM_PIPELINES = { 'QianChengWuYu.mongoDBPip ...
- [BZOJ 1937][Shoi2004]Mst 最小生成树
传送门 $ \color{red} {solution:} $ 对于每条树边\(i\),其边权只可能变小,对于非树边\(j\),其边权只可能变大,所以对于任意非树边覆盖的树边有 \(wi - di & ...
- [转] ScalaTest测试框架
[From] https://blog.csdn.net/hany3000/article/details/51033610 ScalaTest测试框架 2016年04月01日 02:49:35 阅读 ...
- iis上部署本地数据库LocalDB的方法
1. iis应用程序池的标识设置为"ApplicationPoolIdentify"(比较安全) 2. 不要将数据库物理文件保存在网站的物理路径内,因为iis应用程序池的标识为Ap ...
- vue开发的一些设置以及技巧
引入其它css样式 需要加~ @找到的是src目录 对于常用的路径可以设置别名 @代表src 常用的地址在webpack.base.conf.js中 ...