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的语法看的七七八八了,比较让我关注的还是他编程的思想,那 ...
随机推荐
- lua luna工具库
luna工具库 概述 luna库提供了几个lua开发的常见辅助功能: lua/c++绑定 lua序列化与反序列化 变长整数编码,用于lua序列化,当然也可以方便的用于其他场合 这里把代码编译成了动态库 ...
- 追随自己的价值观:用研经理 Anne Diaz 职业探索之路
『漫谈』系列聚焦了人性脆弱面的价值.每期的对话嘉宾可能是爱彼迎设计团队的成员,也可能来自设计界的其他领域.对话主题都是我们在工作中很少讨论的话题. 这些话题涉及不同方面,比如失败.人生道路.冲突.成长 ...
- Ionic2实战——按模块划分app 创建多module
http://www.jianshu.com/p/d94324b722af 背景 用ionic2开发过一两个小功能的朋友都会发现,每新建一个页面都需要在\src\app\app.module.ts中添 ...
- NSUserdefault读书笔记
作用 用来存储首选项的.本来首选项是存在磁盘上的,NSUserdefault相当于提供了一个缓存,不用每次都写文件.也就是说设置首选项以后,可以马上读出来,不必先写到磁盘中去. 定期调用synchro ...
- 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]$ ...
- JavaScript DOM编程艺术 笔记(二)语句操作
操作 var total = (1+4)*5; year = year +1; year++; var message = "i am" + "girl"; 是 ...
- SQL语句之用户管理
SQL语句系列 1.SQL语句之行操作 2.SQL语句之表操作 3.SQL语句之数据库操作 4.SQL语句之用户管理 占坑,待写……
- linux ssh 上传 文件
在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件scp username@servername:/path/filename /var/www/local_dir(本地 ...
- php 多字节编码转换
PHP 支持的编码 mb_convert_encoding — 转换字符的编码 string mb_convert_encoding ( string $str , string $to_encodi ...
- urllib和urllib3
urllib库 urllib 是一个用来处理网络请求的python标准库,它包含4个模块. urllib.request---请求模块,用于发起网络请求 urllib.parse---解析模块,用于解 ...