美文网首页
面向对象的一些概念

面向对象的一些概念

作者: 邱杉的博客 | 来源:发表于2017-10-12 17:22 被阅读0次

面向接口编程

接口定义一套规范,描述一个“物”的功能,要求如果现实中的“物”想成为可用,就必须实现这些基本功能。

接口本身并不提供实现,只是提供一个规范。如果我们知道一个类实现了某个接口,那么就知道了可以调用该接口的哪些方法,我们只需要知道这些就够了。

由于PHP是弱类型,且强调灵活,所以并不推荐大规模使用接口,而是仅在部分“内核”代码中使用接口,因为PHP中的接口已经失去很多接口应该具有的语义。从语义上考虑,可以更多地使用抽象类。至于抽象类和接口的比较,不再赘述。

接口作为一种规范和契约存在。作为规范,接口应该保证可用性;作为契约,接口应该保证可控性。
PHP中的接口存在两个不足,一是没有契约限制,二是缺少足够多的内部接口。

一个子类如果implements一个接口,就必须实现接口中的所有方法(不管是否需要);如果继承一个抽象类,只需要实现需要的方法即可
如果一个接口中定义的方法名改变了,那么所有实现此接口的子类需要同步更新方法名;而抽象类中如果方法名改变了,其子类对应的方法名将不受影响,只是变成了一个新的方法而已
抽象类只能单继承,当一个子类需要实现的功能需要继承多个父类时,就必须使用接口

interface Demo
{
  public function func1();
  public function func2();
}

interface Demo2 extends Demo
{
  public function func3();
  public function func4();
} 

interface Demo3 
{
  public function func5();
  public function func6();
}

class ParentClass
{
  public function func7(){}
}


class ChildClass extends ParentClass implements Demo2, Demo3
{
  public function func1(){}
  public function func2(){}
  public function func3(){}
  public function func4(){}
  public function func5(){}
  public function func6(){}
}

反射

面向对象编程中对象被赋予了自省的能力,而这个自省的过程就是反射。
反射,直观理解就是根据到达地找到出发地和来源。

$ref = new ReflectionClass($classname)
$ref->getProperties();
$ref->getMethods();
$ref->isInstantiable();
$res->newInstanceArgs();

在平常开发中,用到反射的地方不多:一个是对对象进行调试,另一个是获取类的信息。在MVC和插件开发中,使用反射很常见,但是反射的消耗也很大,在可以找到替代方案的情况下,就不要滥用。

很多时候,善用反射能保持代码的优雅和简洁,但反射也会破坏类的封装性,因为反射可以使本不应该暴露的方法或属性被强制暴露了出来,这既是优点也是缺点。

<?php

// 厨师
class Cook
{
  public function meal()
  {
    echo 'meal <br>';
  }
  
  public function drink()
  {
    echo 'drink <br>';
  }
  
  public function ok()
  {
    echo 'ok <br>';
  }
}

// 命令接口
interface Command
{
  public function execute();
}

// 炒菜命令
class MealCommand implements Command
{
  public $cook;
  
  public function __construct($cook){
    $this->cook = $cook;
  }
  
  public function execute()
  {
    $this->cook->meal();
  }
}

// 饮料命令
class DrinkCommand implements Command
{
  public $cook;
  
  public function __construct($cook)
  {
    $this->cook = $cook;
  }
  
  public function execute()
  {
    $this->cook->drink();
  }
}

// 顾客下单
class cookController
{
  public $mealCommand;
  public $drinkCommand;
  
  public function __construct(MealCommand $mealCommand, DrinkCommand $drinkCommand)
  {
    $this->mealCommand = $mealCommand;
    $this->drinkCommand = $drinkCommand;
  }
  
  public function callMeal()
  {
    $this->mealCommand->execute();
  }
  
  public function callDrink()
  {
    $this->drinkCommand->execute();
  }
}

$cook = new Cook();
$mealCommand = new MealCommand($cook);
$drinkCommand = new DrinkCommand($cook);

$c = new cookController($mealCommand, $drinkCommand);
$c->callMeal();
$c->callDrink();

相关文章

  • JavaScript高级

    1 面向对象操作 - 回顾对象的基本概念 - 面向对象的相关概念 - 面向对象的特征和操作的实现方式 - 小练习 ...

  • PHP全栈学习笔记8

    面向对象的基本概念,面向对象编程,oop,面向对象,面向对象的分析,面向对象的设计,面向对象的编程,什么是类。 类...

  • PHP全栈学习笔记8

    面向对象的基本概念,面向对象编程,oop,面向对象,面向对象的分析,面向对象的设计,面向对象的编程,什么是类。 类...

  • 面向对象-01基本概念

    面向对象(OOP)基本概念 目标 01.面向对象基本概念 ●面向对象和面向过程,是两种不同的编程方式●对比面向过程...

  • 面向对象的一些概念

    面向接口编程 接口定义一套规范,描述一个“物”的功能,要求如果现实中的“物”想成为可用,就必须实现这些基本功能。 ...

  • 面向对象的一些概念

    参考文献:http://www.cppblog.com/snowball/archive/2011/10/05/5...

  • JavaScript面向对象核心知识归纳

    面向对象 概念 面向对象就是使用对象。面向对象开发就是使用对象开发。 面向过程就是用过程的方式进行开发。面向对象是...

  • 面向对象

    了解什么是面向对象 首先,我们学习面向对象,要了解什么是面向对象,面向对象的重要概念:类,对象。 面向对象提出的这...

  • 不积跬步之我们来聊一下原型和原型链模式

    首先我们要明确一个概念,JavaScript是一门面向对象的语言。既然是面向对象的语言,那么面向对象的一些基本的属...

  • JS面向对象

    JS面向对象入门 1、面向对象语言概念面向对象语言主要包括 类、对象、封装、多肽。2、面向对象的编程思想面向过程思...

网友评论

      本文标题:面向对象的一些概念

      本文链接:https://www.haomeiwen.com/subject/azsoyxtx.html