主要内容:

  1. 创建类
  2. 成员方法
  3. 构造方法
  4. 析构方法
  5. 封装
  6. 继承
  7. 接口
  8. 多态
  9. 静态成员
  10. 常用关键字
  11. 常用魔术方法

从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——面向对象的更多相关文章

  1. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

  2. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  3. 0025 Java学习笔记-面向对象-final修饰符、不可变类

    final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...

  4. 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类

    static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...

  5. C#学习笔记——面向对象、面向组件以及类型基础

    C#学习笔记——面向对象.面向组件以及类型基础 目录 一 面向对象与面向组件 二 基元类型与 new 操作 三 值类型与引用类型 四 类型转换 五 相等性与同一性 六 对象哈希码 一 面向对象与面向组 ...

  6. PHP学习之-面向对象

    PHP学习之-面向对象 1.什么是对象 "世界万物皆对象",一切可以被抽象出来的东西都是对象.像花,草.看不到的"概念"都是对象. 2.对象的基本组成 a.属性 ...

  7. 前端学习:JS(面向对象)代码笔记

    前端学习:JS(面向对象)代码笔记 前端学习:JS面向对象知识学习(图解) 创建类和对象 创建对象方式1调用Object函数 <body> </body> <script ...

  8. Python学习之==>面向对象编程(二)

    一.类的特殊成员 我们在Python学习之==>面向对象编程(一)中已经介绍过了构造方法和析构方法,构造方法是在实例化时自动执行的方法,而析构方法是在实例被销毁的时候被执行,Python类成员中 ...

  9. canvas学习和面向对象(二)

    Canvas 学习(二) 上一篇Canvas 学习(一)中我是用canvas绘制了一些基本和组合的图形. 现在开始绘制图片和动画帧,以及面向对象的升级版本. 还是一样,看代码,所有的代码都托管在git ...

  10. Python学习一(面向对象和函数式编程)

    学习了一周的Python,虽然一本书还没看完但是也收获颇多,作为一个老码农竟然想起了曾经荒废好久的园子,写点东西当做是学习笔记吧 对Python的语法看的七七八八了,比较让我关注的还是他编程的思想,那 ...

随机推荐

  1. lua luna工具库

    luna工具库 概述 luna库提供了几个lua开发的常见辅助功能: lua/c++绑定 lua序列化与反序列化 变长整数编码,用于lua序列化,当然也可以方便的用于其他场合 这里把代码编译成了动态库 ...

  2. 追随自己的价值观:用研经理 Anne Diaz 职业探索之路

    『漫谈』系列聚焦了人性脆弱面的价值.每期的对话嘉宾可能是爱彼迎设计团队的成员,也可能来自设计界的其他领域.对话主题都是我们在工作中很少讨论的话题. 这些话题涉及不同方面,比如失败.人生道路.冲突.成长 ...

  3. Ionic2实战——按模块划分app 创建多module

    http://www.jianshu.com/p/d94324b722af 背景 用ionic2开发过一两个小功能的朋友都会发现,每新建一个页面都需要在\src\app\app.module.ts中添 ...

  4. NSUserdefault读书笔记

    作用 用来存储首选项的.本来首选项是存在磁盘上的,NSUserdefault相当于提供了一个缓存,不用每次都写文件.也就是说设置首选项以后,可以马上读出来,不必先写到磁盘中去. 定期调用synchro ...

  5. Flume启动运行时报错org.apache.flume.ChannelFullException: Space for commit to queue couldn't be acquired. Sinks are likely not keeping up with sources, or the buffer size is too tight解决办法(图文详解)

        前期博客 Flume自定义拦截器(Interceptors)或自带拦截器时的一些经验技巧总结(图文详解) 问题详情 启动agent服务 [hadoop@master flume-1.7.0]$ ...

  6. JavaScript DOM编程艺术 笔记(二)语句操作

    操作 var total = (1+4)*5; year = year +1; year++; var message = "i am" + "girl"; 是 ...

  7. SQL语句之用户管理

    SQL语句系列 1.SQL语句之行操作 2.SQL语句之表操作 3.SQL语句之数据库操作 4.SQL语句之用户管理 占坑,待写……

  8. linux ssh 上传 文件

    在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件scp username@servername:/path/filename /var/www/local_dir(本地 ...

  9. php 多字节编码转换

    PHP 支持的编码 mb_convert_encoding — 转换字符的编码 string mb_convert_encoding ( string $str , string $to_encodi ...

  10. urllib和urllib3

    urllib库 urllib 是一个用来处理网络请求的python标准库,它包含4个模块. urllib.request---请求模块,用于发起网络请求 urllib.parse---解析模块,用于解 ...