2020年5月21日

    1. <?php
    2. class A{
    3. protected $a = '黑子';
    4. public function __isset($name){
    5. return isset($this->$name);
    6. }
    7. }
    8. $res= new A();
    9. //访问不存在的属性
    10. var_dump(isset($res->b));
    11. var_dump(empty($res->b));
    12. //访问不可访问的属性
    13. var_dump(isset($res->a));
    14. var_dump(empty($res->a));
    15. class A{
    16. protected $a = '黑子';
    17. public function __unset($name){
    18. unset($this->$name);
    19. }
    20. }
    21. $res=new A();
    22. var_dump($res);
    23. //删除一个不存在的属性
    24. unset($res->b);
    25. //删除一个不可访问的属性
    26. unset($res->a);
    27. class A{
    28. public static $name = 'A=>static';
    29. public static function demo(){
    30. //使用静态变量
    31. //用self代替$this
    32. var_dump(self::$name);
    33. //调用静态方法
    34. self::demo1;
    35. }
    36. public static function demo1(){
    37. var_dump('demo1');
    38. }
    39. //如非要访问动态内容(特定时使用)
    40. public static function gto(){
    41. $res =new self();
    42. var_dump($res);
    43. //调用动态方法
    44. $res->demo2();
    45. }
    46. public function demo2(){
    47. var_dump('demo2');
    48. var_dump($this);
    49. }
    50. }
    51. //访问静态变量
    52. var_dump(A::$name);
    53. //使用静态方法
    54. A::demo();
    55. //静态方法调用动态
    56. A::gto();
    57. final class A{
    58. final public function demo(){
    59. var_dump('A::demo()');
    60. }
    61. }
    62. //测试
    63. //$obj = new A();
    64. //$obj->demo();
    65. class B extend A{
    66. //public function demo(){
    67. //var_dump("不可覆盖")}
    68. }
    69. $obj =new B;
    70. $obj->demo();
    71. class A{}
    72. //判断对象是否属于某个类
    73. //实例化得到一个对象
    74. $res = new A();
    75. var_dump($res instanceof A);
    76. //判断对象和对应的类是否是祖先
    77. class B{}
    78. class C extends B{}
    79. //实例化得到c类对象
    80. $resC = new C();
    81. var_dump($resC instanceof B);
    82. //继承只能单继承,多层级的方式来继承多个类
    83. class D extends C{}
    84. $resD = new D();
    85. var_dump($resD instanceof B);
    86. //c类对象是否是d类的实例化
    87. //不是
    88. var_dump($resC instanceof D);
    89. class A{
    90. public $name = 'hz';
    91. public function __clone(){
    92. $this->name ='克隆01';
    93. }
    94. }
    95. $res1 = new A();
    96. var_dump($res1->name);
    97. $res2 = $res1;//变量的内存地址赋值给$res2
    98. var_dump($res2->name);
    99. //改变res2的name属性
    100. $res2->name='fire';
    101. var_dump($res1->name,$res2->name);
    102. echo"<hr>";
    103. $res3 =clone $res1;
    104. var_dump($res3->value);
    105. echo"<hr>"
    106. $res3 ->value="new fire";
    107. var_dump($res1->value,$res3->value);
    108. ?>
    109. <?php
    110. class A{
    111. protected $a = '黑子';
    112. public function __isset($name){
    113. return isset($this->$name);
    114. }
    115. }
    116. $res= new A();
    117. //访问不存在的属性
    118. var_dump(isset($res->b));
    119. var_dump(empty($res->b));
    120. //访问不可访问的属性
    121. var_dump(isset($res->a));
    122. var_dump(empty($res->a));
    123. class A{
    124. protected $a = '黑子';
    125. public function __unset($name){
    126. unset($this->$name);
    127. }
    128. }
    129. $res=new A();
    130. var_dump($res);
    131. //删除一个不存在的属性
    132. unset($res->b);
    133. //删除一个不可访问的属性
    134. unset($res->a);
    135. class A{
    136. public static $name = 'A=>static';
    137. public static function demo(){
    138. //使用静态变量
    139. //用self代替$this
    140. var_dump(self::$name);
    141. //调用静态方法
    142. self::demo1;
    143. }
    144. public static function demo1(){
    145. var_dump('demo1');
    146. }
    147. //如非要访问动态内容(特定时使用)
    148. public static function gto(){
    149. $res =new self();
    150. var_dump($res);
    151. //调用动态方法
    152. $res->demo2();
    153. }
    154. public function demo2(){
    155. var_dump('demo2');
    156. var_dump($this);
    157. }
    158. }
    159. //访问静态变量
    160. var_dump(A::$name);
    161. //使用静态方法
    162. A::demo();
    163. //静态方法调用动态
    164. A::gto();
    165. final class A{
    166. final public function demo(){
    167. var_dump('A::demo()');
    168. }
    169. }
    170. //测试
    171. //$obj = new A();
    172. //$obj->demo();
    173. class B extend A{
    174. //public function demo(){
    175. //var_dump("不可覆盖")}
    176. }
    177. $obj =new B;
    178. $obj->demo();
    179. class A{}
    180. //判断对象是否属于某个类
    181. //实例化得到一个对象
    182. $res = new A();
    183. var_dump($res instanceof A);
    184. //判断对象和对应的类是否是祖先
    185. class B{}
    186. class C extends B{}
    187. //实例化得到c类对象
    188. $resC = new C();
    189. var_dump($resC instanceof B);
    190. //继承只能单继承,多层级的方式来继承多个类
    191. class D extends C{}
    192. $resD = new D();
    193. var_dump($resD instanceof B);
    194. //c类对象是否是d类的实例化
    195. //不是
    196. var_dump($resC instanceof D);
    197. class A{
    198. public $name = 'hz';
    199. public function __clone(){
    200. $this->name ='克隆01';
    201. }
    202. }
    203. $res1 = new A();
    204. var_dump($res1->name);
    205. $res2 = $res1;//变量的内存地址赋值给$res2
    206. var_dump($res2->name);
    207. //改变res2的name属性
    208. $res2->name='fire';
    209. var_dump($res1->name,$res2->name);
    210. echo"<hr>";
    211. $res3 =clone $res1;
    212. var_dump($res3->value);
    213. echo"<hr>"
    214. $res3 ->value="new fire";
    215. var_dump($res1->value,$res3->value);
    216. ?>
    217. <?php
    218. class A{
    219. protected $a = '黑子';
    220. public function __isset($name){
    221. return isset($this->$name);
    222. }
    223. }
    224. $res= new A();
    225. //访问不存在的属性
    226. var_dump(isset($res->b));
    227. var_dump(empty($res->b));
    228. //访问不可访问的属性
    229. var_dump(isset($res->a));
    230. var_dump(empty($res->a));
    231. class A{
    232. protected $a = '黑子';
    233. public function __unset($name){
    234. unset($this->$name);
    235. }
    236. }
    237. $res=new A();
    238. var_dump($res);
    239. //删除一个不存在的属性
    240. unset($res->b);
    241. //删除一个不可访问的属性
    242. unset($res->a);
    243. class A{
    244. public static $name = 'A=>static';
    245. public static function demo(){
    246. //使用静态变量
    247. //用self代替$this
    248. var_dump(self::$name);
    249. //调用静态方法
    250. self::demo1;
    251. }
    252. public static function demo1(){
    253. var_dump('demo1');
    254. }
    255. //如非要访问动态内容(特定时使用)
    256. public static function gto(){
    257. $res =new self();
    258. var_dump($res);
    259. //调用动态方法
    260. $res->demo2();
    261. }
    262. public function demo2(){
    263. var_dump('demo2');
    264. var_dump($this);
    265. }
    266. }
    267. //访问静态变量
    268. var_dump(A::$name);
    269. //使用静态方法
    270. A::demo();
    271. //静态方法调用动态
    272. A::gto();
    273. final class A{
    274. final public function demo(){
    275. var_dump('A::demo()');
    276. }
    277. }
    278. //测试
    279. //$obj = new A();
    280. //$obj->demo();
    281. class B extend A{
    282. //public function demo(){
    283. //var_dump("不可覆盖")}
    284. }
    285. $obj =new B;
    286. $obj->demo();
    287. class A{}
    288. //判断对象是否属于某个类
    289. //实例化得到一个对象
    290. $res = new A();
    291. var_dump($res instanceof A);
    292. //判断对象和对应的类是否是祖先
    293. class B{}
    294. class C extends B{}
    295. //实例化得到c类对象
    296. $resC = new C();
    297. var_dump($resC instanceof B);
    298. //继承只能单继承,多层级的方式来继承多个类
    299. class D extends C{}
    300. $resD = new D();
    301. var_dump($resD instanceof B);
    302. //c类对象是否是d类的实例化
    303. //不是
    304. var_dump($resC instanceof D);
    305. class A{
    306. public $name = 'hz';
    307. public function __clone(){
    308. $this->name ='克隆01';
    309. }
    310. }
    311. $res1 = new A();
    312. var_dump($res1->name);
    313. $res2 = $res1;//变量的内存地址赋值给$res2
    314. var_dump($res2->name);
    315. //改变res2的name属性
    316. $res2->name='fire';
    317. var_dump($res1->name,$res2->name);
    318. echo"<hr>";
    319. $res3 =clone $res1;
    320. var_dump($res3->value);
    321. echo"<hr>"
    322. $res3 ->value="new fire";
    323. var_dump($res1->value,$res3->value);
    324. ?>

    笔记
    魔术方法 isset
    isset(string $name) :bool
    在使用isset或者empty()去访问一个不存在或不可访问的属性时自动调用

    从哪来(调用 访问)
    到哪去(返回值 结果)

    魔术方法 unset
    unset(string $name) :void
    当调用unset去删除不可访问或不存在访问的属性时自动调用

    静态修饰符:static
    语法:
    属性:[访问控制修饰符] [静态修饰符] 变量[ = 值];
    方法:[访问控制修饰符] [静态修饰符] function 方法名(){}

    静态内容(有静态修饰符的方法和属性)无需实例化,直接使用 ::调用;
    静态方法中没有$this全部使用self代替
    静态方法中只能去访问静态方法和静态变量
    如非要访问动态内容(特定时使用);静态方法中去new这个类;就会得到对象

    final 关键词(修饰符)
    类:final class 类名{}
    方法:final [访问控制修饰符] [静态修饰符] function 方法名(){}

    instanceof 运算符 关键字
    用来判断一个对象是否属于某个类(或祖先)

    对象克隆
    由于对象复制不能够直接复制(引用类型)所以需要使用clone关键字;
    clone(): clone() :void
    当克隆时自动调用;类似构造函数(clone);
    去做一些特殊参数的初始化