首页 后端开发 php教程 PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)

PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)

Dec 22, 2016 am 11:52 AM
面向对象

本文实例讲述了PHP面向对象的特性。分享给大家供大家参考,具体如下:

Demo1.php

<?php
  header(&#39;Content-Type:text/html; charset=utf-8;&#39;);
  //创建一个电脑类
  class Computer {
    //什么叫做类内,就是创建类的花括号内的范围叫做类内,其他地方则类外。
    //public 是对字段的公有化,这个字段类外即可访问,赋值和取值
    public $_name = &#39;联想&#39;;
  }
  $computer = new Computer();
  $computer -> _name = &#39;Dell&#39;;
  echo $computer->_name;
?>
登录后复制

Demo2.php

<?php
  header(&#39;Content-Type:text/html; charset=utf-8;&#39;);
  class Computer {
    //private 是私有化,即对字段进行封装的操作,类外无法访问,取值和赋值都不能操作
    private $_name = &#39;联想&#39;;
  }
  $computer = new Computer();
  echo $computer->_name;
?>
登录后复制

Demo3.php

<?php
  header(&#39;Content-Type:text/html; charset=utf-8;&#39;);
  class Computer {
    private $_name = &#39;联想&#39;;
    //这个时候我采用一个公共对外的方法来访问私有字段
    //因为私有字段只能在类内访问,而对外的公共方法是类内的。
    //更而公共方法又是公共的,所以类外又可访问。
    public function _run(){
      //字段在类内调用的时候必须是类 -> 字段,而$_name只是一个普通变量而已。
      //字段在类外调用的方法是对象 -> 字段,而类内就必须使用 Computer -> _name
      //但是在本类中,可以使用一个关键字来代替字来代替 Computer ,那就是 $this
      echo $this ->_name;
    }
  }
  $computer = new Computer();
  $computer -> _run();
?>
登录后复制

Demo4.php

<?php
  header ( &#39;Content-Type:text/html; charset=utf-8;&#39; );
  class Computer {
    private $name;
    private $model;
    private $cpu;
    private $keyboard;
    private $show;
    private $zb;
    //必须写个对外的入口,才可以取到
    public function getName() {
      return $this->name;
    }
    //必须写一个对内的入口,对私有字段进行赋值
    public function setName($name) {
      //这里的 $name 只是一个变量而已,参数而已
      //$this->name 才是类的字段
      $this->name = $name;
    }
  }
  $computer = new Computer ();
  echo $computer->getName();
  $computer->setName(&#39;Dell&#39;);
  echo $computer->getName();
?>
登录后复制

Demo5.php

<?php
  header ( &#39;Content-Type:text/html; charset=utf-8;&#39; );
  class Computer {
    private $_name;
    private $_model;
    private $_cpu;
    //当类外的对象直接调用私有字段时,会跟着去检查是否有拦截器,
    //如果直接对 $_name 进行赋值,那么__set 方法就会拦截住,就不会报错了。
    //采用拦截器进行赋值和取值
    //赋值
    private function __set($_key,$_value){
      //采用$_key = &#39;_name&#39;,那么 $_value = &#39;联想&#39;;
      //$this ->_name = &#39;联想&#39;;
      $this ->$_key = $_value;
    }
    //取值
    private function __get($_key){
      return $this -> $_key;
      //如果 $_key = &#39;_name&#39; 那么 $this -> _name;
      //如果 $_key = &#39;_cpu&#39; 那么 $this -> _cpu;
      //如果 $_key = &#39;_model&#39; 那么 $this -> _model;
    }
  }
  $computer = new Computer ();
  $computer->_name = &#39;联想&#39;;
  $computer->_cpu = &#39;四核&#39;;
  $computer->_model = &#39;i7&#39;;
  echo $computer->_name;
  echo $computer->_cpu;
  echo $computer->_model;
?>
登录后复制

Demo6.php

<?php
  header ( &#39;Content-Type:text/html; charset=utf-8;&#39; );
  class Computer {
    private $_name;
    private $_model;
    private $_cpu;
    //__set 和 __get 方法私有了,还是可以执行,是因为
    //因为目前程序的指针已经在类内了。而类内可以执行封装的方法
    //类内执行私有方法,不会出现任何错误。
    //它只需要间接的拦截就可以了。拦截是在内类执行的。
    //说白了,__set() 和 __get() 是 PHP 内置的方法,具有一定的特殊性
    private function __set($_key, $_value) {
      $this->$_key = $_value;
    }
    private function __get($_key) {
      return $this->$_key;
    }
  }
  $computer = new Computer ();
  $computer->_name = &#39;联想&#39;;
  $computer->_cpu = &#39;四核&#39;;
  $computer->_model = &#39;i7&#39;;
  echo $computer->_name;
  echo $computer->_cpu;
  echo $computer->_model;
?>
登录后复制

Demo7.php

<?php
  header ( &#39;Content-Type:text/html; charset=utf-8;&#39; );
  class Computer {
    const NAME = &#39;DELL&#39;;
  }
  //常量的输出方法 类::常量
  echo Computer::NAME;    //DELL
?>
登录后复制

Demo8.php

<?php
  header ( &#39;Content-Type:text/html; charset=utf-8;&#39; );
  class Computer {
    public $_count = 0;
    public function _add(){
      $this -> _count++;  //$_count = $_count+1 $_count++
    }
  }
  //做一个累计的效果
  $computer1 = new Computer();
  $computer1 ->_add();
  $computer1 ->_add();
  $computer1 ->_add();
  echo $computer1 -> _count;
  echo &#39;<br />&#39;;
  $computer2 = new Computer();
  $computer2 ->_add();
  $computer2 ->_add();
  $computer2 ->_add();
  echo $computer2 -> _count;
?>
登录后复制

Demo9.php

<?php
  header ( &#39;Content-Type:text/html; charset=utf-8;&#39; );
  class Computer {
    public static $_count = 0;
    public function _add(){
      //如果是静态成员字段,那么就应该用 self 来调用,而不是 $this
      self::$_count++;
    }
  }
  //做一个累计的效果
  $computer1 = new Computer();
  $computer1 ->_add();
  echo Computer::$_count;
  $computer1 ->_add();
  echo Computer::$_count;
  $computer1 ->_add();
  echo Computer::$_count;
  echo &#39;<br />&#39;;
  $computer2 = new Computer();
  $computer2 ->_add();
  echo Computer::$_count;
  $computer2 ->_add();
  echo Computer::$_count;
  $computer2 ->_add();
  echo Computer::$_count;
?>
登录后复制

Demo10.php

<?php
  header ( &#39;Content-Type:text/html; charset=utf-8;&#39; );
  class Computer {
    public static $_count = 0;
    public static function _add(){
      self::$_count++;
    }
  }
  Computer::_add();
  Computer::_add();
  Computer::_add();
  echo Computer::$_count;
?>
登录后复制

Demo11.php

<?php
  header ( &#39;Content-Type:text/html; charset=utf-8;&#39; );
  class Computer {
  }
  $computer = new Computer();
  echo $computer instanceof Computer;
?>
登录后复制

Demo12.php

<?php
  header ( &#39;Content-Type:text/html; charset=utf-8;&#39; );
  //这是父类,电脑类
  class Computer {
    public $_name = &#39;联想&#39;;
    public function _run(){
      echo &#39;联想在运行!&#39;;
    }
  }
  //子类,笔记本电脑类
  class NoteComputer extends Computer {
  }
  $noteComputer = new NoteComputer();
  echo $noteComputer -> _name;
  $noteComputer -> _run();
?>
登录后复制

Demo13.php

<?php
  header ( &#39;Content-Type:text/html; charset=utf-8;&#39; );
  class Computer {
    public $_name = &#39;联想&#39;;
    public function _run(){
      echo &#39;联想在运行!&#39;;
    }
  }
  class NoteComputer extends Computer {
    //我不需要父类的字段和方法,那么可以采用重写的方法覆盖掉父类的字段和方法
    public $_name = &#39;Dell&#39;;
    public function _run(){
      echo &#39;Dell在运行!&#39;;
    }
  }
  $noteComputer = new NoteComputer();
  echo $noteComputer -> _name;
  $noteComputer -> _run();
?>
登录后复制

Demo14.php

<?php
  header ( &#39;Content-Type:text/html; charset=utf-8;&#39; );
  class Computer {
    //私有化,但是无法被子类继承,这个时候就应该用受保护的修饰符来封装
    protected $_name = &#39;联想&#39;;
    protected function _run(){
      return &#39;联想在运行!&#39;;
    }
  }
  class NoteComputer extends Computer {
    public function getTop() {
      echo $this->_name;
      echo $this->_run();
    }
  }
  $noteComputer = new NoteComputer();
  $noteComputer -> getTop();
?>
登录后复制

Demo15.php

<?php
  header ( &#39;Content-Type:text/html; charset=utf-8;&#39; );
  class Computer {
    public $_name = &#39;联想&#39;;
    public function _run(){
      return &#39;联想在运行!&#39;;
    }
  }
  class NoteComputer extends Computer {
    //我子类已经覆盖了父类的字段和方法,
    //但是我又要调用父类的字段和方法,那怎么办呢?
    public $_name = &#39;Dell&#39;;
    public function _run(){
      echo &#39;Dell在运行!&#39;;
      echo parent :: _run();
    }
  }
  $noteComputer = new NoteComputer();
  echo $noteComputer -> _name;
  $noteComputer -> _run();
  //DellDell在运行!联想在运行!
?>
登录后复制

Demo16.php

<?php
  header ( &#39;Content-Type:text/html; charset=utf-8;&#39; );
  //final 如果加在类前面,表示这个类不能被继承
// final class Computer {
// }
  class Computer {
    //final 如果加在方法前面,表示不能够重写些方法
    final public function _run(){
    }
  }
  class NoteComputer extends Computer {
    public function _run(){
    }
  }
  $noteComputer = new NoteComputer();
?>
登录后复制

Demo17.php

<?php
  header ( &#39;Content-Type:text/html; charset=utf-8;&#39; );
  //创建一个抽象类,只要在 class 前面加上 abstract 就是抽象类了
  //抽象类不能够被实例化,就是创建对象
  //只在类里面有一个抽象方法,那么这个类必须是抽象类,类前面必须加上 abstract
  abstract class Computer {
    public $_name = &#39;联想&#39;;
    //抽象类里创建一个抽象方法
    //抽象方法不能够实现方法体的内容
    abstract public function _run();
    //我在抽象类里能否创建一个普通方法
    public function _run2(){
      echo &#39;我是父类的普通方法&#39;;
    }
  }
  //类不能够实现多继承,只支持单继承。
  //抽象类是给子类用来继承的,实现一种规范和资源的共享
  class NoteComputer extends Computer {
    //抽象类的抽象方法,子类必须重写,不然会报错。
    //抽象类里的普通方法不需要重写,子类会直接继承下来
    public function _run(){
      echo &#39;我是子类的方法&#39;;
    }
  }
  $noteComputer = new NoteComputer();
  $noteComputer -> _run();
  $noteComputer -> _run2();
  echo $noteComputer -> _name;
?>
登录后复制

Demo18.php

<?php
  /*
   * 到底应该用抽象类还是接口呢
   * 如果你要继承多个接口的方法规范,那么就用接口好了。
   * 如果你要共享一个方法体内容,那么就用抽象类。
   * */
  header ( &#39;Content-Type:text/html; charset=utf-8;&#39; );
  //创建一个接口
  //接口也不能被实例化
  //接口是为了规范实现它的子类,以达到统一的目的。也可以共享数据
  interface Computer {
    //成员字段必须是变量
    const NAME = &#39;成员 &#39;;
    //接口里的所有方法都是抽象方法,不能够写方法体
    //并且接口的抽象方法不需要写 abstract
    public function _run();
    public function _run2();
  }
  interface Computer2 {
    public function _run3();
  }
  //子类继承接口的说法,叫做实现,接口可以多实现
  class NoteComputer implements Computer,Computer2 {
    public function _run() {
      echo &#39;我重写了run&#39;;
    }
    public function _run3() {
      echo &#39;我重写了run3&#39;;
    }
    public function _run2() {
      echo &#39;我重写了run2&#39;;
    }
  }
  $noteComputer = new NoteComputer();
  $noteComputer -> _run();
  $noteComputer -> _run2();
  $noteComputer -> _run3();
  echo NoteComputer::NAME;
  //接口 :: 常量
  //echo Computer::NAME;
?>
登录后复制

Demo19.php

<?php
  header ( &#39;Content-Type:text/html; charset=utf-8;&#39; );
  //什么叫做多态,字面意思,多种形态
  //一个动作由不同的人去执行,而产生不同的效果或者效果,即为多态。
  //一个人通过不同的状态去执行同一种动作,形成不同的效果,也可以称作为多态。
  //园丁    剪    修理花草
  //理发师  剪    理发
  //总裁    剪    裁员
  //人   笔记本   运行 win7开机了
  //人   台式机   运行 xp开机了
  //创建一个接口,来规范运行的方法
  interface Computer {
    public function version(); //这个方法表示采用什么电脑
    public function work();   //这台电脑是怎么运行的
  }
  //创建一个笔记本的类实现接口
  class NoteComputer implements Computer {
    public function version() {
      echo &#39;笔记本&#39;;
    }
    public function work() {
      echo &#39;可以便携式运行 win7&#39;;
    }
  }
  //创建一个台式机的类实现接口
  class DesktopComputer implements Computer {
    public function version() {
      echo &#39;台式机&#39;;
    }
    public function work() {
      echo &#39;在工作站运行 XP&#39;;
    }
  }
  //创建一个用户
  class Person {
    //创建一个方法来接受电脑(笔记本电脑,也可以是台式电脑)
    //怎么接受,将他们的对象传进来就 OK 啦。
    public function _run($type) {
      echo &#39;这个人的&#39;;
      $type -> version();
      $type ->work();
    }
  }
  //多态的原理,就是类都写好了,不要去修改它,只要在类外的调用参数的更改
  //而最后的结果也会得到更改,那么这个就是多态。
  //有一个接口,两个类,一个是笔记本的类,一个是台式机的类
  //创建了笔记本
  $noteComputer = new NoteComputer();
  //创建台式机
  $desktopComputer = new DesktopComputer();
  //创建一个人
  $person = new Person();
  //使用电脑
  $person -> _run($noteComputer); //这种传递,叫做对象引用的传递
?>
登录后复制

   

希望本文所述对大家PHP程序设计有所帮助。

更多PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)相关文章请关注PHP中文网!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何使用Go语言实现面向对象的事件驱动编程 如何使用Go语言实现面向对象的事件驱动编程 Jul 20, 2023 pm 10:36 PM

如何使用Go语言实现面向对象的事件驱动编程引言:面向对象的编程范式被广泛应用于软件开发中,而事件驱动编程是一种常见的编程模式,它通过事件的触发和处理来实现程序的流程控制。本文将介绍如何使用Go语言实现面向对象的事件驱动编程,并提供代码示例。一、事件驱动编程的概念事件驱动编程是一种基于事件和消息的编程模式,它将程序的流程控制转移到事件的触发和处理上。在事件驱动

@JsonIdentityInfo注解在Java中使用Jackson的重要性是什么? @JsonIdentityInfo注解在Java中使用Jackson的重要性是什么? Sep 23, 2023 am 09:37 AM

当对象在Jackson库中具有父子关系时,将使用@JsonIdentityInfo注释。@JsonIdentityInfo 注解 用于在序列化和反序列化过程中指示对象身份。ObjectIdGenerators.PropertyGenerator是一个抽象占位符类,用于表示要使用的对象标识符来自POJO属性的情况。语法@Target(value={ANNOTATION_TYPE,TYPE,FIELD,METHOD,PARAMETER})@Retention(value=RUNTIME)public

探索Go语言中的面向对象编程 探索Go语言中的面向对象编程 Apr 04, 2024 am 10:39 AM

Go语言支持面向对象编程,通过类型定义和方法关联实现。它不支持传统继承,而是通过组合实现。接口提供了类型间的一致性,允许定义抽象方法。实战案例展示了如何使用OOP管理客户信息,包括创建、获取、更新和删除客户操作。

解析PHP面向对象编程中的享元模式 解析PHP面向对象编程中的享元模式 Aug 14, 2023 pm 05:25 PM

解析PHP面向对象编程中的享元模式在面向对象编程中,设计模式是一种常用的软件设计方法,它可以提高代码的可读性、可维护性和可扩展性。享元模式(Flyweightpattern)是设计模式中的一种,它通过共享对象来降低内存的开销。本文将探讨如何在PHP中使用享元模式来提高程序性能。什么是享元模式?享元模式是一种结构型设计模式,它的目的是在不同对象之间共享相同的

Go语言的面向对象特性解析 Go语言的面向对象特性解析 Apr 04, 2024 am 11:18 AM

Go语言支持面向对象编程,通过struct定义对象,使用指针接收器定义方法,并通过接口实现多态。面向对象特性在Go语言中提供了代码重用、可维护性和封装,但也存在缺乏传统类和继承的概念以及方法签名强制类型转换的局限性。

PHP高级特性:面向对象编程的最佳实践 PHP高级特性:面向对象编程的最佳实践 Jun 05, 2024 pm 09:39 PM

PHP中OOP最佳实践包括命名约定、接口与抽象类、继承与多态、依赖注入。实战案例包括:使用仓库模式管理数据,使用策略模式实现排序。

Golang中有类似类的面向对象特性吗? Golang中有类似类的面向对象特性吗? Mar 19, 2024 pm 02:51 PM

在Golang(Go语言)中并没有传统意义上的类的概念,但它提供了一种称为结构体的数据类型,通过结构体可以实现类似类的面向对象特性。在本文中,我们将介绍如何使用结构体实现面向对象的特性,并提供具体的代码示例。结构体的定义和使用首先,让我们看一下结构体的定义和使用方式。在Golang中,结构体可以通过type关键字定义,然后在需要的地方使用。结构体中可以包含属

PHP面向对象编程的深入理解:面向对象编程的调试技巧 PHP面向对象编程的深入理解:面向对象编程的调试技巧 Jun 05, 2024 pm 08:50 PM

通过掌握追踪对象状态、设置断点、追踪异常和利用xdebug扩展,可以有效调试PHP面向对象编程代码。1.追踪对象状态:使用var_dump()和print_r()查看对象属性和方法值。2.设置断点:在开发环境中设置断点,调试器将在执行到达断点时暂停,便于检查对象状态。3.追踪异常:使用try-catch块和getTraceAsString()获取异常发生时的堆栈跟踪和消息。4.利用调试器:xdebug_var_dump()函数可在代码执行过程中检查变量的内容。

See all articles