PHP学习(三)----面向对象

 

首先,还是建立一个好的理解模型: 

  1.什么是面向对象?

    面向对象分为两个部分,那就是:什么是对象和什么是面向?

    什么是对象: 对象的出现就是为了用代码更好的绘制我们现有的世界.那到底什么是对象呢? 一句话,万物皆对象!不管是真实存在的还是抽象的事物,都是对象. 都可以把他们抽象为数据模型(属性或成员变量)和对象的行为这两个部分.

    什么是面向:在写代码的时候,把对象放在第一位, 什么都是对象,什么都可以做成对象.把生活中的对象都用对象的方式进行存储(属性和方法).

  2.对象通过自身的属性和行为,以及与其他对象的交互,从而实现利用对象对世界的描述

  只是简单的片面的理解,以后还得深究和丰富

  3.面向对象的三大特性:

    封装:把对象的属性和操作(或服务或行为或方法)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节(尽可能的隐藏属性和方法).从而达到保证了数据的完整性和数据的安全性;

    继承:继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力.主要的目的就是提高代码的重用性.在PHP中,继承将会影响到类与类,对象与对象之间的关系。比如,当      扩展一个类,子类就会继承父类所有公有的和受保护的方法。除非子类覆盖了父类的方法,被继承的方法都会保留其原有功能。继承对于功能的设计和抽象是非常有用的,而且对于类似的对象增加新功能      就无须重新再写这些公用的功能。

    多态:父类引用指向子类实例,由于子类的不同,所表现出的差别(这个属性是最不好理解的).试着去理解:举一个生活中的例子:比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文      档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。

      实现多态的条件:(一)要有继承;(二)要有重写;(三)父类引用指向子类对象。也可以简单理解为父类在不同情况先表现出来的不同的形态

      作用:消除类型之间的耦合关系。(不是很懂)

  4.语法:

    (1)建立一个对象需要一个类.类就是对对象的抽象,主要是用力实例化各种各样的对象的.对于类要尽量: 对内高聚合和对外低耦合.

     什么是类:每个类的定义都以关键字 class 开头,后面跟着类名,后面跟着一对花括号,里面包含有类的属性与方法的定义。

  1. 1 class SimpleClass
  2. 2 {
  3. 3 // property declaration
  4. 4 public $var = 'a default value' ;
  5. 5
  6. 6 // method declaration
  7. 7 public function displayVar () {
  8. 8 echo $this -> var ;
  9. 9 }
  10. 10 }

    上面创建了一个类,下面我们来实例化一个对象

  1. 1 $instance = new SimpleClass();//实例化一个对象

    (2)$this 关键字

  1. 1 class A
  2. 2 {
  3. 3 function foo ()
  4. 4 {
  5. 5 if (isset( $this )) {
  6. 6 echo '$this is defined (' ;
  7. 7 echo get_class ( $this );
  8. 8 echo ")\n" ;
  9. 9 } else {
  10. 10 echo "\$this is not defined.\n" ;
  11. 11 }
  12. 12 }
  13. 13 }
  14. 14
  15. 15 class B
  16. 16 {
  17. 17 function bar ()
  18. 18 {
  19. 19 // Note: the next line will issue a warning if E_STRICT is enabled.
  20. 20 A :: foo ();
  21. 21 }
  22. 22 }
  23. 23
  24. 24 $a = new A ();
  25. 25 $a -> foo ();
  26. 26
  27. 27 // Note: the next line will issue a warning if E_STRICT is enabled.
  28. 28 A :: foo ();//这样虽然可以调用但是不是标准的,会出现警告
  29. 29 $b = new B ();
  30. 30 $b -> bar ();
  31. 31
  32. 32 // Note: the next line will issue a warning if E_STRICT is enabled.
  33. 33 B :: bar ();

结果:

$this is defined (A)//说明$this是代表对象本身

$this is not defined.

$this is defined (B)

$this is not defined.

    (3)new关键词,用来实例化对象

  1. 1 $assigned = $instance ;//相当于传递的对象,就是同一个对象有两个名字 $instance=mull,不会调用析构函数,只有assingned和$instance都是null的时候才调用析构函数,因为他们是两个对象
  2. 2 $reference =& $instance ;//引用被传递,还是一个对象,引用地址和实例对象完全相同,$reference=null,调用析构函数销毁对象,因为他们实际是一个对象

      在实例对象的时候,要用到构造函数,每一个类都有一个默认的构造函数,就是从Object继承过来的构造函数,声明自己构造函数就是重写了父对象的构造函数

      __construct(){};------这就是构造函数(带__是系统的函数,又称为魔法函数,PHP5之后出现的,之前就是和JAVA中很类似的构造函数);构造函数的主要作用就是 来实例化对象并对对象进行初始化的

      __destruct(){};-------这是析构函数,与构造函数相对性,用来销毁对象的,当对象没有任何引用的时候,自动调用该函数,也可以声明对象为空($obj=null)来手动调用该函数

  1. 1 class SimpleClass{
  2. 2 public $name="小明";
  3. 3 public $age=28;
  4. 4 public function __construct($name,$age){
  5. 5 echo "我被调用了!";
  6. 6 $this->name=$name;
  7. 7 $this->age=$age;
  8. 8 }
  9. 9 }
  10. 10 $newClass=new SimpleClass("小张",40);
  11. 11 echo "<br/>";
  12. 12 echo $newClass->name;
  13. 13 echo "<br/>";
  14. 14 echo $newClass->age;

结果:

我被调用了!
小张
40

      (4)extends关键词,单继承:被继承的方法和属性可以通过用同样的名字重新声明被覆盖,但是如果父类定义方法时使用了 final,则该方法不可被覆盖。在子类中,可以通过 parent:: 来访问被覆盖的方法或属性。当覆盖方法时,参数必须保持一致否则 PHP 将发出 E_STRICT 级别的错误信息。但构造函数例外,构造函数可在被覆盖时使用不同的参数。

      访问权限:

        对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问。类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。

        类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。

     (5)static关键字

      声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。为了兼容 PHP 4,如果没有指定访问控制,属性和方法默认为公有。由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。静态属性不可以由对象通过 -> 操作符来访问。用静态方式调用一个非静态方法会导致一个 E_STRICT 级别的错误。就像其它所有的 PHP 静态变量一样,静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象。

     (6)final关键字

      PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。 

     (7)const关键字

      来声明常量,常量属于类,可以用类名进行访问;常量在定义的时候就被初始化,且以后不能被改变,没有$符号   

  1. 1 class SimpleClass{
  2. 2 const PI=3.1415926;
  3. 3 }
  4. 4 echo SimpleClass::PI;
  5. 5 //3.1415926

还有很多需要理解的东西------2016.3.22

 面向对象和面向过程的区别(得好好体会)

  1. 1 //计算两个圆的面积差
  2. 2 //面向过程:
  3. 3 $radius_1=20;
  4. 4 $radius_2=40;
  5. 5 $area_1=3.14*$radius_1*$radius_1;
  6. 6 $area_2=3.14*$radius_2*$radius_2;
  7. 7 echo "面积差是:".($area_2-$area_1);
  8. 8 echo "<br/>";
  9. 9 //面向对象:
  10. 10 class circle{
  11. 11 //定义圆的类
  12. 12 public $radius;
  13. 13 public function getArea(){
  14. 14 return 3.14*$this->radius*$this->radius;
  15. 15 }
  16. 16 function __construct($radius){
  17. 17 $this->radius=$radius;
  18. 18 }
  19. 19 }
  20. 20 //实例不同的圆对象
  21. 21 $circle_1=new circle(40);
  22. 22 $circle_2=new circle(20);
  23. 23 echo "面积差是:".($circle_1->getArea()-$circle_2->getArea());

php整理(三): 面向对象的更多相关文章

  1. Javascript基础回顾 之(三) 面向对象

    本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者 ...

  2. 《JavaScript语言入门教程》记录整理:面向对象

    目录 面向对象编程 实例对象与 new 命令 this关键字 对象的继承 Object对象的方法 严格模式(strict mode) 本系列基于阮一峰老师的<JavaScrip语言入门教程> ...

  3. PHP学习(三)----面向对象

    首先,还是建立一个好的理解模型: 1.什么是面向对象? 面向对象分为两个部分,那就是:什么是对象和什么是面向? 什么是对象: 对象的出现就是为了用代码更好的绘制我们现有的世界.那到底什么是对象呢? 一 ...

  4. Python模块整理(三):子进程模块subprocess

    文章 原始出处 http://ipseek.blog.51cto.com/1041109/807513. 本来收集整理网络上相关资料后整理: 从python2.4版本开始,可以用subprocess这 ...

  5. Java基础学习(三)—面向对象(上)

    一.理解面向对象       面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位,而方法或者说是 ...

  6. PHP整理--PHP面向对象

    一.定义类 使用关键字class定义 二.实例化对象  使用关键字new实例化对象 三.类成员的添加和访问 (1)类成员:属性.方法.常量 (2)添加成员需要使用修饰符  public.protect ...

  7. CSS3 Flex布局整理(三)-项目属性

    一.Flex布局中 Flex Item属性控制,可以指定显示顺序.剩余空间的放大,缩小.交叉轴的排列 1.order:定义项目的排列顺序,数值越小,排列越靠前,默认为0.类似z-index 2.fle ...

  8. HTML5 <Audio>标签API整理(三)

    一.浏览器支持 Internet Explorer 9+, Firefox, Opera, Chrome, 和 Safari 都支持 <audio> 元素. 注意: Internet Ex ...

  9. python基础整理4——面向对象装饰器惰性器及高级模块

    面向对象编程 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程 面向对象编程(Object Oriented Pro ...

随机推荐

  1. ios7.0结合storyborad实现页面跳转的总结

    折腾了一整天,本文总结一下ios7.0页面跳转有关的内容 storyboard的潜规则 我接触ios很晚,环境已经是xcode5+ios7,所以对以前的IOS开发模式并不了解.在网上查阅了很多资料,发 ...

  2. ios开发--旋转、移动、缩放手势实例代码

    代码如下: // 添加所有的手势 - (void) addGestureRecognizerToView:(UIView *)view { // 旋转手势 UIRotationGestureRecog ...

  3. (Android学习系列)三,窗口的常用事件

    设置窗口标题事件和在Activity之间跳转 新建一个项目,新建两个Activity:MainActivity,TitleActivity ,然后再AnroidManifest.xml 中注册Titl ...

  4. VB数据库经典实例总结(二)

    大家先看一张似图非图的图. 我们先称它为“过程”也许有不对的地方,在我学数据库到这个阶段.到这个刚刚接触.初生牛犊不怕虎的阶段对它的理解是这样的.所有的都是这个过程.只是在这中间掺杂了一些知识点(我们 ...

  5. Express/Koa/Hapi

    Express/Koa/Hapi 本文翻译自: https://www.airpair.com/node.js/posts/nodejs-framework-comparison-express-ko ...

  6. HTML & XML 转义字符

    HTML & XML 转义字符 HTML中<, >,&等有特殊含义,(前两个字符用于链接签,&用于转义),不能直接使用.使用这三个字符时,应使用它们的转义序列,如下 ...

  7. Text selection in div(contenteditable) when double click

    背景: 在最近项目中,碰到一个问题:有一个可编辑的div需要双击时可编辑,blur或者回车时将编辑结果保存.你可能注意到双击时,文字会被选中,可编辑区域不会focus到光标位置.考虑到兼容性问题,写了 ...

  8. js遍历集合

    首先,描述一下问题.由于需要后台取出数据,遍历展示在table中,大体如下: 后台取出的是 Map<String , List<Object>>,下面是我写得比较朴素一点的写法 ...

  9. mongodb 的安装历程

    mongo 安装历程 mongo的安装方法有千万种,只有一种让我觉得还不错,说说安装过程中的一点心德. 方法一:源码安装,千万别用这种方法,尼马我用虚拟机编译了一下午,竟然没有编译完,强制关机,第二天 ...

  10. Ext学习-前后交互模式介绍

    在前后台交互模式的介绍中,实际上就是Store中Proxy相关的内容,比如Ajax提交. 所以详细的文档请参考: Ext学习-基础概念,核心思想介绍   中关于数据模型和MVC结构部分. 作者:sdj ...