用PHP学习OO编码,静态!=表达式,但是PHP手册说所有有价值的东西都是表达式,很困惑

Mar*_*arc 3 php variables static

我开始学习OO几天就回来,我与程序编码相当确定的,但显然这是不够的,我想成为一个精通编码器有很多的经验和知识,所以首先要完全了解必须OO其次是我认为合适的设计模式.

无论如何,我有一件事我被困住了,我不太关注......

静态变量......我理解静态变量即使包含的函数执行完毕也不会丢失它的值,如果再次执行相同的函数,它将保持它的值,等等.

但是我不明白你现在究竟能分配给静态变量的是什么?关于stackoverflow状态的手册和无数问题,您无法将表达式分配给静态变量.

所以我阅读了PHP手册,找出究竟是什么被认为是表达式?手册的答案是(我引用):

"在PHP中,你写的几乎任何东西都是表达式.定义表达式的最简单但最准确的方法是"任何有价值的东西".

"当你输入"$ a = 5"时,你将'5'分配给$ a.'5',显然,值为5,或者换句话说'5'是表达式"

http://php.net/manual/en/language.expressions.php

现在,当您阅读手册中的变量范围时,他们就是这个例子:

    function test()
    {
    static $a = 0;
    echo $a;
    $a++;
    }
Run Code Online (Sandbox Code Playgroud)

因此,关于变量范围的手册说静态$ a = 0; 很好,而关于表达式的手册说$ a = 5,将是一个表达式.这基本上是一回事,只是0而不是5 ......

所以我现在有点困惑.

现在究竟什么是表达式,我究竟能够或不能分配给静态变量?:)

dec*_*eze 7

不能初始化一个static使用可变的非恒定表达.初始化后,您可以为其指定任何内容.

不同之处在于static变量在解析阶段初始化,即PHP读取源代码以确定是什么.在那个阶段没有执行任何代码,PHP只是读取你想要它做的事情.因此,它不会执行代码来初始化变量.

static $foo = 'bar';
Run Code Online (Sandbox Code Playgroud)

'bar'是一个常量值,PHP可以在分析时轻松分配给变量.

static $foo = Bar::baz();
Run Code Online (Sandbox Code Playgroud)

Bar::baz()是一个需要运行的表达式,PHP需要定位类,必要时加载它,运行baz()方法,这可能会做各种不同的东西......相同的5 + 3,md5('bar')或任何需要实际计算的东西.PHP根本不会在分析时完成所有这些动态的东西.因此,你不能初始化一个static与任何东西,但变量不变的值.

运行时,您可以将任何您喜欢的内容分配给static变量.一个经常使用的模式是这样的:

static $foo = null;
if ($foo === null) {
    $foo = new SomeObject;
}
Run Code Online (Sandbox Code Playgroud)

这使实例SomeObjectstatic的变量,但你不能用它初始化变量.