1、静态属性与方法

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

 <?php
class MyClass {
static $a = 0;
function getValue(){
return self::$a;
}
} $obj = new MyClass();
echo $obj->getValue() . PHP_EOL; echo MyClass::$a . PHP_EOL;
?>

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

<?php
class 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,静态方法

 <?php
class HelloWorld {
static function sayHello(){
print "Hello World";
self::printNewLine();
} static function printNewLine(){
echo PHP_EOL;
}
}
HelloWorld::sayHello();
HelloWorld::sayHello();
?>

4,类的常量

>全局常量用 define函数定义

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

>类的常量对大小写敏感

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

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

6,多态

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

<?php
class 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() );
?>

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

 <?php
abstract class Animal {
abstract function makeSound();
}
class Cat extends Animal{
function makeSound(){
echo "cat";
}
}
class Dog extends Animal{
function makeSound(){
echo "dog";
}
}
class Chicken extends Animal {
function makeSound(){
echo "chicken";
}
} function printTheRightSound( $obj ){
if( $obj instanceof Animal ) {
$obj->makeSound();
}else {
echo "传递了错误的对象类型";
}
echo PHP_EOL;
} printTheRightSound( new Cat() );
printTheRightSound( new Dog() );
printTheRightSound( new Chicken() );
?>

这样改造之后,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. 【May Be DNK】JSON.parse() and JSON.stringify()的两个实用技巧

    结论 一.数据深拷贝 使用方法:JSON.parse(JSON.stringify(param)) let o = {a: 1, b: 2} let o1 = JSON.parse(JSON.stri ...

  2. SQL 一对多联表查询最大值

    有两个数据表City表和Price表,CIty表的结构如下: Price表的结构如下: 查询每个城市最大的销售价格,并以最大价格进行降序排列,选取前5条记录,SQL语句的代码如下: * from (s ...

  3. Python小白学习之路(二十五)—【装饰器的应用】

    通过一个任务来加深对装饰器的理解和应用 回顾:装饰器的框架 def timmer(func): def wrapper(): func() return wrapper 任务:给以下正在运行的程序加一 ...

  4. Django中安装搜索引擎方法。

    全文检索 全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理. haystack:全文检索的框架,支持whoosh.solr.Xapian.Elasticsearc ...

  5. mongodb副本集升级步骤

    1. 先从Secondary开始升级,选择一个不繁忙节点在业务峰值低情况下升级2. 把Secondary设置为隐藏节点,停库,二进制升级重起3. 使用rs.status()查看,等待节点状态为Seco ...

  6. async await 的执行

    async await的执行 注意:本次代码仅在 Chrome 73 下进行测试. start 不了解 async await 的,先去看阮一峰老师的文章async 函数. 先来看一道头条的面试题,这 ...

  7. C# 发送HTTP请求超时解决办法

    request.GetResponse();超时问题的解决,和HttpWebRequest多线程性能问题,请求超时的错误, 解决办法 1.将http的request的keepAlive设置为false ...

  8. Python多线程、多进程实现

    劝君莫惜金缕衣,劝君惜取少年时.花开堪折直须折,莫待无花空折枝. 内容摘要: paramiko模块 进程.与线程区别 python GIL全局解释器锁 多线程    语法    join    线程锁 ...

  9. 插入排序的Java代码实现

    插入排序也是一类非常常见的排序方法,它主要包含直接插入排序,Shell排序和折半插入排序等几种常见的排序方法. 1.直接插入排序 直接插入排序的思路非常简单:依次将待排序的数据元素按其关键字值的大小插 ...

  10. Proxy代理模式(结构型模式)

    1.问题 在面向对象系统中,有些对象由于某种原因(比如创建对象的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给调用者带来麻烦,那么如何在不损失接口透明性的情况下,解决这些麻 ...