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 相关文章推荐
织梦模板标记简介
Mar 11 PHP
php学习之 认清变量的作用范围
Jan 26 PHP
php自动注册登录验证机制实现代码
Dec 20 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
Jun 12 PHP
PHP的邮件群发系统phplist配置方法详细总结
Mar 30 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
Apr 30 PHP
PHP中仿制 ecshop验证码实例
Jan 06 PHP
PHP完全二叉树定义与实现方法示例
Oct 09 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
Apr 27 PHP
PHP设计模式之抽象工厂模式实例分析
Mar 25 PHP
php生成微信红包数组的方法
Sep 05 PHP
基于PHP实现发微博动态代码实例
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的图形函数中显示汉字
2006/10/09 PHP
php 不同编码下的字符串长度区分
2009/09/26 PHP
PHP使用get_headers函数判断远程文件是否存在的方法
2014/11/28 PHP
PHP基于curl后台远程登录正方教务系统的方法
2016/10/14 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
2019/09/30 PHP
javascript中获取下个月一号,是星期几
2012/06/01 Javascript
JavaScript的事件绑定(方便不支持js的时候)
2013/10/01 Javascript
javascipt匹配单行和多行注释的正则表达式
2013/11/20 Javascript
详解nodejs与javascript中的aes加密
2016/05/22 NodeJs
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
2017/01/04 Javascript
Gulp实现静态网页模块化的方法详解
2018/01/09 Javascript
javascript用rem来做响应式开发
2018/01/13 Javascript
编写一个javascript元循环求值器的方法
2020/04/14 Javascript
jQuery HTML设置内容和属性操作实例分析
2020/05/20 jQuery
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
[42:25]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第三场
2018/04/06 DOTA
Python的高级Git库 Gittle
2014/09/22 Python
解决uWSGI的编码问题详解
2017/03/24 Python
Python 3中print函数的使用方法总结
2017/08/08 Python
在VS Code上搭建Python开发环境的方法
2018/04/06 Python
不知道这5种下划线的含义,你就不算真的会Python!
2018/10/09 Python
Python3实现mysql连接和数据框的形成(实例代码)
2020/01/17 Python
python爬虫模块URL管理器模块用法解析
2020/02/03 Python
Python使用docx模块实现刷题功能代码
2020/02/13 Python
python网络编程:socketserver的基本使用方法实例分析
2020/04/09 Python
快速创建python 虚拟环境
2020/11/28 Python
Python Socket多线程并发原理及实现
2020/12/11 Python
canvas 阴影和图形变换的示例代码
2018/01/02 HTML / CSS
CK加拿大官网:Calvin Klein加拿大
2020/03/14 全球购物
采购人员的个人自我评价
2014/01/16 职场文书
员工辞职信怎么写
2015/02/27 职场文书
《为人民服务》教学反思
2016/02/20 职场文书
导游词之西安骊山
2019/12/03 职场文书
golang特有程序结构入门教程
2021/06/02 Python