PHP基础(034)---类的特性

  1 <?php
  2 
  3 /*
  4 *访问类型控制
  5 *=================================================================
  6 *                  |   private  |  protected  |  public(默认)     *
  7 *=================================================================
  8 * 同一个类中     |       v      |     v       |    v              *
  9 *=================================================================
 10 * 类的子类中     |              |        v        |     v                *
 11 *=================================================================
 12 * 所有的外部成员 |              |                |     v                *
 13 *=================================================================
 14 *
 15 * 子类中重载父类的方法(在PHP中不能定义重名的函数,也包括不能在同一个类中定义重名的方法,所以就没有方法重载了。)
 16 * 但在子类中可以定义和父类同名的方法,因为父类的方法已经在子类中存在,这样在子类中就可以把父类继承过来的方法重写。
 17 * 特点一:通过继承 可以重载父类的方法 ,还可增加新的属性  ,也可增加新的方法,还可在构造函数中加上子类新加的属性并初始化                赋值给它;
 18 * 特点二:在子类调用父类中的方法用【parent::方法名】 ,这里包括调用父类的构造函数,如【                parent::__construct($name,$age,$sex);】,【parent::say();】;
 19 *特点三: 如果父类中的方法的访问权限是protected,那么在子类中重写的方法的权限就要是protected和public.
 20 *      *=================*    *=================*
 21 *            父类 方法            子类 方法
 22 *       *=================*    *=================*
 23 *             protected        protected或public
 24 *       *=================*    *=================*
 25 *             public               public
 26 *       *=================*    *=================*
 27 *
 28 *类中常见的关键字和魔术方法    :PHP5    <final, static , const, __call , __toString , __autoload等>
 29 *    *============================================================*
 30 *         <final> 加在类或类中方法前
 31 *    *============================================================*
 32 *     特点一:使用final标识的类,不能被继承。
 33 *    特点二:在类中使用final标识的成员方法,在子类中不能被覆盖;
 34 *
 35 *    *============================================================*
 36 *          <static> 加在类中的属性或方法前
 37 *    *============================================================*
 38 *      特点一:可用【类名::静态成员属性名;】,【类名::静态成员方法名();】;
 39 *     特点二:在类中声明的成员方法中,也可以用关键字"self"来访问其他静态成员属性。【self::$count;】
 40 *     补充1:在使用静态方法时需要注意,在静态方法中只能访问静态成员。
 41 *     补充2:非静态的成员必须通过对象的引用才能访问,通常是使用$this完成。
 42 *
 43 *     *============================================================*
 44 *      <const>用于类中的常量定义,在类外是用define()函数定义的。
 45 *     *============================================================*
 46 *     特点:其访问方法与<static>一样;
 47 *     补充:使用const声明常量名称前不要使用"$"符号,而且常量名称通常用大写的。
 48 *
 49 *      *=====================================================================*
 50 *        <clone>克隆对象
 51 *      *=====================================================================*
 52 *        <__toString>类中通用的方法,是快速获取对象的字符串表示的最便捷方式
 53 *      *=====================================================================*
 54 *       <__call>通过此方法处理错误调用.
 55 *      *=====================================================================*
 56 *       <__autoload>自动加载类
 57 *      *=================================================================================================*
 58 *       <serialization>对象串行化,就是把整个对象转化为二进制字符串。-》便于传输,或可写入文件或数据库中。
 59 *      *=================================================================================================*
 60 *       <unserialize>与上面相反。
 61 *      *=====================================================================*
 62 *         抽象类    <abstract class> 抽象方法<abstract function >
 63         特点一:抽象方法就是一个没有方法体的方法,即就是没有"{}";
 64         特点二:抽象类就是一个“半成品”的类。抽象类不能被实例化,即创建不了对象。
 65         特点三:抽象类就是作为子类重载的模板使用的。
 66         特点四:当子类继承了抽象类后,子类必须把父类(抽象类中的抽象方法全部都实现,否则
 67             子类中还存在抽象方法,所以那还是个抽象类,也就不能实例化成对象。
 68 *      *=====================================================================*
 69 *         接口:是特殊的抽象类  。
 70         因为在PHP中只支持单继承,也就是说每一个类只能继承一个父类。但是一个类可以实现多个接口。
 71         特点一:接口中声明的方法必须都是抽象方法,
 72         特点二:另外不能在接口中声明变量,
 73         特点三:只能使用const关键字声明为常量的成员属性,
 74         特点四:而且接口中所有成员都必须有public的访问权限。
 75         特点五:接口的声明用"interface";
 76         特点六:继承接口用"implements"
 77 *      *=====================================================================*
 78 *        抽象类和接口通常配合面向对象的多态性一起使用。
 79 *      *=================================================================================================*
 80 *       面象对象特性:
 81         1.封装 private protected public;
 82         2.继承 extends ;
 83         3.多态性:<因为PHP本身是弱类型的语言,不存在父类对象转化成子类对象,或是子类对象转化成父类对象。
 84             特点一:多态性指的就是方法的重写;方法的重写是指一个子类中可以重新修改父类的某些方法;
 85             特点二:重写要求子类的方法和父类的方法名称相同。
 86 *     *=================================================================================================*
 87 
 88 /*
 89 * 类一
 90 *  private 私有属性 + 魔术方法__get()获取私有属性的值
 91 */
 92 
 93 class Person{
 94   private $name;
 95   private $sex;
 96   private $age;
 97 
 98   //初始化赋值
 99   function __construct($name="",$sex="男",$age=1){
100     $this->name = $name;
101     $this->sex = $sex;
102     $this->age = $age;
103   }
104   //获取私有属性的值,并进行处理一次
105   public function __get($propertyName){
106     if($propertyName == "sex"){
107         return "保密";
108     }else if($propertyName == "age"){
109         if($this->age>30)
110             return $this->age-10;
111         else
112             return $this->$propertyName;
113     }else{
114         return $this->$propertyName;
115     }
116 
117     }
118 
119 
120 }
121 
122 $person1 = new Person("张三","男",40);
123 echo "姓名: ".$person1->name."<br />";
124 echo "性别:".$person1->sex."<br />";
125 echo "年龄: ".$person1->age."</br />";
126 
127 /*=================================================================================================*/
128 
129 /*
130 * 类二
131 *  private 私有属性 + 魔术方法__set()给私有属性进行赋值
132 */
133 
134 class Person2{
135   private $name;
136   private $sex;
137   private $age;
138 
139   function __construct($name="",$sex="男",$age=1){
140     $this->name = $name;
141     $this->sex = $sex;
142     $this->age = $age;
143   }
144 
145   public function __set($propertyName,$propertyValue){
146     if($propertyName == "sex"){
147         if(!($propertyValue == "男" || $propertyValue == "女"))     //第二个参数只能是男或是女
148             return; //如果是非法参数返回空,则结束方法执行
149     }
150     if($propertyName == "age"){
151         if($propertyValue > 150 || $propertyValue <0)
152             return;
153     }
154     //*** 根据参数决定为那个属性被赋值,传入不同的成员属性名,赋上传入的相应的值
155     $this->$propertyName = $propertyValue;
156   }
157 
158   //下面是声明人类的的成员方法,设置为公有的可以在任何地方访问
159   public function say(){
160       echo "我的名字叫: ".$this->name.", 性别:".$this->sex.", 我的年龄是:".$this->age."。<br />";
161   }
162 
163 
164 }
165 
166 $person2 = new Person2("张三","男",20);
167 $person2->name = "李四";
168 $person2->sex = "女";
169 $person2->age = 80;
170 $person2->sex = "保密";
171 $person2->age = 800;
172 
173 $person2->say();  //输出结果
174 
175 /*=================================================================================================*/
176 /*
177 * 类三
178 *  private 私有属性 + 魔术方法__set()给私有属性进行赋值
179 */
180 
181 class Person3{
182   private $name;
183   private $sex;
184   private $age;
185 
186   function __construct($name="",$sex="男",$age=1){
187     $this->name = $name;
188     $this->sex = $sex;
189     $this->age = $age;
190   }
191 
192   //当在对象外面使用isset()测定私有成员属性时,自动调用,并在内部测定扣传给外部的isset()结果
193   public function __isset($propertyName){
194     if($propertyName == "name"){
195             return false;
196     }
197     return isset($this->$propertyName);
198   }
199 
200   //当在对象外面使用unset()方法删除私有属性时,自动被调用,并在内部把私有的成员属性删除
201   public function __unset($propertyName){
202       if($propertyName == "name")
203           return;  //除了是name的不能删除 ,其他的全可删除
204       unset($this->$propertyName);
205   }
206 
207   //下面是声明人类的的成员方法,设置为公有的可以在任何地方访问
208   public function say(){
209 
210       echo "我的名字叫: ".$this->name.", 性别:".$this->sex.", 我的年龄是:".$this->age."。<br />";
211   }
212 
213 
214 }
215 
216 $person3 = new Person3("张三","男",40);
217 
218 var_dump(isset($person3->name));   //输出false
219 var_dump(isset($person3->sex));        //输出true
220 var_dump(isset($person3->age));        //输出true
221 var_dump(isset($person3->id));         //输出false
222 
223 unset($person3->name);
224 unset($person3->sex);
225 unset($person3->age);
226 
227 $person3->say();
228 
229 
230 /*=================================================================================================*/
231 ?>

 

posted on 2015-04-22 18:30  lbsf  阅读(121)  评论(0)    收藏  举报

导航