php类static关键字

static变量,是类属性,静态成员属于类,不属于对象。意思是所有这个类的对象共享。举个例子,就是某车次的火车票数,全国各地的用户都可以购买这个车次的火车票,但如何判定该火车票的剩余票数呢?其中一个实现就可以通过static变量实现。将火车票剩余数量定义为static,每次有人购票(不同对象),同步修改该属性(static - 1)


作为静态变量,还可以在多个对象之间共享数据,创建好几个对象的时候,因为每次都是new的,所以创建的对象都不同,如果想让多个对象实例共享同一个变量,就可以用到静态变量。假设要编写一个类来跟踪网页浏览的人数,肯定不希望每次实例化该类时都把访问者数量置0,只是就可以将该属性设置为static

所以,static、global、单例模式,都可以放在数据库连接处,防止多次连接
还有,static最好保存固定值,如果保存动态值,可能会造成污染,导致不可预期的bug

静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象。
但是程序里面赋值可以保存对象

PHP是单进程,不像java多线程,存在内存共享问题,所以有线程同步问题,当然PHP可以借助扩展实现多线程

进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。
线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。

static和并发没任何关系

static变量放在内存堆中,效率会高些

PHP进程取决于php-fpm数量、PHP并发取决于php-fpm数量

当客户端发送一个请求时,web server会通过一个php-fpm进程去执行php代码,php代码的执行是单线程的。

那么,当有多个客户端同时发送请求时(并发),web server会通过php-fpm为每个请求开启一个单独进程去执行php代码

但并发的问题在于,在某一时间,客户端请求让php-fpm进程数量达到了最大限制数,这个时候,新来的请求只能等待空闲的php-fpm进程来处理,这就是多进程同步阻塞模式的弊端,当然还有进程过多所带来的内存占用问题

另:

不同的请求是在不同的php-fpm进程中解析执行的,每个进程(系统进行资源分配和调度的基本单位)是独享内存的互不干扰;

static 静态属性是当脚本执行时就会直接加载到内存(堆)中(理论上比创建一个对象再去调用属性的效率高);

这个static是和并发扯不上关系的,但是恰当的使用static属性理论上会提高脚本执行速度,所以会减少该脚本单位执行次数的时间,从而提高并发时系统的抗压能力。

额外:php的并发数理论上取决于php-fpm的进程数量

关于php-fpm:php运行原理

<?php
class Visitor
{
    private static $visitors = 0;

    public function __construct()
    {
        self::$visitors++;
    }

    public static function getVisitors()
    {
        return self::$visitors;
    }
}

// 实例化
$visitor1 = new Visitor();
echo Visitor::getVisitors() . "\n";        // 1

$visitor2 = new Visitor();
echo Visitor::getVisitors() . "\n";        // 2

猜你喜欢

转载自blog.csdn.net/weixin_38230961/article/details/84941394
今日推荐