Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >php学习之类与对象的类的静态方法

php学习之类与对象的类的静态方法

作者头像
吾爱乐享
发布于 2019-12-30 09:09:44
发布于 2019-12-30 09:09:44
63900
代码可运行
举报
文章被收录于专栏:吾爱乐享吾爱乐享
运行总次数:0
代码可运行

基本介绍

当程序员需要对静态属性进行操作时,就需要定义静态方法处理,静态方法是专门操作静态属性的

基本语法

class 类名{

访问修饰符 static function 函数名 (){

//函数体

}

}

说明:

  1. 静态方法是在类中定义的
  2. static是关键词
  3. 静态方法是专门用于操作静态属性
  4. 静态方法可以直接用类名调用,形式是:类名::静态方法名(参数)

小案例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php

//静态方法
class Person{
public $name;
private static $age=18;
//静态方法来操作静态属性
public static function getAge(){
echo '年龄是 '.self::$age;
}
}
//通过类名在外部直接调用静态方法
Person::getAge();
?>

静态方法注意事项

  • 在类的外部调用静态方法:类名::静态方法名,或者对象名->静态方法名或者对象名::静态方法名,后面两种不推荐使用
  • 在类的内部调用静态方法:self::静态方法名  或者类名::静态方法名,通过$this也可以
  • 静态方法中只能访问静态属性, 不能访问非静态属性
  • 普通成员方法,既可以访问非静态属性也可以访问静态属性
  • 如果静态方法被protected或private修饰,也不能在类的外部使用

案例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php

//静态方法
class Person{
public $name;
private static $age=18;

//构造方法
public function __construct($name){
$this->name=$name;
}
//静态方法来操作静态属性
public static function getAge(){
echo '年龄是 '.self::$age;
//静态方法中只能访问静态属性,不能访问非静态属性
//echo $this->name.'的年龄是 '. self::$age;//这样写是错误的 不能访问非静态属性
//echo self::$name.'的年龄是 '. self::$age;//这样写也是错误的 不能访问非静态属性
}
//在类的内部调用静态方法
public function show(){
//方法一:self::方法名
self::getAge();
//方法二:类名::方法名
Person::getAge();
//方法三:$this->方法名
$this->getAge();
}
}


//通过类名在外部直接调用静态方法
Person::getAge();
//在类的外部通过对象调用静态方法
$person = new Person('张三');
$person->getAge();
//在类的外部通过对象名::静态方法调用
$person::getAge();

$person->show();
?>

静态属性和静态方法实战: 单例模式

编写一个操作数据库的工具类,要求只能创建一个对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
//编写一个操作数据库的工具类,要求只能创建一个对象

class DaoMysql{
//定义需要的属性
//连接数据库
private $mysql_link;
//定义一个静态属性,用来类的对象实例
private static $instance = null;
//构造方法
public function __construct($host,$user,$pass){
//这里只连接一次数据库,减少资源

$this->mysql_link = @mysql_connect($host,$user,$pass);
echo $this->mysql_link;
}
//写一个静态方法,通过这个静态方法来创建对象实例
public static function getSingleton($host,$user,$pass){
//通过getSingleton来创建对象
//判断控制是否已经创建过对象
if(self::$instance == null){
self::$instance = new DaoMysql($host,$user,$pass);
}
return self::$instance;
}
//阻止克隆
private function __clone(){}
}

$dao1 = DaoMysql::getSingleton('localhost','root','');
$dao2 = DaoMysql::getSingleton('localhost','root','root');
var_dump($dao1,$dao2);//结果都是同一个对象

?>

另一种写法(推荐)

instance是类型运算符,它用于判断某个变量是否是某个类的对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
//编写一个操作数据库的工具类,要求只能创建一个对象

class DaoMysql{
//定义需要的属性
//连接数据库
private $mysql_link;
//定义一个静态属性,用来类的对象实例
private static $instance = null;
//构造方法
public function __construct($host,$user,$pass){
//这里只连接一次数据库,减少资源

$this->mysql_link = @mysql_connect($host,$user,$pass);
echo $this->mysql_link;
}
//写一个静态方法,通过这个静态方法来创建对象实例
public static function getSingleton($host,$user,$pass){
//通过getSingleton来创建对象
//判断控制是否已经创建过对象
/* //第一种写法
if(self::$instance == null){
self::$instance = new DaoMysql($host,$user,$pass);
}
return self::$instance;
} */
//第二种写法
//instanceof是类型运算符,它用于判断某个变量是否是某个类的对象
if(!self::$instance instanceof self){
self::$instance = new self($host,$user,$pass);
}
return self::$instance;
}
//阻止克隆
private function __clone(){}
}

$dao1 = DaoMysql::getSingleton('localhost','root','');
$dao2 = DaoMysql::getSingleton('localhost','root','root');
var_dump($dao1,$dao2);//结果都是同一个对象

?>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-11-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Apriso 中启用 Redis 存储会话提升性能
Apriso 从 2022 版本开始在基础架构中增加了对 Redis 内存数据库的支持,用于存放会话状态、快速缓存存储。2022 之前版本是存储在 ASP.NET State Service 和 DELMIA Apriso State Service 中。将用户会话存储在系统服务外的 Redis 数据库中可以避免故障转移集群切换节点时丢失用户会话,避免用户重新登录。
李英杰同学
2023/09/02
4060
Apriso 中启用 Redis 存储会话提升性能
windows下redis可视化客户端redisClient的安装及基本使用
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/it_0101/article/details/77745109
拓荒者
2019/03/16
2.4K1
windows下redis可视化客户端redisClient的安装及基本使用
Redis高级客户端Lettuce详解
Lettuce是一个Redis的Java驱动包,初识她的时候是使用RedisTemplate的时候遇到点问题Debug到底层的一些源码,发现spring-data-redis的驱动包在某个版本之后替换为Lettuce。Lettuce翻译为生菜,没错,就是吃的那种生菜,所以它的Logo长这样:
猿天地
2019/10/24
5.2K0
RedisClient的安装及基本使用[通俗易懂]
管理redis的可视化客户端目前较流行的有三个:Redis Client ; Redis Desktop Manager ; Redis Studio.
全栈程序员站长
2022/09/27
2.9K0
初探 Redis 客户端 Lettuce:真香!
一次技术讨论会上,大家说起 Redis 的 Java 客户端哪家强,我第一时间毫不犹豫地喊出 "Jedis, YES!"
2020labs小助手
2021/07/14
2.4K0
几款连接redis的客户端(GUI客户端),下面记录了我使用的几款
除此外还有一大堆工具,这里就简单提一下,详细可以参考:https://zhuanlan.zhihu.com/p/210483494
全栈程序员站长
2022/10/02
18.6K0
几款连接redis的客户端(GUI客户端),下面记录了我使用的几款
Redis安装
安装前首先需要下载安装包,官网下载地址:https://redis.io/download/,这里选择redis7.0版本,下载之后上传到系统指定目录下,比如我上传到opt目录下,接着解压
程序员一博
2025/04/03
3220
Redis安装
可能是你用过最好用的Redis客户端!
说起数值型数据库,你心目中觉得哪一个是最棒的呢?Redis?Memcached?Amazon DynamoDB?
程序猿DD
2021/11/10
9971
漂亮又好用的Redis可视化客户端汇总,总有一款你需要的
项目地址:https://github.com/caoxinyu/RedisClient
用户4172423
2020/03/11
60.3K2
redis-cli sentinel_redis sentinel配置
RedisClient是一款纯java开发的开源客户端,原版本:https://github.com/caoxinyu/RedisClient,作者目前已经基本不再维护,最近想要使用一下,结果发现已经开始各种异常。应该是很久没更新的缘故。由于我们公司使用的哨兵模式,而且查看客户端的jedis版本确实有些古老并且发现使用的是单机版的Jedis,难怪会出现异常。例如:ERR unknown command ‘AUTH’ 肿么办?看了下介绍代码是开源的并且是纯java开发,要不自己改一改?好吧,开始我们的趟坑之旅 本文修改后的RedisClient版本:https://github.com/GallantKong/RedisClient
全栈程序员站长
2022/11/04
1.4K0
redis-cli sentinel_redis sentinel配置
一款开源、免费、跨平台的Redis可视化管理工具
经常有小伙伴在技术群里问:有什么好用的Redis可视化管理工具推荐的吗?, 今天大姚给大家分享一款我一直在用的开源、免费(MIT License)、跨平台的Redis可视化管理工具:Another Redis Desktop Manager。
追逐时光者
2024/03/13
4040
一款开源、免费、跨平台的Redis可视化管理工具
最强 Redis 客户端 lettuce 已支持 Redis6客户端
【L1】 内存缓存(如 Caffeine、Ehcache) —— 速度快,进程内可用,但重启缓存丢失,出现缓存雪崩的问题。
冷冷
2020/08/10
2K0
又一款更快、更好、更稳定的 Redis 可视化工具开源了!!!
ARDM(Another Redis Desktop Manager) 是一款更快、更好、更稳定的Redis桌面(GUI)管理客户端,兼容Windows、Mac、Linux,性能出众,轻松加载海量键值。
终码一生
2023/11/23
2.1K0
又一款更快、更好、更稳定的 Redis 可视化工具开源了!!!
Redis之Java客户端【Jedis,Spring Data Redis】
在Redis官网中提供了各种语言的客户端,地址:/docs/clients/,不过我是学Java的,那这里就给大家介绍javad的客户端。
叫我阿杰好了
2022/11/07
1.2K0
Redis之Java客户端【Jedis,Spring Data Redis】
redis几种java客户端比较
目前在项目中是混用jedis和redisson的状态,使用jedis是项目前期的原因,目前需要使用redisson的一些高级特性。
山行AI
2019/09/09
21.2K0
Redis客户端操作之Jedis
  在前面的文章给大家详细的介绍了Redis各种知识点,本文主要给大家介绍下java程序怎么操作Redis数据。
用户4919348
2019/04/02
1.3K0
Redis客户端操作之Jedis
使用了不到200行的核心代码就实现了一个美轮美奂的Redis客户端
工作长达10多年来,也许是Redis命令敲多了,突然有一个不想敲redis命令的冲动,于是就开始设计这款Redis图形化客户端。那么这次有人肯定会问我,Redis客户端有那么多,为什么不直接用,而要浪费时间去开发一个呢?关于此问题我的答案是:我有那个实力!
非喵鱼
2022/12/14
2710
使用了不到200行的核心代码就实现了一个美轮美奂的Redis客户端
Redis都要老了,你还在用什么古董客户端?
前几日,Redis 创始人 Antirez 在他的个人博客上宣布将结束自己的 Redis 之旅!
xjjdog
2020/07/09
7920
Jedis客户端以及redis中的pipeline批量操作
前面的章节介绍了redis的安装、还有命令配置等内容,我们在实际使用时大部分情况都是利用现成的Java客户端对redis进行操作。当然命令并不是没用,它极有可能在你排查问题时排上用场,因为你有可能会直接连入redis服务端通过命令行来排查是否是redis缓存的问题。
用户1148394
2020/02/26
4.6K0
android redis客户端,redis client (redis客户端)
redis client (redis客户端)是一款编程辅助软件。这款软件协助开发人员和保护人员便利的树立,修正,删去,查询redis数据,彻底不需要了解redis指令。能够让用户便利的修改数据,剪切,仿制,张贴redis数据,能够导入,导出redis数据,能够对redis数据排序,进步编程功率和准确性。
全栈程序员站长
2022/08/25
2.1K0
推荐阅读
相关推荐
Apriso 中启用 Redis 存储会话提升性能
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验