PHP面向对象开发基础与实例

来源:互联网 发布:无间道是什么意思知乎 编辑:程序博客网 时间:2024/05/16 05:19



<1> 面向对象涉及到软件开发的各个方面,如面向对象分析(OOA),面向对象的设计(OOD),面向对象的编程实现(OOP)。


<2> 面向对象的要素包括:抽象性;封装性;共享性;强调对象结构而不是程序结构。


<3> 封装,继承与多态是面向对象开发的三大特点,缺一不可。


<4> 类(Class)实际上是对某种类型的对象定义变量和方法的原型。它包含有关对象动作方式的信息,包括它的名称、方法、属性和事件。实际上它本身并不是对象,因为它不存在于内存中。当引用类的代码运行时,类的一个新的实例,即对象,就在内存中创建了。虽然只有一个类,但能从这个类在内存中创建多个相同类型的对象。


可以把类看作“理论上”的对象,也就是说,它为对象提供蓝图,但在内存中并不存在。从这个蓝图可以创建任何数量的对象。从类创建的所有对象都有相同的成员:属性、方法和事件。但是,每个对象都象一个独立的实体一样动作。例如,一个对象的属性可以设置成与同类型的其他对象不同的值。


1.类的成员属性与成员方法


以下为引用内容:
/***
  * desteps.com  Michael
***/
<?php
class Bike{                    // 使用CLASS创建一个类
var $name;                    // 定义成员属性
var $price;
function run () {             //定义成员方法       
return "1200km";
}
}
?>
对象的实例化


以下为引用内容:
/***
  * desteps.com  Michael
***/
<?php
class Bike{                                  // 使用CLASS创建一个类
var $name;                                  // 定义成员属性
var $price;
function run () {                           //定义成员方法       
return "1200km";
}
}
$bk=new Bike();                         // 使用NEW函数实例化对象  
echo $bk->name;                      // 使用->访问对象内容
?>


2.类的封装
出于保护与安全的需要,对程序的相关属性和方法进行隐藏。


封装关键字


public : 全局变量,在类的内外均可访问。
      protected :保护属性,只有在本类、子类、父类中可以访问。
      private :私有属性,只能在当前类中使用。 


使用 public 全局变量,对其定义的对象既可以访问,也可以修改,如:


以下为引用内容:
/***
  * desteps.com  Michael
***/
<?php
class mobile{
public $name;                               // $name 具有公共属性
function __construct($name=""){
$this->name=$name;
}
}
$mb1=new mobile("手机");
$mb1->name="移动电话";             // 可以改变name的值
echo $mb1->name;                      // 可以访问name的值 
?>
使用 private 私有变量,将对象的属性私有化。


以下为引用内容:
/***
  * desteps.com  Michael
***/
<?php
class mobile{
private $name;                                // $name具有私有属性
function __construct($name=""){
$this->name=$name;
}
function call(){                                 // 通过公有的对象方法下$this关键字来访问name的值
 return $this->name."正在开机中,请稍候......";
 }
}
$mb1=new mobile("手机");
echo $mb1->call();                          // 通过访问公有的对象方法call来访问私有了的name的值
?>
3.构造函数与析构函数
系统变量:$this


用来访问当前对象中的对象属性和对象方法。
      [注] $this仅能在当前对象中使用。


构造函数


以下为引用内容:
/***
  * desteps.com  Michael
***/
class Bike{
function __construct(){
//初始化操作
}
}
析构函数


能够在对象释放时自动被调用的方法。
      当对象内部的操作执行完毕时,__destruct()被调用,然后对象所使用的内存被释放出来。


实例:


<1> $this 方式访问对象


以下为引用内容:
/***
  * desteps.com  Michael
***/
<?php
class Bike{
public $name;
function sport(){
return "$this->name:健身";
}
function game(){
return "$this->name:比赛";
}
function traffic(){
return "上班";
}
}
$bk1=new Bike();
$bk2=new Bike();
$bk1->name="赛车";
$bk2->name="健身车";
echo $bk1->game(),"<hr align='left' width='160px'/>";
echo $bk2->sport(),",",$bk2->traffic();
?>
<2> __construct 函数


以下为引用内容:
/***
  * desteps.com  Michael
***/
<?php
class Bike{
public $name;
function __construct($name=""){
$this->name=$name;
}
 function sport(){
return "$this->name:健身";
}
function game(){
return "$this->name:比赛";
}
function traffic(){
return "上班";
}
}
$bk1=new Bike("赛车");
$bk2=new Bike("健身车");
echo $bk1->game(),"<hr align='left' width='160px'/>";
echo $bk2->sport(),",",$bk2->traffic();
?>


<3> 析构函数__destruct


以下为引用内容:
/***
  * desteps.com  Michael
***/
<?php
class Bike{
public $name;
function __construct($name=""){
$this->name=$name;
}
function sport(){
return "$this->name:健身";
}
function game(){
return "$this->name:比赛";
}
function traffic(){
return "上班";
}
function __destruct(){
 echo "<hr color='#ff6600' align='left' width='160px'/>********$this->name";
 }
}
$bk1=new Bike("赛车");
$bk2=new Bike("健身车");
echo $bk1->game(),"<hr align='left' width='160px'/>";
echo $bk2->sport(),",",$bk2->traffic();
?>
4,类的继承与访问


类的继承


继承关键字:extends ,子类(派生类)继承父类(基类),利用 extends 单一继承的方法,共享被继承类(父类)的内容。


继承规则


class1  extends  class2  extends   class3  
      [注] 子类与父类的属性和方法应避免重名。


演示实例:


以下为引用内容:
/***
  * desteps.com  Michael
***/
<?php 
class ku{
function kx(){
return "基类中的内容<br/>";
}
}
class su extends ku{                     // 类的继承
function sx(){
return "继承类中的内容";
}
}
$su=new su();                               // 对继承类SU进行实例化
echo $su->kx();                             // 继承类SU是否已经继承基类KU中的内容
?>
同时访问基类和继承类中的内容


以下为引用内容:
/***
  * desteps.com  Michael
***/
<?php 
class ku{
function kx(){
return "基类中的内容<br/>";
}
}
class su extends ku{
function sx(){
return $this->kx()."继承类中的内容";        // 用this关键字来实现基类和继承类内容的同时访问

}
$su=new su();
echo $su->sx();
?>
5.基类方法的重载


基类方法的重载


在派生类里使用与基类方法重名的方法名称来执行重载。


基类方法的访问


重载时需要调用原始基类的内容,再增加新的内容,可以使用:
      基类名::方法名称


重载访问演示实例


以下为引用内容:
/***
  * desteps.com  Michael
***/
<?php 
class ku{
function kx(){                    
return "基类中的内容<br/>";
}
}
class su extends ku{
function kx(){                                          // 与基类方法重名
return ku::kx()."继承类中的内容";       // 重载的访问

}
$su=new su();
echo $su->kx();
?>
用protected对基类方法进行封装


以下为引用内容:
/***
  * desteps.com  Michael
***/
<?php 
class ku{
protected function kx(){                           //   用protected对基类方法进行封装            
return "基类中的内容<br/>";
}
}
class su extends ku{
function kx(){
return ku::kx()."继承类中的内容";

}
$su=new su();
echo $su->kx();
?>
[注]  用protected对基类方法进行封装,可以在本类和继承类中进行访问;而private只能在本类中进行访问。


6.抽象方法和抽象类


抽象的类


抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
      PHP中使用abstract来声明一个抽象类或抽象方法。


定义抽象方法和抽象类


类中至少有一个方法是抽象的,这个类称之为抽象类;
      如果定义抽象类须首先定义抽象方法。


以下为引用内容:
abstract class ku{
abstract function kx()
......
}
[注] 类中至少有一个抽象方法;
            抽象方法中没有{  } ;
            抽象方法前必须要加abstract 。


抽象类的特点


不能被实例化,只能被继承。
      继承的派生类当中要把所有抽象方法重载才能实例化。


抽象方法重载演示实例


以下为引用内容:
/***
  * desteps.com  Michael
***/
<?php 
abstract class ku{
abstract function kx1();
abstract function kx2();
abstract function kx3();
function kx4(){
return "一共有三种抽象方法,这是重载的";
}
}
class su extends ku{
function kx1(){
echo "第一种抽象方法";
}
function kx2(){
echo ku::kx4()."第二种抽象方法";
}
function kx3(){
echo "第三种抽象方法";

}
$su=new su();
$su->kx2();
?>
7.final关键字详解


关键字 final


用来定义类和方法的一个关键字,当定义类时该类将不能被继承;当定义方法时该方法将不能被重载。


以下为引用内容:
final  class cla{
final function fun(){
......
}
......
}
类的继承与方法重载的示例


以下为引用内容:
/***
  * desteps.com  Michael
***/
<?php
class mobile{
public $name="手机";
function call(){
return $this->name."具有电话功能<br/>";
}
}
class mmobile extends mobile{
function call(){
echo mobile::call(). "音乐手机继承了手机原有的电话功能"; 
}
}
$mb1=new mmobile();
echo $mb1->call();
?>
当使用 final 来定义方法时,该方法不能被重载。


8.静态成员及其访问


self 关键字


用来用类访问当前类中的内容的关键字,类似 $this 关键字,但 $this 需要类实例化以后才可以使用,而 self 则可以直接访问当前类中的内部成员(属性或方法)。


self ::  类内部成员(属性或方法)等同:类名称 ::  类内部成员(属性或方法)


[注] self 一般用来访问类中的“静态成员”,常量或其它定义内容。


static 关键字


用来定义类的静态属性或方法,可以在类未被实例化时使用,静态属性单独占用内存,而不会因创建多个对象时而导致同样的方法或属性重复占用。


以下为引用内容:
class cla{
static $name;
static function fun(){
......
}
}
[注] 静态方法内部禁止出现非静态内容。


静态成员的访问


<1> 在类内部访问静态成员:
      类名称 :: 静态成员
      self :: 静态成员


<2> 在类外部访问静态成员:
      类名称 :: 静态成员


类属性的静态化及其访问


以下为引用内容:
/***
  * desteps.com  Michael
***/
 <?php
final class mobile{
static $name="手机";
final function call(){
return self::$name."具有电话功能<br/>";
}
}
$mb1=new mobile();
echo $mb1->call();
?>
9.const关键字详解


const 关键字


在定义一个常量的时候我们可以使用 const 来修饰这个常量;


只能申明类中的成员属性而不能申明成员方法;


使用 const 修饰的常量与其它的常量有点不同的是常量名前不要使用”$”;


当然这个常量值也是不能修改的,一旦定义就不能在程序的任何地方进行“人为”的修改;


还有就是使用 const 来定义当然也遵守其它常量的命名规则――使用大字的字母。


演示实例


以下为引用内容:
/***
  * desteps.com  Michael
***/
 <?php
final class mobile{
const NAME="手机";
static function call(){
return self::NAME."具有电话功能";
}
}
$mb=new mobile;
echo $mb->call();
?>
输出:手机具有电话功能


10.接口的创建与引用


接口的概念


接口是一种成员属性全部为抽象或常量的特殊抽象类。


接口与抽象类的区别
      抽象类:
      <1> 类中至少有一个抽象方法。
      <2> 抽象方法前需加 abstract 。
      接口:
      <1> 类中全部为抽象方法。
      <2> 抽象方法前不用加 abstract 。
      <3> 定义抽象方法时,抽象方法为公共属性( public )。
      <4> 成员属性必须为常量。


接口与抽象类的共同点
      <1> 本身不能被实例化,必须被继承或引用。
      <2> 继承或引用后,需要把所有抽象方法重载方可使用。


创建接口


关键字:interface 
      格式:


以下为引用内容:
interface demo{
const NAME="常量";
function fun1();
function fun2();
}
接口的引用与规则


关键字:implements 。
      可以有多个引用,并用","分开。


设已有基类 mob ,接口demo1,demo2,demo3。


<1> 普通类引用接口


以下为引用内容:
class mob implements demo1,demo2,demo3{
......
}
<2> 抽象类引用接口


以下为引用内容:
abstract class mob implements demo1,demo2,demo3{
......
}
11.多态应用详解


什么是多态


多态是接抽象和继承之后,面向对象语言的第三个特征,具有表现多种形态的能力,在OOP中是指语言具有根据对象的类型以不同方法处理。
      OOP模式并不仅仅是很多函数和功能的集合,而是使用类、继承、多态的方式使我们描述的对象代码更具有“物”的意义,帮助减少一些重复性的代码和条件的判断。


运算符:instanceof


是PHP的一个类型运算符,用来测定一个给定的对象是否来自指定的对象类。


以下为引用内容:
class A{}
class B{}
$thing = new A ;
if ($thing instanceof A){
echo "A";
}
if($thing instanceof B){
echo "B";
}
多态的应用示例


假定现有两个类UP和MP4,U盘(UP)和MP4分别插入电脑(PC)USB接口。


以下为引用内容:
/***
  * desteps.com  Michael
***/
 <?php
interface usb{                                                  // 创建一个USB接口
function type();                                                // 型号
function alert();                                                // 提示
}
class up implements usb{                            // UP
function type(){
echo "型号:2.0<br/>";
}
function alert(){
echo "正在检查U盘驱动 . . . . . .";
}
}
class mp4 implements usb{                           //MP4
function type(){
echo"型号:1.0<br/>"; 
}
function alert(){
echo "正在检查mp4驱动 . . . . . .";
}
}
class pc{                                                              // 创建一个电脑的类
function pcusb($wt){                                          // 电脑USB接口方法
$wt->type();                                                          // 判断接口类型
$wt->alert();                                                          // 执行检查驱动

}
$pc=new pc;
$up=new up;
$mp4=new mp4;
$pc->pcusb($up);                                                 // 在电脑接口上插入U盘时
?>
12.PHP面向对象之对象描述的配置


对象描述的配置


方法名:_ _ tostring()


可以直接打印对象句柄,从而获得该方法的基本信息或其它信息。


tostring 方法的用法:


以下为引用内容:
class descript{
function __tostring(){
return " 描述descript类的一些基本信息";
}
}
$ds=new descript ;
echo $ds;
tostring 方法演示实例


以下为引用内容:
/***
  * desteps.com  Michael
***/
 <?php
class descript{
public $name="tostring 方法";
function __tostring(){
return $this->name."可以直接打印对象句柄,从而获得该方法的基本信息。";
}
}
$ds=new descript;
echo $ds;
?>
运行结果:


tostring 方法可以直接打印对象句柄,从而获得该方法的基本信息。


13.PHP面向对象对象方法的异常处理


对象方法的异常处理


方法名:_ _call($funname,$arr_value)


调用一些不存在的对象方法的异常处理,使程序继续正常运行。


call方法的用法:


以下为引用内容:
/***
  * desteps.com  Michael
***/
class dispose{
function __call($n,$v){
echo "错误的方法".$n;
echo "错误的参数".print_r($v);
}
}
call方法的演示实例


以下为引用内容:
/***
  * desteps.com  Michael
***/
 <?php
class dispose{
public $name="call 方法";
function __tostring(){
return $this->name."调用一些不存在的对象方法的异常处理,使程序继续正常运行。<br/>";
}
function __call($n,$v){
echo "不存在的方法为:".$n."<br/>不存在的值是:";
echo print_r($v);
}
}
$ds=new dispose;
echo $ds;
$ds->noth("nothing",2050);
?>
运行结果:


call 方法调用一些不存在的对象方法的异常处理,使程序继续正常运行。
      不存在的方法为:noth
      不存在的值是:Array ( [0] => nothing [1] => 2050 ) 1


14.PHP面向对象克隆对象方法详解


克隆对象


方法名:_ _clone
      关键字:clone
      通过克隆的方式可以在内存中生成两个一样的对象或升级原对象。


克隆的原理


<1> 内存中只有一个对象


以下为引用内容:
$a=new cla;
$b=$a;
<2>内存中会有两个对象


以下为引用内容:
$a=new cla;
$b=clone $a;
<3>clone 方法


以下为引用内容:
class cla{
function __clone(){
echo "克隆时自动初始化的函数";
}
}
clone(克隆)对象示例


以下为引用内容:
/***
  * desteps.com  Michael
***/
 <?php
class clo{
public $name="等于的方法";
function fun(){
return $this->name."只是将一个类赋值给另一个类,所以此时内存中仍是一个对象";
}
function __destruct(){
echo "<br/>清理了一个对象"; 
}
}
$ds=new clo;
$dt=$ds;
echo $dt->fun();
?>
运行结果:
      等于的方法只是将一个类赋值给另一个类,所以此时内存中仍是一个对象
      清理了一个对象


以下为引用内容:
/***
  * desteps.com  Michael
***/
 <?php
class clo{
public $name="等于方法";
function fun(){
return $this->name."克隆出了一个新的类,所以此时内存中有两个对象";
}
function __destruct(){
echo "<br/>清理了一个对象"; 
}
function __clone(){
$this->name="clone 方法"; 
}
}
$ds=new clo;
$dt= clone $ds;
echo $dt->fun();
?>
运行结果:


clone 方法克隆出了一个新的类,所以此时内存中有两个对象
      清理了一个对象
      清理了一个对象


15.PHP面向对象自动载入对象详解


方法名:_ _autoload()


取得对象名称并自动载入当前页面。


自动载入方法


以下为引用内容:
function __autoload($class_n){
includ($class_n.".php");
}
$cla=new cla;
$clb=new clb;
等同于 include 方法


以下为引用内容:
include("cla.php");
include("clb.php");
自动载入对象示例


先新建两个文件作为载入对象(cla.php ;clb.php)


cla.php


以下为引用内容:
/***
  * desteps.com  Michael
***/
<?php 
class cla{
function fun1(){
echo "这是一个cla类";
}
}
?>
clb.php


以下为引用内容:
/***
  * desteps.com  Michael
***/
<?php
class clb{
function fun2(){
echo "这是一个clb类";
}
}
?>
引用文件 auto.php


以下为引用内容:
/***
  * desteps.com  Michael
***/
<?php
function __autoload($name){
include("$name.php");
}
$cla=new cla;
$cla->fun1();
echo "<br/>";
$clb=new clb;
$clb->fun2();
?>
0 0
原创粉丝点击