PHP面向对象详解(三)


Posted in PHP onDecember 07, 2015

面向对象 对象概念是面向对象技术的核心。在显示世界里我们所面对的事情都是对象,如计算机、电视机、自行车等。在面向对象的程序设计中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象.

对象的主要三个特性

对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为。
对象的形态:当施加那些方法是对象如何响应,颜色,尺寸,外型。
对象的表示:对象的表示就相当于身份证,具体区分在相同的行为与状态下有什么不同。

面向对象模型

面向对象的概念:

oop(面向对象的编程)它能是其代码更加简洁易于维护并且具有更强的可重性

1、PHP面向对象(三)

四、OOP的高级实践

4.3 Static-静态成员

<?php
date_default_timezone_set("PRC");
/**
 * 1. 类的定义以class关键字开始,后面跟着这个类的名称。类的名称命名通常每个单词的第一个字母大写。
 * 2. 定义类的属性
 * 3. 定义类的方法
 * 4. 实例化类的对象
 * 5. 使用对象的属性和方法
 */
class Human{
 public $name;
 public $height;
 public $weight;
public function eat($food){
 echo $this->name."'s eating ".$food."<br/>";
 }
}
class Animal{
 public $kind;
 public $gender;
}
class NbaPlayer extends Human{
 // 类的属性的定义
public $name="Jordan";// 定义属性
public $height="198cm";
 public $weight="98kg";
 public $team="Bull";
 public $playerNumber="23";
 private $age="44";
 public $president="David Stern";
 // 类的方法的定义
public function changePresident($newP){
 $this->president=$newP;
 }
 public function run() {
 echo "Running<br/>";
 }
public function jump(){
 echo "Jumping<br/>";
 }
 public function dribble(){
 echo "Dribbling<br/>";
 }
 public function shoot(){
 echo "Shooting<br/>";
 }
 public function dunk(){
 echo "Dunking<br/>";
 }
 public function pass(){
 echo "Passing<br/>";
 }
 public function getAge(){
 echo $this->name."'s age is ".$this->age;
 }
 function __construct($name, $height, $weight, $team, $playerNumber){
 print $name . ";" . $height . ";" . $weight . ";" . $team . ";" . $playerNumber."\n";
 $this->name = $name; // $this是php里面的伪变量,表示对象自身
$this->height = $height; // 通过$this可以设置对象的属性值
$this->weight = $weight;
 $this->team = $team;
 $this->playerNumber = $playerNumber;
 }
}
/**
 * 1. 类实例化为对象时使用new关键字,new之后紧跟类的名称和一对括号。
 * 2. 使用对象可以像使用其他值一样进行赋值操作
 */
$jordan = new NbaPlayer("Jordan", "198cm","98kg","Bull","23");echo "<br/>";
$james=new NbaPlayer("James", "203cm", "120kg", "Heat", "6");echo "<br/>";
// 访问对象的属性使用的语法是->符号,后面跟着属性的名称
echo $jordan->name."<br/>";
// 调用对象的某个方法使用的语法是->符号,后面跟着方法的名称和一对括号
$jordan->run();
$jordan->pass();
//子类调用父类的方法
$jordan->eat("apple");
//试着调用private,直接以及通过内部的public函数
//$jordan->age;
$jordan->getAge();echo "<br/>";
$jordan->changePresident("Adam Silver");
echo $jordan->president."<br/>";
echo $james->president."<br/>";
 直接从上述例子开始吧。
这里想得到的是,把两位对象的某一个变量同时变掉。——用static
public static $president="David Stern";
 // 类的方法的定义
public static function changePresident($newP){
static::$president=$newP;//这里static换成self更符合规范
}

注意这里static的位置,以及,方法内的::

调用的方法也有所变动。

echo NbaPlayer::$president;echo "<br/>";
NbaPlayer::changePresident("Adam Silver");
echo NbaPlayer::$president;echo "<br/>";

也就是像之前说的,静态成员就是个常量,所以不针对某个具体的对象(不受具体对象的约束)——基于此,定义&赋值&调用都不需要具体的对象参与。

内部调用要用self/static::$...

外部调用,类名::

用处就是所有的对象共用的数据。

--如果内部调用时,变量在父类中

比如说,在上述例子中,父类human中写这么一句话

public static $aaa="dafdfa";

 然后在子类nbaplayer中,调用父类的静态成员时,要

echo parent::$aaa;

而外部调用,按照上面说的,类名::,所以,直接父类类名即可

echo Human::$aaa;

--其他

在静态方法中,是无法访问其他变量的,也就是说,不能用$this->

--小结

/**
 * 静态成员
 * 1. 静态属性用于保存类的公有数据
 * 2. 静态方法里面只能访问静态属性
 * 3. 静态成员不需要实例化对象就可以访问
 * 4. 类内部,可以通过self或者static关键字访问自身的静态成员
 * 5. 可以通过parent关键字访问父类的静态成员
 * 6. 可以通过类名称在外部访问类的静态成员
 */

4.4 Final成员

--问题

不希望某个类拥有子类;

不希望子类修改父类中的某个变量(避免重写?)

--final

》=php5版本

举个例子

class BaseClass{
 public function test(){
 echo "BaseClass::test called<br/>";
 }
public function test1(){
 echo "BaseClass::test1 called<br/>";
 }
}
class ChildClass extends BaseClass{
 public function test(){
 echo "ChildClass::test called<br/>";
 }
}
$obj=new ChildClass();
$obj->test();

 子类中编写跟父类中完全一致的方法名(内容可以不同),会完成对父类方法的重写!

所以,不希望被重写的父类中的方法,写上final

final public function test(){

依此类推,对于不想有子类的父类,在类名那里写上final

final class BaseClass{

--小结

/**
 * 重写和Final
 * 1. 子类中编写跟父类完全一致的方法可以完成对父类方法的重写
 * 2. 对于不想被任何类继承的类可以在class之前添加final关键字
 * 3. 对于不想被子类重写(overwrite, 修改)的方法,可以在方法定义前面添加final关键字
 */

4.5 数据访问

先把final都去掉

--parent

然后再子类中的方法中写

parent::test();

运行后会发现,依然可以通过parent的关键字调用父类中,即使是被重写的数据

--self

然后在父类中的方法test中写

self::test1();

运行后,发现self可以调用同一个类中的数据(其他方法/静态变量/常量const)

--小结

/**
 * 数据访问补充
 * 1. parent关键字可以用于调用父类被重写的类成员
 * 2. self关键字可以用于访问类自身的成员方法,也可以用于访问自身的静态成员和类常量;不能用于访问类自身的属性;访问类常量时不用在常量名称前面加$符号
 * 3. static关键字用于访问类自身定义的静态成员,访问静态属性时需要在属性名前面添加$符号
 */

4.6 对象接口

非常重要!!!

--问题

不同的类,有着相同的行为,但相同的行为又有着不同的实现方法。

比如人和动物都会吃东西,但吃的方式方法又不太一样。

--定义

接口就是把不同类的共同行为进行了定义,然后在不同的类里面实现不同的功能。

--栗子 

//定义一个接口

interface ICanEat{

 public function eat($food);

}

可以看到,接口中并没有方法的具体实现,但必须有方法!

那么,下面是,“人类会吃”

//具体对象,连接到接口
class Human implements ICanEat{
public function eat($food){
 echo "Human eating ".$food.".<br/>";
 }
}
$obj=new Human();
$obj->eat("shit");

请忽略我给出的“食物”。

注意,不再用extends,而是implements。然后,同样是方法名的完全相同。然后,对象必须/最好实现方法。

继续

interface ICanEat{
 public function eat($food);
}
//具体对象,连接到接口
class Human implements ICanEat{
public function eat($food){
 echo "Human eating ".$food.".<br/>";
 }
}
class Animal implements ICanEat{
 public function eat($food){
 echo "Animal eating ".$food.".<br/>";
 }
}
$obj=new Human();
$obj->eat("shit");
$monkey=new Animal();
$monkey->eat("banana");

 让动物也吃起来!

--逆向操作

判断某个对象是否连接了某个接口。

var_dump($obj instanceof ICanEat);

会返回boolean值。

--更多的栗子

interface ICanPee extends ICanEat{
 public function pee();
}
class Demon implements ICanPee{
 public function pee(){
 echo "Can demon pee?";
 }
 public function eat($food){
 echo "Can demon eat ".$food;
 }
}
$ghost=new Demon();
$ghost->pee();
$ghost->eat("shit");

 接口本质上也是类,可以被继承/继承,但是使用继承接口的接口,所有父类、“爷类”的方法都要有具体实现。

--小结

/**
 * 接口
 * 1. 接口的基本概念和基本使用方法
 * 2. 接口里面的方法没有具体的实现
 * 3. 实现了某个接口的类必须提供接口中定义的方法
 * 4. 不能用接口创建对象,但是能够判断某个对象是否实现了某个接口
 * 5. 接口可以继承接口(interface extends interface)
 * 6. 接口中定义的所有方法都必须是公有,这是接口的特性。
 */

aaaaaaaaaaaaaa

bu xiang xie le....................

ming tian yao ge ..............

以上内容是小编给大家介绍的PHP面向对象详解(三),希望大家喜欢。

PHP 相关文章推荐
如何在PHP中使用Oracle数据库(5)
Oct 09 PHP
PHP采集相关教程之一 CURL函数库
Feb 15 PHP
thinkphp3.0 模板中函数的使用
Nov 13 PHP
解析php中session的实现原理以及大网站应用应注意的问题
Jun 17 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
Aug 21 PHP
PHP使用xmllint命令处理xml与html的方法
Dec 15 PHP
PHP+MYSQL实现用户的增删改查
Mar 24 PHP
PHP合并discuz用户脚本的方法
Aug 04 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
Aug 27 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
Dec 14 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
Aug 31 PHP
PHP创建自己的Composer包方法
Apr 09 PHP
php生成高清缩略图实例详解
Dec 07 #PHP
php冒泡排序与快速排序实例详解
Dec 07 #PHP
PHP常用工具类大全附全部代码下载
Dec 07 #PHP
PHP+ajax分页实例简析
Dec 07 #PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
Dec 07 #PHP
php+ajax无刷新分页实例详解
Dec 07 #PHP
64位windows系统下安装Memcache缓存
Dec 06 #PHP
You might like
如何获得PHP相关资料
2006/10/09 PHP
php ftp文件上传函数(基础版)
2010/06/03 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
2013/03/26 PHP
解析PHP工厂模式的好处
2013/06/18 PHP
php生成excel列名超过26列大于Z时的解决方法
2014/12/29 PHP
JS网络游戏-(模拟城市webgame)提供的一些例子下载
2007/10/14 Javascript
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
JavaScript判断DOM何时加载完毕的技巧
2012/11/11 Javascript
javascript面向对象特性代码实例
2014/06/12 Javascript
Javascript基础教程之数组 array
2015/01/18 Javascript
js鼠标滑过图片震动特效的方法
2015/02/17 Javascript
JS制作图形验证码实现代码
2020/10/19 Javascript
jquery 动态增加删除行的简单实例(推荐)
2016/10/12 Javascript
关于Function中的bind()示例详解
2016/12/02 Javascript
js实现PC端根据IP定位当前城市地理位置
2017/02/22 Javascript
整理关于Bootstrap列表组的慕课笔记
2017/03/29 Javascript
详解如何让Express支持async/await
2017/10/09 Javascript
微信小程序视图容器(swiper)组件创建轮播图
2020/06/19 Javascript
Bootstrap FileInput实现图片上传功能
2021/01/28 Javascript
举例讲解Python中is和id的用法
2015/04/03 Python
python在非root权限下的安装方法
2018/01/23 Python
Python类的继承、多态及获取对象信息操作详解
2019/02/28 Python
Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)
2019/06/28 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
python matplotlib.pyplot.plot()参数用法
2020/04/14 Python
Python-for循环的内部机制
2020/06/12 Python
Pycharm plot独立窗口显示的操作
2020/12/11 Python
VICHY薇姿美国官方网站:欧洲药房第一的抗衰老品牌
2017/11/22 全球购物
法律专业自我鉴定
2013/10/03 职场文书
网络专业学生个人的自我评价
2013/12/16 职场文书
学徒工职责
2014/03/06 职场文书
产品设计开发计划书
2014/05/07 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
故意伤害辩护词
2015/05/21 职场文书
Python接口自动化之文件上传/下载接口详解
2022/04/05 Python