PHP中类与对象功能、用法实例解读


Posted in PHP onMarch 27, 2020

本文实例讲述了PHP中类与对象功能、用法。分享给大家供大家参考,具体如下:

1. 类与对象

类是面向对象程序设计的基本概念,是一类东西的结构描述 , 是一种抽象的概念 . 对象是一类东西的一个具体的实例 , 是具体事物 .

对象通过new关键字进行实例化:
比如汽车可以抽象为一个类,汽车拥有名字、轮胎、速度、重量等属性,可以有换挡、前进、后退等操作方法。

// 定义一个汽车类
class Car {
  $name = '汽车';
  function getName() {
    return $this->name;
  }
}
//对象通过new关键字进行实例化 
$car = new Car();
echo $car->getName();
2. 属性与对象

在类中定义的变量称之为属性。属性声明是由关键字 public,protected 或者 private 开头,后面跟一个普通的变量声明来组成。属性的变量可以设置初始化的默认值,默认值必须是常量。

方法就是在类中的function,很多时候我们分不清方法与函数有什么差别,在面向过程的程序设计中function叫做函数,在面向对象中function则被称之为方法。

访问控制的关键字代表的意义为:

  • public:公开的 , 任何地方都可以访问
  • protected:受保护的 , 类内自身 , 其子类和父类可以访问
  • private:私有的 , 类内自身可访问

类属性的访问控制必须定义 , 即必须写出关键字 , 定义为三个中的一个
类方法不写关键字 , 则默认为公有的

class Car {
  public $speed = 0;
  //增加speedUp方法,使speed加10
  public function speedUp(){
    $this->speed += 10;
  }
}
// 创建对象
$car = new Car();
// 通过对象获取类属性与类方法
$car->speedUp();
echo $car->speed;
3. 构造函数与析构函数

PHP5可以在类中使用__construct()定义一个构造函数,具有构造函数的类,会在每次对象创建的时候调用该函数,因此常用来在对象创建的时候进行一些初始化工作。

在子类中如果定义了__construct则不会调用父类的__construct,如果需要同时调用父类的构造函数,需要使用parent::__construct()显式的调用。

同样,PHP5支持析构函数,使用__destruct()进行定义,析构函数指的是当某个对象的所有引用被删除,或者对象被显式的销毁时会执行的函数。

class Car {
  function __construct() {
    print "构造函数被调用 \n";
  }
  function __destruct() {
    print "析构函数被调用 \n";
  }
}
$car = new Car(); //实例化时会调用构造函数
echo '使用后,准备销毁car对象 \n';
unset($car); //销毁时会调用析构函数

当PHP代码执行完毕以后,会自动回收与销毁对象,因此一般情况下不需要显式的去销毁对象。

4. 静态属性与静态方法
  • 静态属性:
public / protected / private static $变量名

不用实例化类 , 直接调用 类名 :: $变量名
但实例化后 , 不允许使用 对象 -> $变量名

  • 静态方法
public / protected / private static function 方法名()

不用实例化类 , 直接调用 类名 :: 方法名()
实例化后 , 对象 -> 方法名()
静态方法中,$this伪变量不允许使用。可以使用self,parent,static在内部调用静态方法与属性。

class Car {
  private static $speed = 10;
  
  public static function getSpeed() {
    return self::$speed;
  }
  
  public static function speedUp() {
    return self::$speed+=10;
  }
}
class BigCar extends Car {
  public static function start() {
    parent::speedUp();
  }
}

BigCar::start();
echo BigCar::getSpeed();

如果构造函数定义成了私有方法,则不允许直接实例化对象了,这时候一般通过静态方法进行实例化,在设计模式中会经常使用这样的方法来控制对象的创建,比如单例模式只允许有一个全局唯一的对象。

class Car {
  private function __construct() {
    echo 'object create';
  }

  private static $_object = null;
  public static function getInstance() {
    if (empty(self::$_object)) {
      self::$_object = new Car(); //内部方法可以调用私有方法,因此这里可以创建对象
    }
    return self::$_object;
  }
}
$car = new Car(); //这里不允许直接实例化对象
$car = Car::getInstance(); //通过静态方法来获得一个实例
5. 继承

继承是面向对象程序设计中常用的一个特性,汽车是一个比较大的类,我们也可以称之为基类,除此之外,汽车还分为卡车、轿车、东风、宝马等,因为这些子类具有很多相同的属性和方法,可以采用继承汽车类来共享这些属性与方法,实现代码的复用。

class Car {
  public $speed = 0; //汽车的起始速度是0
  
  public function speedUp() {
    $this->speed += 10;
    return $this->speed;
  }
}
//建立一个Truck类,扩展Car类,并覆盖speedUp方法,使速度累加50
class Truck extends Car{
  public function speedUp(){
    parent::speedUp();
    $this->speed += 50;
    return $this->speed;
  }
}

$car = new Truck();
$car->speedUp();
echo $car->speed;
5. 重载

PHP中的重载指的是动态的创建属性与方法,是通过魔术方法来实现的。

  • 属性的重载通过__set,__get,__isset,__unset来分别实现对不存在属性的赋值、读取、判断属性是否设置、销毁属性。
class Car {
  private $ary = array();
  
  public function __set($key, $val) {
    $this->ary[$key] = $val;
  }
  
  public function __get($key) {
    if (isset($this->ary[$key])) {
      return $this->ary[$key];
    }
    return null;
  }
  
  public function __isset($key) {
    if (isset($this->ary[$key])) {
      return true;
    }
    return false;
  }
  
  public function __unset($key) {
    unset($this->ary[$key]);
  }
}
$car = new Car();
$car->name = '汽车'; //name属性动态创建并赋值
echo $car->name;
if ($car->age){
  echo '有';
}else{
  echo '无';
}
unset($car->name);
var_dump($car->name);
  • 方法的重载通过__call来实现,当调用不存在的方法的时候,将会转为参数调用__call方法,当调用不存在的静态方法时会使用__callStatic重载。
class Car {
  public $speed = 0;
  
  public function __call($name, $args) {
    if ($name == 'speedUp') {
      $this->speed += 10;
    }
  }
}
$car = new Car();
$car->speedUp(); //调用不存在的方法会使用重载
echo $car->speed;
6. 高级特性

对象比较,当同一个类的两个实例的所有属性都相等时,可以使用比较运算符 == 进行判断,当需要判断两个变量是否为同一个对象的引用时,可以使用全等运算符 === 进行判断。

class Car {
}
$a = new Car();
$b = new Car();
if ($a == $b) echo '==';  //true
if ($a === $b) echo '==='; //false

对象复制,在一些特殊情况下,可以通过关键字clone来复制一个对象,这时__clone方法会被调用,通过这个魔术方法来设置属性的值。

class Car {
  public $name = 'car';
  
  public function __clone() {
    $obj = new Car();
    $obj->name = $this->name;
  }
}
$a = new Car();
$a->name = 'new car';
$b = clone $a;
var_dump($b);

对象序列化,可以通过serialize方法将对象序列化为字符串,用于存储或者传递数据,然后在需要的时候通过unserialize将字符串反序列化成对象进行使用。

class Car {
  public $name = 'car';
}
$a = new Car();
$str = serialize($a); //对象序列化成字符串
echo $str.'<br>';
$b = unserialize($str); //反序列化为对象
var_dump($b);

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

PHP 相关文章推荐
PHP安全技术之 实现php基本安全
Sep 04 PHP
过滤掉PHP数组中的重复值的实现代码
Jul 17 PHP
用php实现百度网盘图片直链的代码分享
Nov 01 PHP
php删除文件夹及其文件夹下所有文件的函数代码
Jan 23 PHP
解析PHP生成静态html文件的三种方法
Jun 18 PHP
php获取目标函数执行时间示例
Mar 04 PHP
浅谈php和.net的区别
Sep 28 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
Dec 18 PHP
linux下为php添加iconv模块的方法
Feb 28 PHP
轻松掌握php设计模式之访问者模式
Sep 23 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
Dec 12 PHP
Thinkphp 框架扩展之驱动扩展实例分析
Apr 27 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 #PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
Mar 27 #PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
Mar 26 #PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
Mar 26 #PHP
Centos7安装swoole扩展操作示例
Mar 26 #PHP
PHP开发api接口安全验证操作实例详解
Mar 26 #PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 #PHP
You might like
关于Appserv无法打开localhost问题的解决方法
2009/10/16 PHP
解析百度搜索结果link?url=参数分析 (全)
2012/10/09 PHP
php笔记之:php数组相关函数的使用
2013/04/26 PHP
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
PHP图片处理之图片背景、画布操作
2014/11/19 PHP
解析WordPress中的post_class与get_post_class函数
2016/01/04 PHP
实例说明js脚本语言和php脚本语言的区别
2019/04/04 PHP
地震发生中逃生十大法则
2008/05/12 Javascript
JQuery获取样式中的background-color颜色值的问题
2013/08/20 Javascript
js中的preventDefault与stopPropagation详解
2014/01/29 Javascript
jQuery实现鼠标可拖动调整表格列宽度
2014/05/26 Javascript
Javascript常用字符串判断函数代码分享
2014/12/08 Javascript
基于jQuery实现仿淘宝套餐选择插件
2015/03/04 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
vue自定v-model实现表单数据双向绑定问题
2018/09/03 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
2018/09/21 Javascript
前端 javascript 实现文件下载的示例
2020/11/24 Javascript
[49:08]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python发送邮件的实例代码(支持html、图片、附件)
2013/03/04 Python
python-docx修改已存在的Word文档的表格的字体格式方法
2018/05/08 Python
python实现飞机大战
2018/09/11 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
Python寻找路径和查找文件路径的示例
2019/07/10 Python
python BlockingScheduler定时任务及其他方式的实现
2019/09/19 Python
Tensorflow进行多维矩阵的拆分与拼接实例
2020/02/07 Python
HTML5引入的新数组TypedArray介绍
2012/12/24 HTML / CSS
妇科医生自荐信
2013/11/05 职场文书
求职简历自我评价范例
2014/03/12 职场文书
团日活动总结书
2014/05/08 职场文书
党员四风剖析材料
2014/08/27 职场文书
卫校毕业生自我鉴定
2014/09/28 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
大学生入党群众意见书
2015/06/02 职场文书
自考生自我评价
2019/06/21 职场文书
python数字类型和占位符详情
2022/03/13 Python
python中validators库的使用方法详解
2022/09/23 Python