你真的了解静态方法与实例方法的区别么?

这是一个经常被时时提出来的问题,很多时候我们以为理解了、懂了,但深究一下,我们却发现并不懂。

方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简单的回答两者定义的区别,静态方法不需要 new 就可以使用 实例化方法需要 new 了以后才可以使用。。。。我们真的理解了吗?

所以这是一篇讨论贴,各位大佬可以从内存消耗、应用速度、业务使用场景等等角度来分析一下静态与实例的区别。

本作品采用《CC 协议》,转载必须注明作者和本文链接
从来不存在被埋没的努力。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 8

static function const static $abc 都是大量使用的,尤其在 Model 层,因为应用静态的变量、方法,常量不是特定的对象,而是类。 例如:消息有N多个频道,const SYSTEM = 'system';const NOTICE = 'notice'; 例如:定义频道的名称

public static $typeName = [
        self::SYSTEM        => '系统',
        self::NOTICE        => '提醒',
    ];

例如:给用户发送通知

public static function forUser($user_id,$title,$content){
  'user_id' => ..,
  'at_time' => date(..)
}
2年前 评论

我的理解是,常用方法,程序中有多个类经常调用的方法发,之间又没有继承关系的,使用 静态,常驻内存,不需要每次实例化,方便调用速度快,因为是经常调用,所以占用内存也没关系。

需要按需加载,不会被多个类调用的方法,使用频次少,使用 动态,线程结束后会被 gc 自动清理。

2年前 评论
hard (楼主) 2年前

实例是单独的内存,实例是属性集,属性集可能也有单独的内存划分,但是静态的不一样,他们是固定的一块内存划分, php官方的这个示例也说明了

class sample_class
{
    static $var = 0;

    public function func_having_static_var($x = NULL)
    {

        if ($x === NULL)
        { return self::$var; }
        self::$var = $x;
    }
}

$a = new sample_class();
$b = new sample_class();

echo $a->func_having_static_var()."\n";
echo $b->func_having_static_var()."\n";
// this will output (as expected):
//  0
//  0

$a->func_having_static_var(3);

echo $a->func_having_static_var()."\n"; // 3
echo $b->func_having_static_var()."\n"; // 3
2年前 评论

我也想知道静态和非静态的实际区别。静态是常驻内存,想问一下,如果有多个web客户端请求接口,那么这个时候应该会有多个work进程。多个work进程是同时使用这些静态变量或静态方法吗?还是

2年前 评论
hard (楼主) 2年前
yaoxs (作者) 2年前
hard (楼主) 2年前

很多时候我并没有以为理解了、懂了。
一个语言百分之八十的功能,大部分人都用不到,这是事实。

在编码的时候,一个对象去描述一个子逻辑的时候,这个对象与之相关的属性都应该用到实例方法。举个例子,实例化了一个学生对象,有姓名有学号有班级等属性,那么在获取班级的时候读取数据不应该来自于一个静态方法,而来自学生对象提供的实例方法。
静态方法的存在是为某些时候提供一些便捷。比如验证一个学生是否属于某个学校的时候,使用静态方法传入学生id和学校id要比实例化学生对象和学校对象要便捷得多。

以上不是一个完整过程的探讨,论坛只能聊简洁的观点,有机会在线下畅谈吧。

2年前 评论
L学习不停 (作者) 2年前
yaoxs 2年前

理论上静态方法比实例化要快,代码里一般是写service层比较多

2年前 评论
幽弥狂

表示没看懂评论区的讨论······

2年前 评论
陈先生

看了下评论,说下我现在主要应用静态方法的位置
框架: hyperf/laravel

场景:工具类和代理

工具类主要是没有任何耦合,且仅仅是为了处理某一个行为,

门面:分发到对应的业务,例如 附件上传,做成门面,然后具体调用具体的类,别人不需要关注里面的实现流程, 直接 Class::function() 即可

不过 不建议到处都是static,如果全局都是static,为什么不直接考虑函数编程

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!