php 能打印一个没有实例化的类_你理解 PHP 中的静态方法吗?

news/2024/7/5 2:28:05

它仍然是一个有争议的话题。让我们尝试了解原因。

函数中的静态变量

您可能已经看过以下代码:

function testStatic() {static $x = 0;$x++;return $x;
}

在这里,我们每次调用 testStatic() 时,关键字 static 允许递增 $x

testStatic();
testStatic();
testStatic();
echo testStatic();

最后输出 “4”。与其他局部变量不同,静态变量将其值保留在函数作用域之外。

关于这点有一些有趣的用法,例如备忘录。人们使用此技术存储复杂运算之后的结果来优化其脚本。

PHP 类中的静态

每次在 PHP 类中使用关键字 static 时,都在设置与类相关的内容。你无需实例化类即可访问它们:

class MyClass {public static $myStaticVar;public static function myStaticFunction() {}
}MyClass::myStaticFunction();
MyClass::$myStaticVar;

换句话说,你不会将变量和函数绑定到特定对象示例上。

但是,它与过程编程有何不同?为什么还要通过类来使用呢?

静态方法与过程函数

你的代码经常需要一些辅助类,大多数时候,它们以静态调用的形式存在。

$title = TextUtils::normalizeTitle($title);

但是与下面这个有什么不同呢?

$title = normalizeTitle($title);

对于 PHP 而言,这可能没什么不同。静态方法相当于命名空间函数,仅此而已。

命名空间从 PHP 5.5 开始引入。从技术上讲,下面例子中的简单的函数与静态方法没什么不同。

$title1 = TheNamespaceTextUtils::normalizeTitle($title);
$title2 = TheNamespacenormalizeTitle($title);

所以如果类中的所有成员都是静态的,那么就可以改写成过程函数和命名空间的形式。但是总是如此吗?

静态 VS 面向对象

你不需要实例化类来访问其静态方法。因此,你的类的所有实例都共享相同的静态方法。

在 PHP 类中,你可通过 $this 来获取当前实例,而静态方法无法访问它。

来看看下面这个例子

<?php
class Order {public $price;public function __construct($price) {$this->price = self::formatPrice($price);}protected static function formatPrice($price) { return round($price, 3);}
}$order = new Order('73.1111');
echo $order->price;

formatPrice() 不需要使用 $this,因为该方法并没有涉及到实例的变更。它是静态的,所有的实例共享该方法。

利弊

许多开发更喜欢用非静态方法而不是静态方法。一些人认为静态方法会破坏类的封装性,另外一些则说静态方法会导致代码异味。

不要误解我,这些确实是事实。我的意思是对于该话题的讨论存在一些迷思,例如:

静态代码不安全。

相反,在应用中设置非可变元素似乎更安全。

如果你有大量的数据,使用静态可能不是一个好主意。如果你需要状态机制,也就是说,需要使用逻辑隔离的实例,这似乎也不是一个好主意。

总结

静态可能不错,但可能被误用了。只是在同等条件下,你不能将其应用于任何事情。

我喜欢 OOP,这是一个很棒的范例,但是我想知道是否所有的东西都需要一个对象。我想不是,我有想听听你的意见。

更多学习内容请访问:

八重樱:腾讯T3-T4标准精品PHP架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)​zhuanlan.zhihu.com
8c797f5996896fabaa6fe2a02e5a392b.png

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的官方群点击此处。


http://lihuaxi.xjx100.cn/news/245774.html

相关文章

mysql之修改表引擎

版权声明&#xff1a;欢迎转载&#xff0c;请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/49817841 刚入门mysql的时候&#xff0c;对innodb引擎和myisam引擎没有很好的理解&#xff0c;所以表引擎用的基本上就是myisam&#xff0c;反正也不懂哪一个好…

Unix_Linux系统定时器的应用(案例)

2014-05-05 Created By BaoXinjian 一、摘要 关于任务定时的命令crontab&#xff0c;在Linux中应用还算常见&#xff0c;这次为了配合开发完成一些辅助功能&#xff0c;以及一些备份更新等脚本&#xff0c;就需要crontab来完成&#xff0c;在windows下也就是一个批处理&#xf…

约瑟夫环 猴子选大王

<? /*** 猴子选大王&#xff1a;一群猴子排成一圈&#xff0c;按1,2,…,n依次编号。* 然后从第1只开始数&#xff0c;数到第m只,把它踢出圈&#xff0c;从它后面再开始数&#xff0c;再数到第m只&#xff0c;在把它踢出去…&#xff0c;* 如此不停的进行下去&#xff0c;直…

linux修改mysql密码sa_数据库sa初始密码

SQL Server之备份和还原系统数据库系统数据库是管理和维护SQL Server所必须的数据库&#xff0c;对服务器实例的运行至关重要。每次进行大量更新后必须备份多个系统数据库&#xff0c;包括master、model、msdb&#xff0c;备份这些系统数据库&#xff0c;就可以在发生系统故障(…

[Java基础] Java如何实现条件编译

条件编译绝对是一个好东西。如在C或CPP中&#xff0c;可以通过预处理语句来实现条件编译。但是在JAVA中却没有预处理&#xff0c;宏定义这些东西&#xff0c;而有时在一些项目中&#xff0c;我们又需要条件编译。那么&#xff0c;在JAVA中&#xff0c;该如何实现条件编译呢&…

《Programming WPF》翻译 第7章 3.笔刷和钢笔

原文:《Programming WPF》翻译 第7章 3.笔刷和钢笔为了在屏幕上绘制一个图形&#xff0c;WPF需要知道你想要为图形填充什么颜色以及如何绘制它的边框。WPF提供了一些Brush类型支持各种绘图样式。Pen类增加这些笔刷以提供边框的厚度和样子。 在这一章&#xff0c;我们将要看一下…

mysql innodb引擎丢失_【MySQL】InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据...

注意&#xff01;此方法只适用于innodb_file_per_table独立表空间的InnoDB实例。此种方法可以恢复ibdata文件被误删、被恶意修改&#xff0c;没有从库和备份数据的情况下的数据恢复&#xff0c;不能保证数据库所有表数据的100%恢复&#xff0c;目的是尽可能多的恢复。恢复数据前…

JXJJOI2018_T1_market

题目描述 某天Lemon去超市买柠檬&#xff0c;他发现货架上有N个柠檬&#xff0c;每个柠檬都有一个重量Wi和价格Ci。 Lemon身上只带了S元钱&#xff0c;因此他想要买一个价格不超过S的柠檬回家&#xff0c;另外&#xff0c;他希望他买的那个柠檬的性价比尽量高。 性价比的定义是…