Home  >  Article  >  php教程  >  php入门教程之对象详解

php入门教程之对象详解

WBOY
WBOYOriginal
2016-05-22 17:20:281571browse

php中对象包括很多内容,如最常用的php类,接口,多态性 魔术方法(:_construct(),_destruct(),_clone)等.

类的声明实例代码如下:

<?php 
权限修饰符 class 类名{   //权限修士符号:public,protected,private 或者省略3者. 
  //类体;        //class 是建类关键字 
}             //类名必须跟在class 后面,且跟上{}.{}之间放类的成员. 
	   
//ps:在class关键字前可以加权限修饰符外,还可以加static,abstract等关键字.一个类,即一对大括号之间的全部内容都要在一段代码段中,不允许将类中的内容分割成对块. 
<?php 
  class ConnDB{ 
    //.... 
<? 
    //... 
  };	

成员属性:

在类中直接声明的变量称为成员属性/变量.其类型可以为php中的标量类型和复合类型,使用资源类型和空类型是无效的.

此外,成员属性的声明时,必须要有关键字来修饰:有特定意义的关键字:public,protected,private ;不需要特定意义:var.声明成员属性时,没有必要赋初始值.

成员常量:

以const常量修饰,例如:const PI = 3.1415926;

常量的输出不需要实例化,直接由类名+常量名调用即可,格式为: 类名::常量名

ps. 特殊的访问方法:--------"$this" 和 "::"

1) $"this" 存在于每个成员方法当中,它是一个特殊的对象以用方法.成员方法属于那个对象,$this应用就代表那个对象,其作用就是专门完成对象内部成员之间的访问.

2) "::"成为作用域操作符,使用这个操作符可以在不创建对象的情况下调用类中的常量,变量和方法. 其语法格式如下:

关键字::变量名/常量名/方法名

关键字:parent,可以调用父类成员中的成员变量,成员方法和常量;

self,可以调用当前类中的静态成员和常量;

类名,可以调用类中的常量,变量和方法;   

成员方法:

在类中声明的函数成为成员方法,在一个类中可以声明多个函数,即对象可以拥有多个成员方法.成员方法的声明和函数的声明相同,唯一特殊之处就是成员方法可以有关键字对它进行修饰,从而控制其访问权限.

类的实例化

创建对象:

$变量名 = new 类名称([参数]); //类的实例化.

访问类成员:

$变量名 -> 成员属性 = 值;

构造方法和析构方法

构造方法是对象创建完成后第一个呗对象自动调用的方法.它存在每个类的声明当中,是一个特殊的成员方法,一般用来完成一些初始化操作.如果类中没有构造方法,系统会默认自动生成一个没有参数的构造方法.


实例代码如下:

function _construct(形参列表){ 
 //方法体 
};

析构方法则如构造方法相反,它是在对象被销毁前最后一个调用的方法.它将完成一个特定的操作,如关闭文件和释放内存.

实例代码如下:

function _destruct(){ 
	//方法体  
};

面向对象特点:封装性,抽象性,多态性.

封装:

将类中的成员属性和方法结合成一个独立的相同单位,并且尽可能的隐藏对象的内容细节.其目的是确保类以外的部分不能随意存取类的内部数据(成员属性和成员方法),从而避免外部错误对内部数据的影响.

类的封装是通过关键字public,private,protected,static和final实现的.各关键字的作用请查看php相关文档.

继承性:

使一个类继承并拥有另一个已存在的类的成员属性和成员方法,其中被继承的类成为父类,继承的类成为子类.通过继承能够提高代码的重用性和可维护性.类的继承用 extends 关键字.

实例代码如下:

class 子类名称 extends 父类名称{ 
  //子类方法体. 
}

通过parent::关键字也可以在子类方法中调用父类的成员方法,格式如下:

parent::父类的成员方法(参数);

覆盖父类的方法:

所谓的覆盖父类的方法,也就是使用子类中的方法替换从父类中继承的方法,也叫方法的重写.重写的关键就在与子类中创建与父类中相同的方法,g包括方法名称,参数和返回类型.

多态性是指一段程序能够处理多种类型对象的能力.php多态有两种实现方法,即通过继承实现多态和通过接口实现多态.

通过继承实现多态,即通过重写继承的成员方法来达到多态的效果.

实例代码如下:

<?php 
   abstract class ParentClass{ 
		  abstract function printMessage();     
	} 
	class SubClassA extends ParentClass{ 
		   function printMessage(){ 
			   echo "i am message from class A"; 
		   } 
	} 
	class SubClassB extends ParentClass{ 
		   function printMessage(){ 
			   echo "i am message from class B"; 
		   } 
	} 
	 
	function printMSG($object){ 
	   if( $object instanceof ParentClass){ 
		   $object->printMessage(); 
	   }else{ 
			echo "error!"; 
	   } 
	} 
	$objectA=new SubClassA(); 
	printMSG($objectA); 
	$objectB=new SubClassB(); 
	printMSG($objectB);

通过接口实现多态,通过定义接口,与空方法.然后类继承接口.

实例代码如下:

<?php 
	interface interfaceInfo{ 
		   function printMessage(); 
	} 
	 
	class ClassA implements interfaceInfo{ 
		 function printMessage(){ 
				 echo "message form class A"; 
		 } 
	} 
	 
	class ClassB implements interfaceInfo{ 
		 function printMessage(){ 
				 echo "message form class B"; 
		 } 
	} 
	function printMSG($object){ 
			 if($object instanceof interfaceInfo){ 
					   $object -> printMessage(); 
			 }else{ 
						echo "error !"; 
			  } 
	} 
	 
	$objectA =new ClassA(); 
	printMSG($objectA); 
	 $objectB =new ClassB(); 
	printMSG($objectB);

抽象类和接口.

抽象类和接口都是不能被实例化的特殊类.他们都是能够配合面向对象多态性一起使用.

抽象类:

抽象类是一种不能实例化的类,只能作为其他类的父类来使用.抽象类使用abstract 关键字来声明,其格式如下:

实例代码如下:

abstract class 抽象类名{ 
   abstract function 成员方法(参数);// 
}

抽象类和普通类相似,包含成员变量,成员方法.两者区别在于抽象类至少要包含一个抽象方法.抽象方法没有方法体,其功能的实现只能在子类中完成.抽象方法也使用关键字 abstract 来修饰.

接口:

继承特性简化了对象和类的创建,增强了代码的可重用性.但php只支持单继承,如果想实现多重继承,就要使用接口.

接口的声明:通过interface 关键字来实现,接口中声明的方法必须是抽象方法,接口中不能声明变量,只能使用const 关键字声明为常量的成员属性,并且接口中所有成员都必须具备puclic 的访问权限.ainterface 声明接口格式如下:

实例代码如下:

inerface 接口名称{ 
  //常量成员;//成员只能是常量. 
  //抽象方法; 
}

由于接口不能实现实例化操作,因此只能借助子类继承接口的形式来实现.实现的格式是:

实例代码如下:

Class 子类名 implements 接口名1[,接口名2,接口名3,.....]{ 
	//子类方法体. 
}

常用关键字:

1)  final:final之意为最终的,最后的.这就以为着通过final 关键字修饰的类和方法都为最终版本.不能被继承,也不能有子类.不能重写,也不能被覆盖.

2)  static: 通过static 关键字修饰的成员属性和成员方法称为静态属性和静态方法.静态成员属性和方法不需要被实例化就能直接使用.

静态属性:它属于类本身,而不属于类的任何实例.它相当于存储在类中的全局变量,可以在任何位置通过类来访问.访问格式为:

类名称::$静态属性名称;

如果你要在类内部的成员方法中访问静态属性,那么在静态属性的名称前加上操作符: "self::" 即可.

静态方法:由于其不受任何对象限制,因此可以不通过类的实例化而直接引用类中的静态方法.引用格式如下:

类名称::静态方法名(参数);

如果你要在类内部的成员方法中调用静态方法,那么在静态方法的名称前加上操作符: "self::" 即可.在静态方法中只能调用静态变量,而不能调用普通变量;而普通方法中则可以调用静态变量.

使用静态成员除了不需要实例化外,另一个作用是在对象被销毁后,仍然保留呗修改的静态数据,以便下次调用.

3) clone.对象的克隆可以通过关键字来实现.使用clone对象与原对象没有任何关系,即克隆对象会重新申请一份存储空间来存放原对象内容.格式如下:

$克隆对象 = clone $原克隆对象名称;

克隆成功后,他们的n成员方法,属性以及值完全相等.如果要对副本重新初始化,就要用到 _clone().

魔术方法_clone()可以对克隆后的副本对象重新初始化.它不需要任何参数,其中自动包含$this (副本对象)和 $that (原对象) 对象的引用.

对象的比较:

"==" 表示比较两个对象的内容,"==="表示比较两个对象的引用地址相等.

对象类型的检测: instanceof 操作符可以检测当前对象属于那个对象.

面向对象---常用魔术方法:

以上我们已经了解的常用魔术方法有:_construct(),_destruct(),_clone.下面我们再接着介绍几个常用魔术方法.

_get(),_set();

以上两个方法用于对私有成员精细复制或者获取值的操作.

_set()在程序运行中为私有的成员属性设置值,它不需要任何返回值._set()方法包括两个不可省略的参数:变量名和变量值.这个方法不需要主动调用,可在方法钱加上prive关键字.

_get():在程序运行中,在对象的外部获取私有成员的属性的值.他有一个参数:私有成员属性名称.他返回一个允许对象在外部使用的值.此方法同样不许主动调用.

_isset(),_unset():

isset()函数用于检测变量是否存在.而在面向对象中可以通过isset()函数对公有的成员属性进行检测,但对私有成员属性,此函数则不起作用.因此,_isset()函数正是为了起到此作用而创建.格式如下:

bool _isset(string name);

_unset()则同样为了删除制定的变量和对象的私有成员属性.格式如下:

void _unset(string name);//

_call():

_call()方法的作用是当程序试图调用不存在或不可见的成员方法时,php会先调用_call()方法来存储方法名及其参数(方法名和方法参数).其中方法参数是以数组的形式存在.

_toString()方法:

其作用是当使用echo 或者print输出对象时,将对象转化为字符串.

如果没有_toString()方法,直接输出对象时将会发生致命错误.

输出对象时应注意的是,echo 或print 语句后面直接跟要输出的对象,中间不要加多余的字符,否则_toSting()将不会被执行.

_autoload()方法:

将一个独立的,完整的类保存到一个php页中,并且文件名和类名保持一致,这是每个开发人员都需要养成的良好习惯.这样下次在使用的时候就能够轻松的找到它.但有一种情况:如果要在一个页面中引进很多的类,就需要使用include_once()函数或者require_once()函数一个个地引入.php5中引入_autoload()方法可以自动实例化需要使用的类.当一个类还没实例化时,_autoload()会自动到指定的路径下面自动查找和类名相同的文件.找到则继续执行,否则报错.

本文地址:

转载随意,但请附上文章地址:-)

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn