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

本文探讨了PHP中静态变量和方法的使用,它们在函数和类中的行为,以及与过程编程的区别。静态成员允许在不创建对象的情况下访问,但可能导致封装性降低和代码异味。文章还比较了静态方法与命名空间函数,并讨论了何时使用静态可能更为合适,以及其潜在的利弊。最后,提出了静态方法在某些情况下可能被过度使用的观点。
摘要由CSDN通过智能技术生成

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

函数中的静态变量

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

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等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的官方群点击此处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值