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 相关文章推荐
有关phpmailer的详细介绍及使用方法
Jan 28 PHP
php 在windows下配置虚拟目录的方法介绍
Jun 26 PHP
使用PHP获取当前url路径的函数以及服务器变量
Jun 29 PHP
通过table标签,PHP输出EXCEL的实现方法
Jul 24 PHP
php获取服务器操作系统相关信息的方法
Oct 08 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
Feb 16 PHP
利用PHP实现开心消消乐的算法示例
Oct 12 PHP
详解PHP发送邮件知识点
May 06 PHP
Laravel中9个不经常用的小技巧汇总
Apr 16 PHP
PHP项目多语言配置平台实现过程解析
May 18 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
Dec 16 PHP
详解Laravel服务容器的优势
May 29 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
Zend Framework连接Mysql数据库实例分析
2016/03/19 PHP
Laravel统一错误处理为JSON的方法介绍
2020/10/18 PHP
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
jQuery实现form表单元素序列化为json对象的方法
2015/12/09 Javascript
jQuery插件imgPreviewQs实现上传图片预览
2016/01/15 Javascript
javascript的BOM
2016/05/03 Javascript
jQuery通用的全局遍历方法$.each()用法实例
2016/07/04 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
2016/09/05 Javascript
BootStrap网页中代码显示用法详解
2016/10/21 Javascript
jquery-mobile基础属性与用法详解
2016/11/23 Javascript
解决bootstrap-select 动态加载数据不显示的问题
2018/08/10 Javascript
Layui 带多选框表格监听事件以及按钮自动点击写法实例
2019/09/02 Javascript
js实现简易计算器小功能
2020/11/18 Javascript
[02:06]DOTA2肉山黑名单魔法终结者 敌法师中文配音鉴赏
2013/06/17 DOTA
[34:47]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第一场 11.18
2020/11/18 DOTA
Python yield 小结和实例
2014/04/25 Python
在 Django/Flask 开发服务器上使用 HTTPS
2014/07/03 Python
Python with的用法
2014/08/22 Python
详解Python中dict与set的使用
2015/08/10 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
2018/01/22 Python
Python3 itchat实现微信定时发送群消息的实例代码
2019/07/12 Python
wxPython多个窗口的基本结构
2019/11/19 Python
Python AutoCAD 系统设置的实现方法
2020/04/01 Python
python 字符串的驻留机制及优缺点
2020/06/19 Python
使用css3绘制出各种几何图形
2016/08/17 HTML / CSS
美国最大的农村生活方式零售店:Tractor Supply Company(TSC)
2017/05/15 全球购物
巴西葡萄酒销售网站:Wine.com.br
2017/11/07 全球购物
Under Armour安德玛荷兰官网:美国高端运动科技品牌
2019/07/10 全球购物
俄罗斯电子产品在线商店:UltraTrade
2020/01/30 全球购物
怎样写好自荐信和推荐信
2013/12/26 职场文书
农业开发项目建议书
2014/05/16 职场文书
创意婚礼策划方案
2014/05/18 职场文书
营销学习心得体会
2014/09/12 职场文书
体育运动会广播稿
2014/10/05 职场文书
关于感恩老师的古诗句
2019/08/20 职场文书
PC版《死亡搁浅导剪版》现已发售 展开全新的探险
2022/04/03 其他游戏