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的语法看的七七八八了,比较让我关注的还是他编程的思想,那 ...
随机推荐
- numpy数组 拼接
转载自:https://blog.csdn.net/zyl1042635242/article/details/43162031 数组拼接方法一 首先将数组转成列表,然后利用列表的拼接函数append ...
- offsetWidth和width的区别
1.offsetWidth属性可以返回对象的padding+border+width属性值之和,style.width返回值就是定义的width属性值. 2.offsetWidth属性仅是可读属性,而 ...
- [ActionScript 3.0] 创建倒影
package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Display ...
- [Objective-C语言教程]变量(6)
变量是程序可以操作的存储区域的名称. Objective-C中的每个变量都有一个特定的类型,它决定了变量内存的大小和布局; 可存储在内存中的值的范围; 以及可以应用于变量的操作集. 变量的名称可以由字 ...
- [Swift实际操作]八、实用进阶-(5)通过间接代理进行对象间的消息传递
本文将为你演示,如何通过简介代理的方式,进行对象间的消息传递在左侧的项目导航区,打开自定义视图的代码文件(CustomView.swift). import UIKit class CustomVie ...
- Spark JavaRDD、JavaPairRDD、Dataset相互转换与打印
主要内容: 1. List转JavaRDD,打印JavaRDD 2. List转JavaRDD,JavaRDD转JavaPairRDD,打印JavaPairRDD 3. JavaRDD<Stri ...
- 2016级算法第二次上机-F.ModricWang's Number Theory II
891 ModricWang's Number Theory II 思路 使得序列的最大公约数不为1,就是大于等于2,就是找到一个大于等于2的数,它能够整除序列中的所有数. 考虑使得一个数d整除数组中 ...
- The score of 'O' and 'X'
题目描述 注意要点: 使用strlen函数注意加头文件#inlcude <cstring> 循环宏定义for循环#define _for(i,a,b) for(int i=(a);i< ...
- JDBC完成增加-修改-增加-查询
JDBC的基本使用流程: 增加 1 导入jar包: 导入ojdbc6.jar,在项目上右键 builder path-->add to builder path. 2 ...
- 高阶篇:4.4)FMEA手册的疑问与不足(个人观点)
本章目的:如题,述说FMEA手册第四版的疑问与不足. 1.前言 作者接触FMEA,并真正将其作为可靠性设计方法,也是在近几年的时候,所以不能说算是一个FMEA专家吧. 但作者也有一些自己的优势,就是自 ...