首頁 >後端開發 >php教程 >PHP入門教學之物件導向的特性分析(繼承,多型,介面,抽象類別,抽象方法等)

PHP入門教學之物件導向的特性分析(繼承,多型,介面,抽象類別,抽象方法等)

高洛峰
高洛峰原創
2016-12-22 11:52:38935瀏覽

本文實例講述了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;
?>

 

Demo4.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();
?>

   

Demo5.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();
?>

   

Demo6.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;
?>

   

.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;
?>

   

Demo9.php

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

   

Demo10.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;
?>

   

Demo11.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;
?>

   

Demo13.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;
?>

   

Demo14.php

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

   

Demo15.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();
?>

   

Demo16.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();
?>

   

Demo18.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();
?>

   

Demo19.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在运行!联想在运行!
?>

   

希望本文所述對大家PHP程式設計有所幫助。

更多PHP入門教程之物件導向的特性分析(繼承,多態性,介面,抽象類別,抽象方法等)相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn