面向对象的程序设计思路是现代程序设计由面向过程演变面向对象的必然趋势,所以面向对象的而设计思路必然有它不同的时代意义,必然有着不同面向过程的不同历史使命,而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 面向对象思想的更多相关文章

  1. 【重走Android之路】【Java面向对象基础(三)】面向对象思想

    [重走Android之路][基础篇(三)][Java面向对象基础]面向对象思想   1 面向对象的WWH   1.1 What--什么是面向对象         首先,要理解“对象”.在Thinkin ...

  2. java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述

    在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...

  3. linux设备驱动归纳总结(八):3.设备管理的分层与面向对象思想【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-110738.html linux设备驱动归纳总结(八):3.设备管理的分层与面向对象思想 xxxxxx ...

  4. linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现【转】

    本文转自自:http://blog.chinaunix.net/uid-25014876-id-59418.html linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现 一. ...

  5. 使用面向对象思想处理cookie

    实例:使用面向对象思想处理cookie如果读者对cookie 不熟悉,可以在第七章学习它的使用方法,虽然在那里创建了几个通用函数用于cookie 的处理,但这些函数彼此分离,没有体现出是一个整体.联想 ...

  6. 原生JS面向对象思想封装轮播图组件

    原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能 ...

  7. c语言里用结构体和指针函数实现面向对象思想

    一.基础研究 观察如下两个程序a.c和b.c: A.c: B.c: 这两个程序都是要实现在屏幕上第10行40列打印一个绿色的字符c: 这两个程序的数据组织方式是一样的,都是使用结构体,而且对共性和个性 ...

  8. C#基础知识-面向对象思想之继承(八)

    上一篇的标题编程思想我觉得不是很符合主题,因为编程思想的范围太大了,不仅仅是封装 继承 多态,所以比较符合主题的应该是面向对象思想.这一篇中将继续叙述面向对象思想中的继承. 从字面来看继承表达的意思已 ...

  9. 谈一谈原生JS中的【面向对象思想】

           [重点提前说:面向对象的思想很重要!]         最近开始接触学习后台的PHP语言,在接触到PHP中的面向对象相关思想之后,突然想到之前曾接触的JS中的面向对象思想,无奈记性太差, ...

随机推荐

  1. Bean行为破坏之前,

    而在自定义初始化阶段的行为之一似.Spring此外,它提供了两种方法来定制Bean具体的行为破坏之前. 例如下列: 1.采用destroy-method属性. 2.达到DisposableBean介面 ...

  2. Formview单文档或对话框项目接受不到按键消息的解决办法

    当对话框或formview界面上有控件时,由于焦点在控件上,因此wm_char,wm_keydown等按键消息会被控件捕获,而导致对话框或formview无法接受该类按键消息.这时候通常的解决方法是在 ...

  3. wpf绑定全局静态变量(mvvm)

    原文 wpf绑定全局静态变量(mvvm) 在实际的开发中,有一些集合或者属性可能是全局的,比如当你做一个oa的时候,可能需要展示所有的人员,这时这个所有的人员列表显然可以作为全局参数,比如这里有一个全 ...

  4. shell问题集合

    1.syntax error near unexpected token `then' if后要有空格,[] 中括号的开头和结尾要有空格! [ $1-eq"root" ]中括号中的 ...

  5. SWFTools PDF转换为SWF

    前言 在iText 制作PDF这篇博文中只是简单的介绍了如何制作PDF,为了能让PDF在Web页面中显示,我还需要通过SWFTools工具将PDF文件转换为SWF文件,然后通过SWF文件显示在Web网 ...

  6. mod_timer函数及其他定时器函数

    当一个定时器已经被插入到内核动态定时器链表中后,我们还能够改动该定时器的expires值.函数mod_timer()实现这一点 改动注冊入计时器列表的handler的起动时间 int mod_time ...

  7. 获取浏览器的ip以及省份

    <script src="http://pv.sohu.com/cityjson?ie=utf-8"></script> <script type=& ...

  8. javascript自定义事件讲解

    自定义事件 什么是自定义事件? 自定义事件:这要是跟函数有关系,就是让函数能够具备事件的某些特性 为什么要使用自定义事件? 有利于多人协作开发代码,一同开发不冲突 如何去挂载自定义事件与事件函数? 1 ...

  9. Ninject之旅之十四:Ninject在ASP.NET Web Form程序上的应用(附程序下载)

    摘要 ASP.NET Web Forms没有像MVC那样的可扩展性,也不可能使它创建UI页面支持没有构造函数的的激活方式.这个Web Forms应用程序的的局限性阻止了它使用构造函数注入模式,但是仍能 ...

  10. VoIP应用在Ubuntu 14.04下编译FFmpeg libX264及PJSIP

    PJSIP是一个开源的SIP协议栈.它支持多种SIP的扩展功能,可说算是最目前流行的SIP协议栈之一了.  它实现了SIP.SDP.RTP.STUN.TURN和ICE.PJSIP作为基于SIP的一个多 ...