PHP面向对象编程

面向对象编程的基础知识
    什么叫面向对象(OOP  Object Oriented Programming), 起初,“面向对象”是专指在程序设计中采用封装、继承、多态等设计方法。但这个定义显然不能再适合现在情况。 面向对象的思想已经涉及到软件开发的各个方面。如,面向对象的分析(OOA,Object Oriented Analysis),面向对象的设计(OOD,Object Oriented Design)、以及我们经常说的面向对象的编程实现(OOP,Object Oriented Programming)。
面向对象的基本概念 
     
对象 :对象是人们要进行研究的任何事物,它不仅能表示具体的事物还可以是抽象的事物.
对象的属性和行为 :对象用数据值来描述状态。 行为就是操作可以改变对象的状态.
    类 :具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,类实际上就是一种数据类型。 
    类的属性与方法通常又统称为类的成员。
面向对象的特征 
    封装:类定义将其说明(用户可见的外部接口)与实现(用户不可见的内部实现)显式地分开,其内部实现按其具体定义的作用域提供保护, 继承是指子类可以拥有父类所有的属性和方法, 除了这些以外,子类自己还可以创建新的方法和属性
    多态:同一操作作用在不同对象上所的结果不一样,这 就是多态。也就是同一函数在不同的对象中所实现的功能不一样。
  创建类
定义类
  class ClassName
  {
  //包含属性和方法
  }
 class:关键字,说明声明了一个类
 ClassName: 类名。
满足标识符 的规定
图片
  创建对象
     
对象是通过类实例化出来的, 使用new 关键字来生成一个对象
    语法:
       $对象名称= new 类名称();
    如定义了Person后,创建该类的对象
    $p1=new Person();
    $p2=new Person();
使用对象中的成员
  PHP 对象中的成员有两种一种是成员属性,一种是成员方法.访问对象中的成员就要使用一个特殊的操作符“->”来完成对象成员的访问.
语法:
对象->属性
对象->方法
如:$p1->name; $p1->age; $p1->sex;
     $p1->say(); $p2->run();
  $this 的使用
在类的外部,访问对象中的成员,可通过“对象->成员”的形式
在类的内部,访问类的成员(属性或方法), 使用
  ”$this->成员“,代表本对象的引用
如:  
图片 
  构造方法
构造方法是特殊方法。当使用new 这个关键字来创建一个对象时,它将自动调用构造方法。
PHP5中,构造方法的名称统一为__construct( )。 PHP4中如果一个方法与类同名时,这个方法将成为构造方法.
与类同名的构造方法在PHP5 中仍然可以用,但现在很少有人用,这样做的好处是可以使构造函数独立于类名,当类名发生改变时不需要改相应的构造函数
构造方法可以给对象做初始化的工作
格式:function __construct ( [参数] ) { ... ... }
注意:
当与类同名的构造方法和__construct()同时存在时,后者优先
调用有参构造方法创建对象,必须向构造方法中传参。
$p=new Person("张三",20);
定义构造方法时可以给参数设置默认值,如此,可以调用无参的构造方法创建对象。
图片
  析构方法
PHP5中,引入析构方法的概念,可以及时释放对象所占用的内存
析构方法__destruct()
该方法没有参数,也没有返回值
该方法在脚本关闭或对象引用被删除前被调用
析构方法可用于关闭数据库,关闭文件或其他扫尾工作
function __destruct(){
       echo "对象即将销毁";
}
  封装
 
封装是面向对象三大特征之一,含义有两层:
把对象的属性和方法结合在一起
尽可能隐藏对象的内部细节,对外只保留有限的接口
反映在设计上就是,封装可以保证对象以外的部分不能随意读写对象的内部数据
PHP中封装涉及到的三个关键字public ,protected,private
如:
图片 
类成员的可见性
 
为控制类成员的可见性,限定对属性和方法的访问,使用以下三种访问修饰符
public 表示全局,类内部外部子类都可以访问
protected表示受保护的,只有本类或子类或父类中可以访问
private表示私有的,只有本类内部可以使用
  继承
 
PHP中,只支持单重继承
通过继承生成的子类,将自动拥用父类的有关属性和方法(父类中的私有成员除外)
子类还可以定义自己的新属性和相应的新方法
必要时,子类可重新声明父类的同名属性或重新定义父类的同名方法
继承使用extends关键字
     class B extends A{
         
   }
子类覆盖父类中同名的方法时,在子类里可以使用如下两个方法调用父类方法:
一种是使用父类的“类名::”来调用父类中被覆盖的方法;
一种是使用“parent::”的方试来调用父类中被覆盖的方法;
  访问修饰符----protected
protected 的成员不能被该类的外部代码访问。但是该类的子类有访问权限,可以进行属性、方法的读及写操作,该子类的外部代码包括其的子类都不具有访问其属性和方法的权限。
final关键字
Final 可以修饰类和方法
被final修饰的类不能被继承
被final修饰的方法不能被覆盖
static关键字
static 修饰的属性是静态属性,静态属性是属于类的,不属于任何对象实例,这样的属性在内存中只有一个,多个对象共用这一个属性
静态属性不可以由对象通过->操作符来访问。 
静态属性由类名::$静态属性来访问
如:<?php
             class AA{
          public static $a="PHP1";
         }
          echo AA::$a;
           ?>
static修饰的方法称为静态方法,静态方法只能使用静态成员,不能访问非静态成员
静态方法中访问静态属性不能使用$this,而是使用
      self::$静态属性或是类名::静态属性
非静态方法中访问静态属性也是使用
      self::$静态属性或是类名::静态属性
类外访问静态方法可以使用类名::静态方法直接调用,也可以使用对象直接调用
const关键字
PHP中定义常量使用define()函数,但在类里使用const定义常量,常量的值不能被修改
在类外面使用时使用类名::常量名(没有$),方法内使用时使用self::常量名
如:
图片  
  __toString()方法
 
当定义一个对象如:$a=new Student(); echo $a
     这时运行将报错
如果在类中定义__toString()方法,输出对象引用时将自动调用该方法,并输出该方法的返回值,且__toString()方法要有return语句
克隆对象(**)
 如果使用两个或多个一样的对象,可以使用clone关键字克隆出一模一样的对象
如果$t1=new Person();  $t2=$t1,则对其中任何一个做属性的修改,都将影响另一个,而克隆的两个对象互不打扰
PHP5中定义了一个特殊的方法__clone(),在对象克隆时自动调用,如果想克隆后改变原对象的内容,则需在该方法中重写原本的属性和方法。
__call()方法处理调用错误(*)
使用对象调用方法时,如果方法不存在,运行时程序就会退出不能继续执行
如果定义了__call()方法,在试图使用对象调用不存在的方法时,就会提示调用的方法和使用的参数不存在,但程序仍可以继续执行
该方法声明时包含两个参数,第一个参数是string型,是调用不存在方法的方法名(如$fname),第二个参数是array型,是调用的不存在的方法的参数(如$argus)。
__autoload() 函数(*)
调用一个类的时候,必须要先将该类所在的文件引入(include “xxx.php”),如果我们在一个页里调用的类很多,那么我们不得不使用许多的include “xxx.php”。显然这样很麻烦。 
遇到上述情况,只要定义__autoload() 函数可以帮助我们解决问题
该函数不是类方法,是独立的方法,有一个string类型的参数是声明不存在类的类名,如下:
function  __autoload($className){
include $className.".php";
}
抽象方法和抽象类(*)
在类中没有方法体的方法称为抽象方法,即方法名后面没有大括号和具体内容,方法名后直接是分号.抽象方法使用abstract来修饰
如:abstract function fun1();
如果类中有抽象方法,那么该类就要被abstract修饰,该类称为抽象类
抽象类必须有抽象方法,但也可以有成员属性和非抽象的方法
抽象类是一种规范,要求子类去遵守,子类继承抽象类后,按照子类的需要将抽象类中的抽象方法实现
抽象方法是作为子类重载的模板来使用,子类继承抽象类时必须将其中的抽象方法全部实现,否则子类仍然不能被实例化
接口(*)
PHP不支持多继承,为了解决该问题,引入接口的概念
抽象类是一种特殊的类,接口是一种特殊的抽象类,当类中所有的方法都是抽象方法时,此时就换一种称谓,类就叫做接口
接口中不能声明变量,接口中所有的成员都是public权限的,包括子类实现时也要使用public权限
接口的声明
interface 接口名{
}
接口中可以定义常量,且要赋初值。
接口中所有的方法都是抽象的,所以可以将abstract去掉
接口中所有方法的访问权限都是public,所以也可以将public去掉
接口可以使用extends继承其他接口
调用
图片 

猜你喜欢

转载自blog.csdn.net/hyy1206317124/article/details/80063455