PHP 面向对象整理

类的声明

    1、使用class关键字和一个任意的类名来声明类

    2、类名可以是任意的字符和数字的组合,但不能以数字开头

    3、和类关联的代码必需使用大括号括起来

    4、类中包含属性和方法

    

//举例说明
<?  
   class person1{
       var $name; // 成员属性
       function say{//成员方法
          echo '类中的方法';
       }
   }
?>

 

 

 

实例化类,使用属性,方法

    1、实例化类   格式:$name = new classname();

    2、使用属性   格式:$name -> 属性名称;

    3、使用方法   格式:$name -> 方法名称;

 

//举例说明
<?

   $person = new person1(); //实例化类
   $person -> name;//使用类属性
   $person -> say(); //使用类方法
?>

 

 

 

成员属性

    1、类可以定义被称为属性的特定变量。属性与称为成员变量,用来存放对象之间互不相同的数据

    2、类的属性和标准变量很相似,除了必须在声明和赋值前加一个代表可见性的关键字之外(它们决定了属性的了作用于)

    3、public 、private、protected都是在PHP5中引进的,在PHP4中所有的属性都是用var来声明,在PHP5中也可以使用var

成员方法

    1、属性对象存储数据,类方法则可以让对象执行任务。方法是类中声明的特殊函数。

    2、调用属性方法是必须使用一对圆括号,即使没有参数

        格式:

    public/private/protected function funName ($args, $another){}

 

 

 

构造方法

    1、在创建对象时构造方法(构造器)会被自动调用。

    2、构造方法确保必要的属性被设置,并完成准备的工作。

    3、在PHP5之前构造方法的名称需和所在类相同名字,在PHP5中构造方法命名为__construct();

    4、构造方法减少了代码的重复,在使用new创建对象是否会被自动调用。

 

<?php
	class person1{
		public $name;   //成员属性
		
		function __construct($name){
			$this->name=$name;
		}
		
		function say(){
			return 'my name is '.$this->name;
		}
	}
?>

 

 

 

参数和类型

    1、每个赋给变量的值都有一种类型

    2、处理方法和函数的参数是,检查变量变的尤其重要

    3、PHP5中引入了类的类型提示。

 

<?php
	class person{
		var $name;
		
		function __construct($name){
			$this->name=$name;
		}
		
	}
	
	class student{
		function say(person $name){//这里控制了必须是person类
			echo 'my name is '.$name->name;
		}
	}
	
	
	
	$person=new person('愚公移山');
	$student=new student();
	//$student->say('愚公移山');//会提示报错,说say方法必须是person中的参数
	$student->say(new person('愚公移山'));
?>

 

 

 

继承

    1、继承是从一个基类得到一个和多个类的机制

    2、继承自另一个类的类称为该类的子类。子类也被称作为父类的扩展。

    3、instanceof 用来判断一个实例化的类是否是某个指定对象的实例。

 

<?php
	class person{
		var $name;
		
		function __construct($name){
			$this->name=$name;
		}
		
	}
	
	class student{
		function say($name){
			if($name instanceof person){
				echo 'my name is '.$name->name;
			}else{
				echo 'it\'s not new to specail class';
			}
		}
	}
	
	$person=new person('lgzhyan');
	$student=new student();
	//$student->say($newPerson);//将会执行student中say方法的false区间代码
	$student->say($person);
?>

    4、继承父类必须使用extend关键字来继承    

 

    5、如果子类中没有__construct() 而父类中有,那么就会自动继承父类中的__construct()方法

    6、子类默认继承父类所有的public和protected方法和属性

    7、子类可以扩展和重写父类的方法

    8、继承为确保一个类拥有自身的功能和父类的功能

    9、“搜索”,在调用子类中不存在的方法时,自动查找父类中是否存在该方法,如果存在则调用,如果调用子类中存在的方法则直接调用子类中存在的方法

 

<?php
	class person{
		protected $name;
		public $age;
		
		function __construct($name,$age){
			$this->name=$name;
			$this->age=$age;
		}
		
		function say(){
			echo 'this is parent class';
		}
		
		function run(){
			echo $this->name.'is running';
		}
		
	}
	
	class student extends person{
		function say(){
			echo 'my name is '.$this->name;
		}
	}
	
	class teacher extends person{

	}
	$student=new student('lgzhyan',25);//子类中没有构造方法所以自动继承了父类的构造方法  里面已经加载进来了
	$student->say();//输出my name is lgzhyan
	$teacher=new teacher('lgzhyan',25);
	$teacher->say();//输出this is parent class
	$teacher->run();//输出lgzhyan is running;
?>

    10、在子类中定义构造方法是,需要传递参数给父类的构造方法,否则得到的可能是个不完整的对象。

 

    11、要调用父类中的方法可以使用parent关键字来引用父类本身,引用一个类而非一个对象的方式不是使用 ->  而是 ::

    12、在子类中以父类的基础重写也需要使用到parent::

 

<?php
	class person{
		protected $name;
		public $age;
		
		function __construct($name){
			$this->name=$name;
		}
		
	}
	
	class teacher extends person{
		
		function __construct($name,$age){
			parent::__construct($name);//重载了父类的构造方法
			$this->age=$age;
		}

		function say(){
			echo 'my name is '.$this->name.'&nbsp;&nbsp;'.$this->age.'&nbsp;&nbsp;years old';
		}
	}

	$teacher=new teacher('lgzhyan',25);
	$teacher->say();//输出my name is lgzhyan  25  years old
?>

 

 

 

管理类的访问

    1、public 关键字:任何地方都鞥访问public 方法和属性

    2、private 关键字:只有在当前类中才能访问 private 方法和属性

    3、protected 关键字:可以当前类和子类中访问 protected 方法和属性,其他外部代码无权访问

    

<?php
	class person{
		protected $name;
		public $age;
		private $sex;
		
		function __construct($name,$sex,$age){
			$this->name=$name;
			$this->sex=$sex;
			$this->age=$age;
		}
		
	}

	$person=new person('lgzhyan','man',25);
	echo $person->name;//提示:Fatal error: Cannot access protected property person::$name
	echo $person->sex;//提示Fatal error: Cannot access private property person::$sex
	echo $person->age;//输出25
?>

 

 

 

静态方法和属性

    1、不仅可以通过对象访问方法和属性,还可以通过类来访问他们,这种方法就是静态类

    2、静态类必须使用static关键字来声明

    3、一个类中的静态方法不能访问这个类中的普通属性(那是属于一个类),但是可以访问静态属性

    4、访问静态元素时不需要引用对象的变量 而是使用 :: 来连接属性或方法

    5、要从当前类中访问静态方法或实行,可以使用self关键字指向当前类

    6、不要实例化对象就能访问静态属性或方法

    7、静态成员属性也可以就爱访问关键词

    8、静态的成员方法中不能有任何动态的成员属性和成员方法

    9、在类的内部可以使用 $this->静态方法名直接访问

    10、在类的内部可以直接使用 self :: 静态方法名 去访问静态的成员方法

    11、在类的内部可以直接使用类名 :: 静态方法名  去访问静态的成员方法

    12、在类的外部可以实例化一个对象后 ,直接$ 对象 -> 静态方法名()

    13、在类的外部可以直接使用类名 :: 静态方法名曲访问静态的成员方法

    14、静态成员属性可以再类的外部直接使用类名 :: $静态属性名来访问

 

<?php
	class person{
		static public $name='lgzhyan';
		
		static function say(){
			echo 'my name is '.person::$name.'i can '.self::run();
		}
		
		static function run(){
			return 'running';
		}
		
	}
	
	echo person::$name;//输出lgzhyan
	person::say();//输出my name is lgzhyani can running
	
?>

 

 

 

类常量

    1、类的常量和全局常量性质相同

    2、类的常量使用const来定义

    3、访问类的常量使用   类名:: 常量名

    4、类的常量名尽量大写

抽象类

    1、抽象类不能被直接实例化

    2、抽象类中只定义子类需要的方法

    3、子类可以继承他并且通过其中的抽象方法具体化

    4、使用abstract 来定义一个抽象类

    5、大多数情况下抽象类至少包含一个抽象方法

    6、可以象声明普通方法那样声明抽象方法,但是抽象方法不能有方法体

    7、抽象类中的每个子类都必须实现抽象类中的所有抽象方法,或把他们自身也声明为抽象方法

    8、在抽象方法当中,如果有参数,必须传入参数,如果有默认值,就必须传入默认值

 

<?php
	abstract class person{
	
		abstract function say($name='lgzhyan',$age);
		
	}
	
	class teacher extends person{
		
		function say($name='lgzhyan',$age){
			echo 'my name is '.$name.' '.$age.' years old';
		}
	}

	$person=new person();//提示错误Fatal error: Cannot instantiate abstract class person 
	$teacher=new teacher();
	$teacher->say('yanhaijing',25);//输出my name is yanhaijing 25 years old
?>

 

 

 

接口

    1、作用:比如多人开发室,可能会调用其他人写的类。这是你可能不知道他的类中的方法的命名,这时查看接口就可以了

    2、接口中的所有方法必须全部是抽象方法(没有方法体)

    3、接口当中不能有动态的成员属性,成员属性只能是常量

    4、接口继承使用  implements   来继承

    5、一个类可以继承一个父类和任意多个接口,但extends 应该在  implements 前面

 

<?php
	interface person{
		public function say();
		public function run();
	}
	
	class teacher implements person{
		
		private $name;
		private $age;
		
		function __construct($name,$age){
			$this->name=$name;
			$this->age=$age;
		}
	
		function say(){
			echo 'my name is '.$this->name;
		}
		
		function run(){
			echo 'i am running';
		}
	}
	
	$teacher=new teacher('lgzhyan',25);
	$teacher->say();
?>

 

 

 

异常

    1、PHP是从内置的Exception类中实例化得到的对象

    2、Exception类型对象用于存放和报告错误信息

    3、getMessage()获得传递给构造方法的字符串

    4、getCode()获得传递给构造方法的错误代码

    5、getFile()获得产生异常的文件

    6、getLine()获得产生异常的行数

    7、使用throw关键字和Exception对象来抛出异常。会停止当前方法。将错误返回给调用代码

    8、抛出异常时可以使用try子句中将异常接收

    9、try语句必须跟着一个catch子句才能处理错误

<?php
	class getFile{
		function getFiles($name){
			try{
				if(!fopen('r',$name)){
					throw new Exception('文件不存在');
				}
			}catch(Exception $e){
				echo $e->getMessage();
			}

		}
	}
	
	$files=new getFile();
	$files->getFiles('text.txt');
?>

 

 

 

禁止继承    

 

    1、如果希望类或方法完成不变的功能,可以使用final关键字

    2、final类不能有子类

    3、final方法不能被重写

<?php
	final class person{
		
	}
	
	//class teacher extends person{//提示Fatal error: Class teacher may not inherit from final class (person)
		
	//}
	
	class person1{
		final function say(){
			echo 'run';
		}
	}
	
	class teacher1 extends person1{
		function say(){//Fatal error: Cannot override final method person1::say()
		
		}
	}
?>

 

 

获取私有属性    

    1、获得私有属性值使用__get($name)

    2、$name的值为要获得的属性名称

    3、无论__get方法返回了什么,都会返回给客户端

<?php
	class person{
		private $name='lgzhyan';
		
		function __get($name){
			return $this->$name;
		}
	}
	$person=new person();
	echo $person->name;
?>

 

 

设置私有属性

    1、在要设置私有属性值的时候使用__set($name,$value)

    2、$name的值为要设置的属性名,$value的值为要设置的值

    

<?php
	class person{
		private $name='lgzhyan';
		
		function __get($name){
			return $this->$name;
		}
		
		function __set($name,$value){
			return $this->$name=$value;
		}
	}
	$person=new person();
	$person->name='yanhaijing';
	echo $person->name;
?>

 

 

查看方法是否存在

    1、在对象的外部调用isset()函数时会被自动调用

    2、查看是否被设置使用__isset($name)

<?php
	class person{
		private $name='lgzhyan';
		
		function __isset($name){
			if(isset($this->$name)){
				echo '被设置';
			}else{
				echo '未被设置';
			}
		}
	}
	
	$person=new person();
	isset($person->name);
?>

 

 

释放私有属性的值

    1、在对象外部调用unset()函数时被自动调用

    2、释放私有属性的值使用__unset()

<?php
	class person{
		private $name='lgzhyan';
		
		function __unset($name){
			unset($this->$name);
		}
	}
	
	$person=new person();
	unsset($person->name);
?>

 

 

调用未被定义的方法

    1、在调用没有被定义的方法时,自动调用__call()方法

<?php
	class person{
		private $name='lgzhyan';
		
		function __call($name,$args){
			echo $name.' is not set';
		}
	}
	
	$person=new person();
	$person->test();
?>

 

 

析构函数

    1、析构函数在销毁一个类之前执行(对象调用unset函数时,或进程不在引用对象时)

    2、析构函数名必须是__destruct

    3、析构函数不能带有任何参数

<?php
	class person{
		private $name='lgzhyan';
		
		function __destruct(){
			echo 'class is destory';
		}
	}
	
	$person=new person();
?>

 

 

获取对象的副本

    1、克隆一个对象使用__clone()方法

    2、克隆方法建立一个与原对象拥有相同属性和方法的对象

    3、__clone方法可以没有参数,它自动包含$this(副本)和$that(原本)两个指针

    4、__clone方法在使用clone克隆对象时候自动调用

<?php
	class person{
		private $name;
		
		function __construct($name){
			$this->name=$name;
		}
		
		function say(){
			echo 'my name is '.$this->name;
		}
		
		function __clone(){
			$this->name='yanhaijing';
		}
	}
	
	$person=new person('lgzhyan');
	$newPerson=clone $person;
	$person->say();
	$newPerson->say();
?>

 

 

打印对象

    1、当把对象传递给print,echo时会自动调用__tostring()方法

    2、__tostring()方法必须拥有一个返回值


    3、__tostring()方法可以用于设计专门用来传递信息的类,比如将异常、日志信息的总结写到__tostring方法中

<?php
	class person{
		private $name;
		
		function say(){
			echo 'my name is '.$this->name;
		}
		
		function __tostring(){
			return 'this class is not have error';
		}
	}
	
	$person=new person('lgzhyan');
	echo $person;
?>

 

 

多态

    1、多态是指一个公用接口后面维护多个实现

    2、如果代码中存在大量的条件语句,就说明需要使用多态

    

interface pci{

	function start();

	function stop();

}


class soundCard implements pci{

	function start(){

		echo '声卡开始发声';
	}

	function stop(){

		echo '声卡停止发声';
	}
}

class netCard implements pci{

	function start(){

		echo '开始连接网络';
	}

	function stop(){
		echo '断开网络连接';

	}
}


class aCard implements pci{
	function start(){

		echo '显卡开始显示画面';
	}

	function stop(){
		echo '显卡停止显示画面';

	}

}

class cw{

	protected $card;

	function __construct($who,$func){
	
		$this->card=new $who;

		$this->$func();

	}


	function start(){
			$this->card->start();

	}

	function stop(){
			$this->card->stop();

	}

}

$a=new cw('aCard','start');

 

 

转载于:https://my.oschina.net/qimeijun/blog/529529

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值