怎么看待php 面向对象思想
面向对象的程序设计思路是现代程序设计由面向过程演变面向对象的必然趋势,所以面向对象的而设计思路必然有它不同的时代意义,必然有着不同面向过程的不同历史使命,而php 5以后成功添加面向对象的设计思路其实是必然的过程。面向对象的设计主要思路就是将程序和数据封装在一个叫对象的基本单位之中来提高重用性,灵活性和可扩展性。他同面向过程和函数式编程的设计思路一样是编程语言的一种范式,是一种规范编程程序的设计方法。只是各自承担着不同的规范职责而已。
对象是基本单位,对象的封装需要类来实现,这才能将对象一个个区别开来。对象和类的共同存在的,对象没有类就像一个家庭没有人一样没有意义,而类没有对象也就像一个孩子没有家一样无法存活。
php的面向对象其实并不会像java或者c++那样完美展现面向对象的特质,面向对象其实只是php的一个可支持的设计思路,php其实是一种提倡面向过程的的语言,很久以来面向对象的思路不被php程序员接受的,很多人对面向对象的思路表式明显的排斥,这是面向对象在php不能够完美的体现的主要原因。
下面具体讲讲php面向对象的具体实现,
1.类的申明
同样由class为类的关键字,申明类中需要定义变量,定义一个构造函数,php的构造函数的定义不同于其他的语言,统一用一个自带的神奇函数_construct()来对其函数进行初始化工作。当然也可以定义与之对应的析构函数_destruct(),用于销毁对象,释放函数。在类的申明中当需要其他方法,需要在此定义。
2.类的实例化
将申明好的类new创建一个新对象,在内存中分配一个空间给这个类,给这个类去一个新的名字,就这样这个对象才可以真的的而被使用。
3.使用对象
就像函数的调用一样,在对象需要的使用对象就可以了,就是对实例化的对象和对象中的属性或者方法利用对象运算符(->)连接,这样就可以和函数一样就行相应的调用。
php的对象实现和其他面向对象语言没有太大的差异,php中有一些内置的神奇方法,如构造函数_construct()和析构函数_destruct();他们具有特殊意义或功能的方法,无需定义。具有各自特定的功能。常以"_"开头。
常见的神奇方法:
1._autoload() 自动加载方法,不用知道申明类的文件在哪里,只需要知道文件名,就可以自动加载该文件。这个方法在结构复杂的项目中有着很明显作用
function _autoload($classname){
include strtolower($classname).'.php';
}
2._set()和_get() 前者用于对象属性值的设置,后者是用于对象属性取值。
public function _set($name,$value){
echo "setting $name to $value \r\n";
$this->$name=$value;
}
public function _get($name){
if(!isset($this->$name))
{
echo "未设置";
9 $this->$name="正在为你设置默认值"; }
return $this->$name;
}
3._call()和_callStatic() 前者是为防止调用不可访问的方法出错。当调用一个不可访问的方法时这个方法自动被调用。其原型为:mixed_call(string $name,array $argumets) 其中$name是要调用的方法名,$argumets是包含要传递的所有参数的一个数组。
public function _call($name,$arguments)
{
switch(count($arguments)
{
case 2:
echo "$arguments[0]*$arguments[1].PHP_EOL;
break;
case 3:
echo array_sum($arguments).PHP_EOL;
break;
default:
echo '参数不对'.PHP_EOL;
break;
}
}
面向对象中的继承,组合和多态都是解决程序重复的重要方法,具有公共代码重用性。下面就谈谈php类的重用
1.继承和组合
这是两个很容易混淆的概念,他们具有很大的相似之处,两者都是提高代码的可重用性,只是两者的设计思路不是不一样的,类与类之间的关系是不同的,继承是父与子的关系,而组合是一种需要,整体和局部的关系。就像是父亲和家庭的关系。有时候两种对象之间既可以建立继承关系又可以建立组合关系。这时候我们是更倾向于使用组合。因为继承有以下几个问题:
1.继承破坏了封装性,对象的封装本来就是为了使对象之间相互独立,各自封装起来。子类继承父类所有属性和方法,但是有时子类并不是继承父类所有的属性和方法的。比如父类是鸟类,有飞翔的属性,但是子类燕子和鸵鸟都继承了父类的飞行,但是鸵鸟是不具有飞的能力,但是他可以和燕子一样,这样无法区别两个子类,这就不符合类的封装性。但是组合就很好解决这个问题,鸵鸟并没有父类的飞的属性。
2.继承是紧耦合的, 继承使子类和父类捆绑在一起,但是组合仅仅通过唯一接口和外部进行通信。
3.继承扩展复杂,随着继承层数增加和子类增加。将涉及大量方法重写,使用组合可以根据类型约束实现动态组合,减少代码。
2.多态
顾名思义多态就是多种状态,多种结果。在php中多态常见于一个父类有两个不同子类。可以通过父类的不同对象调用不同的子类方法。这就是同一类型,不同结果。
php面向对象还具有接口,反射两种表现形式,但由于本人对这两个不是很了解,就不在此断章取义了。以后再研究。
总之,php不是一个很好的面向对象的语言,但是随着php的应用越来越广,我相信面向对象在php中回事越来越重要。
怎么看待php 面向对象思想的更多相关文章
- 【重走Android之路】【Java面向对象基础(三)】面向对象思想
[重走Android之路][基础篇(三)][Java面向对象基础]面向对象思想 1 面向对象的WWH 1.1 What--什么是面向对象 首先,要理解“对象”.在Thinkin ...
- java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述
在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...
- linux设备驱动归纳总结(八):3.设备管理的分层与面向对象思想【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-110738.html linux设备驱动归纳总结(八):3.设备管理的分层与面向对象思想 xxxxxx ...
- linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现【转】
本文转自自:http://blog.chinaunix.net/uid-25014876-id-59418.html linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现 一. ...
- 使用面向对象思想处理cookie
实例:使用面向对象思想处理cookie如果读者对cookie 不熟悉,可以在第七章学习它的使用方法,虽然在那里创建了几个通用函数用于cookie 的处理,但这些函数彼此分离,没有体现出是一个整体.联想 ...
- 原生JS面向对象思想封装轮播图组件
原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能 ...
- c语言里用结构体和指针函数实现面向对象思想
一.基础研究 观察如下两个程序a.c和b.c: A.c: B.c: 这两个程序都是要实现在屏幕上第10行40列打印一个绿色的字符c: 这两个程序的数据组织方式是一样的,都是使用结构体,而且对共性和个性 ...
- C#基础知识-面向对象思想之继承(八)
上一篇的标题编程思想我觉得不是很符合主题,因为编程思想的范围太大了,不仅仅是封装 继承 多态,所以比较符合主题的应该是面向对象思想.这一篇中将继续叙述面向对象思想中的继承. 从字面来看继承表达的意思已 ...
- 谈一谈原生JS中的【面向对象思想】
[重点提前说:面向对象的思想很重要!] 最近开始接触学习后台的PHP语言,在接触到PHP中的面向对象相关思想之后,突然想到之前曾接触的JS中的面向对象思想,无奈记性太差, ...
随机推荐
- 使用HAXM为QEMU for Windows加速
QEMU是一款支持多种CPU的虚拟化软件,本身基于软件虚拟化,效率不高,在linux下可以基于KVM加速,据说可以获得接近物理机的性能.网上有很多关于QEMU+KVM的使用说明,但是KVM仅用于lin ...
- Smarty优缺点
Smarty优点: 1. 速度:采用smarty编写的程序可以获得最大速度的提高,这一点是相对于其它的模板引擎技术而言的. 2. 编译型:采用smarty编写的程序在运行时要编译成一个非模板技术的PH ...
- 链接hdf5库出现错误的解决办法
作者:朱金灿 来源:http://blog.csdn.net/clever101 在链接hdf5库出现一些链接错误: error LNK2001: 无法解析的外部符号 _H5T_NATIVE_DOUB ...
- Method for finding shortest path to destination in traffic network using Dijkstra algorithm or Floyd-warshall algorithm
A method is presented for finding a shortest path from a starting place to a destination place in a ...
- 分布式缓存技术PK:选择Redis还是Memcached?
作者:田京昆(腾讯后台研发工程师) 来源:腾云阁(https://www.qcloud.com/community/article/129) Memcached和Redis,作为近些年最常用的缓存服务 ...
- [Songqw.Net 基础]WPF实现简单的插件化开发
原文:[Songqw.Net 基础]WPF实现简单的插件化开发 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei1988/ar ...
- 【Android先进】如何使用数据文件来保存程序
在程序,有许多方法来存储和检索数据,本文,它描述了如何使用文件系统来保存数据编程和读取操作 我直接写了一个帮助类,进行文件的写入和读取操作 /** * 用于在文件里保存程序数据 * * @author ...
- WPF 遍历DataTemplate(获取所有控件)
原文:WPF 遍历DataTemplate(获取所有控件) 情况1:在设定DataTemplate的Name,并且他是在前台表示时,获取DataTemplate里的指定控件. 方法: http://b ...
- Math.Round四舍五入说明
Math.Round默认采用的不是四舍五入法, 而是四舍六入的银行家算法, 如何找回四舍五入法? Math.Round默认采用的不是四舍五入法, 而是四舍六入的银行家算法, 也就是四舍六入五考虑,五 ...
- Adapter的泛型
宗旨:GetView方法放在具体的Activity/Fragment里面实现,其他的均可以复用 /// <summary> /// 通用适配器:新建GetViewEvent委托+OnGet ...