人生具有无限的可能性,你的梦想一定能实现

php学习笔记------[php中面向对象三大特性之一[封装性]的应用]

<?php
/*
 * 封装性:面向对象三大特性之一
 *
 * 1.就是把对象的成员(属性,方法)结合成一个独立的相同单位,并尽可能隐藏对象的内部细节
 *   访问权限修饰符  public protected private
 *   private:私有的,用这个关键字修饰的成员,只能在对象内部访问(只有用$this访问)
 *  
 *  属性可以封装:
 *  		只要一个变量,需要在多个方法使用,就将这个变量声明为成员属性,可以直接在这个对象中的所有方法中使用
 *
 *  		成员属性,相当于这个对象中的全局变量
 *
 *  		成员属性都会在方法中使用,成员属性值的变化其实就是在改变方法的执行行为,也就是改变了对象的功能
 *
 *  		成员属性的值如果不正常,方法执行的功能叶就不正常 
 *  		
 *  		作用:不需要在对象外部改变或读取它的值
 *  			1.封装
 *  			 再提供一个公有的方法(经过方法对对象成员属性进行赋值和取值就可以控制)
 *
 *
 *  方法也可以封装
 *
 *  	作用:
 *  		1.使用private修饰使其只能在内部使用
 *
 *  		2.一个类中有100个方法,封装了95个(为另外5个服务的方法),只有5个方法可以使用
 *
 *  	100个成员属性,都让取值,不可以改值;或者只可改值,不可获取值//此种情况下使用以下方法比较方便 
 *  	和封装有关的魔术方法:
 *
 *		__set();//是直接设置[私有的]成员属性值时,自动调用的方法
 *		__get();//是直接获取[私有的]成员属性值时,自动调用的方法
 *		__isset();//是直接使用isset()查看对象中私有属性是否存在时,自动调用这个方法
 *		__unset();//是直接使用unset()删除对象中私有属性时,自动调用的方法
 *
 *
 *
 *
 *
 *
 *
 */
class Person{

		//x封装成员属性,不需要在对象外部改变
		private $name;
		private $age;
		private $sex;


		private __unset($proName){
			unset($this->$proName);
		
		}


		//是直接查看对象中私有属性是否存在时,自动调用这个方法
		//__isset($proName)的使用,$proName代表属性名
		private function __isset($proName){
			return isset($this->$proName);//isset()返回是否存在
		}

		function __construct($name,$age,$sex){
			$this->name=$name;
			$this->age=$age;
			$this->sex=$sex;

		}

		
		//当获取私有的成员属性时,自动调用此方法
		private function __get($proName)
		{
			//控制所获取的值
			if($proName=="age"){
				if($this-age>40)
					return $this->age-10;
			}
			return $this->$proName;
		}

		//当设置私有的成员属性时,自动调用此方法
		private function __set($proName,$proValue){
			//$proName表示成员属性名,$proValue表示成员属性值
			//控制设置范围
			if($proName=="age"){
				if($proValue > 100 || $proValue<0)
					return;
			}
			$this->$proName=$proValue;

			
		}

		//提供公有方法来设置成员属性的值
		function setAge($age){
			//控制年龄范围,增加安全性
			if($age > 100 || $age < 0 )
				return;
			$this->age=$age;
		}
		
		//提供公有方法来获取成员属性的值
		function getAge(){
			//控制获取年龄的范围
			if($this->age < 30)
				return $this->age;
			else if($this->age<40)
				return $this->age-5;
			else if($this->age<50)
				return $this->age;
			else
				return $this->age-15;
提供公有方法来		}

		function say(){
			echo "我的名字:{$this->name},我的年龄:{$this->age},我的姓别:{$this->sex}<br>";

			//访问封装过的 run()方法
			$this-run();
		}

		private function run(){
			echo '111111111111<br>'

		}

		function eat(){

		}

		//析构方法
		function __destruct(){

		}
	}

$p1=new Person("zhangsan",25,"男");
$p2=new Person;
$p3=new Person;
//$p1->age=-50;//因为年龄在外部随意访问,所以成员属性药封装,才有安全性。
$p1->setAge(30);//通过方法来设置成员属性德值
$p1->getAge();//通过方法来获取成员属性德值

//通过添加家魔术方法__set($proName,$proValue) __get($proName),就可以直接调用成员属性了


$p1->say();//可以调用
$p1->run();//私有的方法不能直接调用

//删除$p1里面的name
unset($p1->name);

//判断name是否存在
if(isset($p1->name)){

	echo "存在<br>";
}else{
	echo "没有这个成员 <br>";
}



?>
posted @ 2011-06-13 17:14  代号极光  阅读(618)  评论(0编辑  收藏  举报

本博客所有权归作者代号极光紫竹园博客园