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传递到类的所有实例中

  1. <?php
  2. class MyClass {
  3. static $count = 0;
  4. public $unique_id;
  5. function __construct(){
  6. self::$count++;
  7. $this->unique_id = self::$count;
  8. }
  9. }
  10.  
  11. $obj1 = new MyClass();
  12. echo $obj1->unique_id . PHP_EOL;
  13. $obj2 = new MyClass();
  14. echo $obj2->unique_id . PHP_EOL;
  15. ?>

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函数定义

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

>类的常量对大小写敏感

  1. <?php
  2. class MyColorEnumClass {
  3. const RED = "red";
  4. const GREEN = "green";
  5. const BLUE = "blue";
  6.  
  7. static function printColor(){
  8. print self::RED . PHP_EOL;
  9. print self::GREEN . PHP_EOL;
  10. print self::BLUE . PHP_EOL;
  11. }
  12. }
  13.  
  14. MyColorEnumClass::printColor();
  15. ?>

5,对象克隆

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

  1. <?php
  2. class MyClass {
  3. public $var = 1;
  4. }
  5.  
  6. $obj1 = new MyClass();
  7. //$obj2 = $obj1;
  8. $obj2 = clone $obj1;
  9. $obj2->var = 2;
  10. //使用$obj2 = $obj1, 下面输出2
  11. //使用$obj2 = clone $obj1, 下面输出1
  12. echo $obj1->var . PHP_EOL;
  13.  
  14. ?>

6,多态

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

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

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

  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面向对象精要> 买这本书的原因主要是因为作者,Nicholas C. Zakas 牛X闪闪的js专家,读过js高程的应该都知道他,而这本书是他的最新力作,感觉也是js ...

  2. 03.JavaScript 面向对象精要--理解对象

    JavaScript 面向对象精要--理解对象 尽管JavaScript里有大量内建引用类型,很可能你还是会频繁的创建自己的对象.JavaScript中的对象是动态的. 一.定义属性 当一个属性第1次 ...

  3. javascript面向对象精要第三章对象整理精要

    什么是对象的数据属性?什么是对象的访问器属性?[put]方法是默认创建数据属性的,访 问器属性不包含值而是定义了一个单属性被读取时调用的函数(getter)和当一个属性被写入时 调用的函数(sette ...

  4. 02.JavaScript 面向对象精要--函数

    在JavaScript中,函数其实也是对象.是函数不同于其他对象的特点是:函数存在一个被称为[[Call]]的内部属性.[[Call]]属性是函数独有的,表明该对象可以被执行.ECMAScript 定 ...

  5. 01.JavaScript 面向对象精要--原始类型和引用类型

    一.什么是类型 JavaScript 虽然没有类的概念.但依然存在两种类型:原始类型和应用类型. 原始类型保存为简单的数据值,引用类型则保存为对象,其本质是指向内存位置 的引用.也就是说:原始值被直接 ...

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

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

  7. JavaScript面向对象精要

    来自:淡忘~浅思. 链接:http://www.ido321.com/1585.html 和 http://www.ido321.com/1586.html 数据类型   在JavaScript中,数 ...

  8. javascript面向对象精要第六章对象模式整理精要

    混入是一种给对象添加功能同时避免继承的强有力的方式,混入时将一个属性从一个对象 复制到另一个,从而使得接收者在不需要继承的情况下获得其功能.和继承不同,混入之后 对象无法检查属性来源.因此混入最适宜用 ...

  9. javascript面向对象精要第五章继承整理精要

    javascript中使用原型链支持继承,当一个对象的[prototype]设置为另一个对象时, 就在这两个对象之间创建了一条原型对象链.如果要创建一个继承自其它对象的对象, 使用Object.cre ...

  10. javascript面向对象精要第四章构造函数和原型对象整理精要

随机推荐

  1. Python3.5 学习十九 Django分模块讲解 MTV+URL

    本节内容概述: 表单提交的Method使用规则:get 获取数据 post提交数据 单选使用get 多选使用getlist request.POST.getlist("favor" ...

  2. 跟着刚哥学习Spring框架--JDBC(六)

    Spring的JDBC框架 Spring JDBC提供了一套JDBC抽象框架,用于简化JDBC开发. Spring主要提供JDBC模板方式.关系数据库对象化方式.SimpleJdbc方式.事务管理来简 ...

  3. JVM锁优化

    1. 概述 JDK1.6版本花费了大量精力去实现各种锁优化,如适应性自旋,锁消除,锁粗化,轻量级锁,偏向锁等,这些技术都是为了在线程期间更高效的共享数据,以及解决竞争问题. 2. 自旋锁与自适应自旋 ...

  4. .net core Error -4090 EADDRNOTAVAIL address not available”

    问题原因:IP地址错误或者网络未开

  5. linux设置静态ip地址

    首先我们使用ifconfig查看网卡配置信息 我们进入需要设置的网卡的配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 我们可以看到默认的配置是d ...

  6. 【sping揭秘】2、关于spring配置文件

    <import>标签 引入其他的配置文件,如果A.xml 中的<bean>定义可能依赖B.xml中的某些<bean>定义,那么可以再A.xml中使用这种方式< ...

  7. Django模版语言自定义标签-实现前端 关联组合过滤查询

    前端关联 组合过滤查询 实现效果如图: models.py 创建表代码 from django.db import models # Create your models here. class Le ...

  8. 前端基础——css

    前端基础——css css的内容主要包括:盒子模型.定位.单位与取值.属性.选择器.

  9. C# 多线程学习系列三之CLR线程池系列之ThreadPool

    一.CLR线程池 1.进程和CLR的关系一个进程可以只包含一个CLR,也可以包含多个CLR2.CLR和AppDomain的关系一个CLR可以包含多个AppDomain3.CLR和线程池的关系一个CLR ...

  10. 函数指针与typedef

    #include<bits/stdc++.h> using namespace std; //定义一个函数指针 typedef int (*Fun)(int,int); int add(i ...