1、静态属性与方法

每一个类的实例拥有自己的属性和方法,每一个类也可以包含静态属性,静态属性不属于类的任何实例,可以把静态属性理解成存储在类中的全局变量,可以在任何地方通过类名引用静态属性。

 1 <?php
 2 class MyClass {
 3     static $a = 0;
 4     function getValue(){
 5         return self::$a;
 6     }
 7 }
 8
 9 $obj = new MyClass();
10 echo $obj->getValue() . PHP_EOL;
11
12 echo MyClass::$a . PHP_EOL;
13 ?>

2,静态属性的应用-----把一个唯一的id传递到类的所有实例中

<?phpclass MyClass {static $count = 0;public $unique_id;function __construct(){self::$count++;$this->unique_id = self::$count;}}$obj1 = new MyClass();echo $obj1->unique_id . PHP_EOL;$obj2 = new MyClass();echo $obj2->unique_id . PHP_EOL;
?>

3,静态方法

 1 <?php
 2     class HelloWorld {
 3         static function sayHello(){
 4             print "Hello World";
 5             self::printNewLine();
 6         }
 7
 8         static function printNewLine(){
 9             echo PHP_EOL;
10         }
11     }
12     HelloWorld::sayHello();
13     HelloWorld::sayHello();
14 ?>

4,类的常量

>全局常量用 define函数定义

>类的常量与静态成员类似,他们属于类本身,而不是类的实例

>类的常量对大小写敏感

<?phpclass MyColorEnumClass {const RED = "red";const GREEN = "green";const BLUE = "blue";static function printColor(){print self::RED . PHP_EOL;print self::GREEN . PHP_EOL;print self::BLUE . PHP_EOL;}}        MyColorEnumClass::printColor();
?>

5,对象克隆

在php5中,对象赋值,其实是引用 , 如果需要拷贝对象,用克隆关键字clone

<?phpclass MyClass {public $var = 1;}$obj1 = new MyClass();//$obj2 = $obj1;$obj2 = clone $obj1;$obj2->var = 2;//使用$obj2 = $obj1, 下面输出2//使用$obj2 = clone $obj1, 下面输出1echo $obj1->var . PHP_EOL;?>

6,多态

下面这个实例,如果想要再增加一种动物,那么需要改动2处,需要增加动物类和方法,而且需要在printTheRightSound方法中增加一个elseif分支,这种设计对于代码维护和分离非常不友好

<?phpclass Cat{function miao(){echo "cat";}}class Dog{function wang(){echo "dog";}}function printTheRightSound( $obj ){if( $obj instanceof Cat ) {$obj->miao();}else if ( $obj instanceof Dog ) {$obj->wang();}else {echo "传递了错误的对象类型";}echo PHP_EOL;}printTheRightSound( new Cat() );printTheRightSound( new Dog() );
?>

我们可以用继承的优势,改造上面的缺点

 1 <?php
 2     abstract class Animal {
 3         abstract function makeSound();
 4     }
 5     class Cat extends Animal{
 6         function makeSound(){
 7             echo "cat";
 8         }
 9     }
10     class Dog extends Animal{
11         function makeSound(){
12             echo "dog";
13         }
14     }
15     class Chicken extends Animal {
16         function makeSound(){
17             echo "chicken";
18         }
19     }
20
21     function printTheRightSound( $obj ){
22         if( $obj instanceof Animal ) {
23             $obj->makeSound();
24         }else {
25             echo "传递了错误的对象类型";
26         }
27         echo PHP_EOL;
28     }
29
30     printTheRightSound( new Cat() );
31     printTheRightSound( new Dog() );
32     printTheRightSound( new Chicken() );
33 ?>

这样改造之后,printTheRightSound就不需要改动,只需要添加对应的动物类和方法即可

php面向对象精要(1)相关推荐

  1. 《JavaScript面向对象精要》读书笔记

    JavaScript(ES5)的面向对象精要 标签: JavaScript 面向对象 读书笔记 2016年1月16日-17日两天看完了<JavaScript面向对象精要>(参加异步社区的活 ...

  2. 《JavaScript面向对象精要》——1.8 原始封装类型

    本节书摘来自异步社区<JavaScript面向对象精要>一书中的第1章,第1.8节,作者:[美]Nicholas C. Zakas 译者: 胡世杰 更多章节内容可以访问云栖社区" ...

  3. 《JavaScript面向对象精要》——第1章 原始类型和引用类型1.1 什么是类型

    本节书摘来自异步社区<JavaScript面向对象精要>一书中的第1章,第1.1节,作者:[美]Nicholas C. Zakas 译者: 胡世杰 更多章节内容可以访问云栖社区" ...

  4. 《JavaScript面向对象精要》——1.9 总结

    本节书摘来自异步社区<JavaScript面向对象精要>一书中的第1章,第1.9节,作者:[美]Nicholas C. Zakas 译者: 胡世杰 更多章节内容可以访问云栖社区" ...

  5. 《JavaScript面向对象精要》——第1章 原始类型和引用类型 1.1 什么是类型

    本节书摘来自异步社区<JavaScript面向对象精要>一书中的第1章,第1.1节,作者:[美]Nicholas C. Zakas著,更多章节内容可以访问云栖社区"异步社区&qu ...

  6. 《JavaScript面向对象精要》——1.2 原始类型

    本节书摘来自异步社区<JavaScript面向对象精要>一书中的第1章,第1.2节,作者:[美]Nicholas C. Zakas 译者: 胡世杰 更多章节内容可以访问云栖社区" ...

  7. 《JavaScript 面向对象精要》 读书笔记

    <JavaScript 面向对象精要> 读书笔记 高程面向对象这块内容介绍的比较浅显,个人觉得这本小书是高程的补充,看完之后觉得收获匪浅,所以做了个笔记,以备后询 1. 原始类型和引用类型 ...

  8. JavaScript面向对象精要(二)

    四.构造函数和原型对象 1. 构造函数 构造函数就是用new创建对象时调用的函数.使用构造函数的好处在于所有用同一个构造函数创建的对象都具有同样的属性和方法. function Person(){} ...

  9. JavaScript面向对象精要(一)

    数据类型 在JavaScript中,数据类型分为两类: 原始类型 保存一些简单数据,如true,5等.JavaScript共有5中原始类型: boolean:布尔,值为true或false numbe ...

  10. 面向对象精要-理解对象

    1.创建对象 创建对象的两种方法: 使用Object构造函数 var person2 = new Object(); person2.name="Qian"; 使用对象的字面形式 ...

最新文章

  1. 如何将OpenCV中的Mat类绑定为OpenGL中的纹理
  2. 17年9月计算机二级试题,9月计算机二级MSOffice练习试题
  3. http请求在asp.net中的应用
  4. Oracle中临时表的深入研究
  5. C# 获取枚举的DescriptionAttribute内的字符串
  6. Java Netty (1)
  7. 单片机实验计数显示器C语言代码,单片机 计数显示器实验报告
  8. LM358电压跟随器
  9. PT8023W(单触控双输出 LED 调光 IC)
  10. win10 手动设置 DNS 地址
  11. SpringBoot GA/PRE/SNAPSHOT含义
  12. HTML5滑动(swipe)事件,移动端触摸(touch)事件
  13. c 实现走迷宫流程图_[求助]:迷宫问题 流程图
  14. 蓝桥杯试题:Fibonacci数列
  15. BZOJ 3875: [Ahoi2014Jsoi2014]骑士游戏 dp spfa
  16. uniapp获取微信授权登录和手机号一键登录(保姆教程)
  17. 基于单片机(STC89C52)的数字频率计
  18. swapidc鸟云模板源码开源
  19. 【AD】Altium designer2020大学阶段快速入门(一)
  20. BZOJ 1875[SDOI2009]HH去散步

热门文章

  1. mybatis自动生成mapping和实体
  2. _DataStructure_C_Impl:稀疏矩阵三元组
  3. PHP截取UTF-8字符串,解决半字符问题
  4. extend the gridview control
  5. 接口测试--apipost中cookie管理器的使用
  6. pytest测试框架(二)---fixture介绍
  7. 求1~100以内的素数,最简单的方式
  8. leaflet |(1)在R语言中导入高德地图
  9. web前端开发要不要找个师傅带?
  10. ajax 2分钟超时_ajax和axios、fetch的区别