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 ?>