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 和 HTML
Oct 09 PHP
计数器详细设计
Oct 09 PHP
如何从一个php文件向另一个地址post数据,不用表单和隐藏的变量的
Mar 06 PHP
PHP超级全局变量数组小结
Oct 04 PHP
php实现给图片加灰色半透明效果的方法
Oct 20 PHP
PHP制作用户注册系统
Oct 23 PHP
php版阿里大于(阿里大鱼)短信发送实例详解
Nov 30 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
Dec 21 PHP
浅析PHP中的闭包和匿名函数
Dec 25 PHP
自定义Laravel (monolog)日志位置,并增加请求ID的实现
Oct 17 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 PHP
PHP基于ip2long实现IP转换整形
Dec 11 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
php 连接mssql数据库 初学php笔记
2010/03/01 PHP
PHP警告Cannot use a scalar value as an array的解决方法
2012/01/11 PHP
php字符串截取的简单方法
2013/07/04 PHP
php环境无法上传文件的解决方法
2014/04/30 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
2014/11/22 PHP
php实现网站留言板功能
2015/11/04 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
2017/02/23 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
JQuery 国际象棋棋盘 实现代码
2009/06/26 Javascript
javascript中常用编程知识
2013/04/08 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
2013/06/19 Javascript
微信小程序开发实战教程之手势解锁
2016/11/18 Javascript
layer弹出层框架alert与msg详解
2017/03/14 Javascript
jquery PrintArea 实现票据的套打功能(代码)
2017/03/17 Javascript
jQuery实现简单的滑动导航代码(移动端)
2017/05/22 jQuery
ES6/JavaScript使用技巧分享
2017/12/14 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
2018/05/29 Javascript
JavaScript对象原型链原理解析
2020/01/22 Javascript
Vue.js 中制作自定义选择组件的代码附演示demo
2020/02/28 Javascript
js中forEach,for in,for of循环的用法示例小结
2020/03/14 Javascript
[04:53]DOTA2英雄基础教程 祈求者
2014/01/03 DOTA
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
windows下python之mysqldb模块安装方法
2017/09/07 Python
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
公关关系专员的自我评价分享
2013/11/20 职场文书
户外拓展活动方案
2014/02/11 职场文书
《第一次抱母亲》教学反思
2014/04/16 职场文书
注册资产评估专业求职信
2014/07/16 职场文书
旅游局领导班子“四风”问题对照检查材料思想汇报
2014/09/29 职场文书
2014年会计个人工作总结
2014/11/24 职场文书
幼儿园个人总结
2015/02/28 职场文书
朋友离别感言
2015/08/04 职场文书
2019年英语版感谢信(8篇)
2019/09/29 职场文书
PHP中->和=>的意思
2021/03/31 PHP
Python+uiautomator2实现自动刷抖音视频功能
2021/04/29 Python
在vue中import()语法不能传入变量的问题及解决
2022/04/01 Vue.js