几天前我开始学习面向对象,我对过程编码还算可以,但显然这还不够,我想成为一个有很多经验和知识的精通编码器,所以首先要完全学习必须是 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++;
}
所以,关于变量作用域的手册说 static $a = 0;很好,而关于表达式的手册说 $a = 5,将是一个表达式。这基本上是一回事,只是 0 而不是 5...
所以我现在有点困惑。
现在表达式到底是什么?我究竟可以或不可以将什么赋值给静态变量? :)
最佳答案
您不能使用非常量 表达式初始化 static
变量。初始化后,您可以分配任何您喜欢的东西。
不同之处在于,static
变量在解析阶段被初始化,即当 PHP 通读源代码以弄清楚什么是什么时。在那个阶段没有代码被执行,PHP 只是读取你想要它做的事情。因此,它不会执行初始化变量的代码。
static $foo = 'bar';
'bar'
是一个常量值,PHP 可以在解析时轻松地将其分配给变量。
static $foo = Bar::baz();
Bar::baz()
是一个需要run 的表达式,PHP 需要定位类,必要时加载它,运行baz( )
方法,它可以做各种不同的事情...对于 5 + 3
、md5('bar')
或任何需要实际计算。 PHP 根本不会在解析时做所有这些动态的事情。因此,您不能初始化 static
变量,常量 值除外。
在运行时,您可以将任何您喜欢的内容分配给static
变量。一个经常使用的模式是这样的:
static $foo = null;
if ($foo === null) {
$foo = new SomeObject;
}
这会将 SomeObject
的实例保留在 static
变量中,但您不能用它初始化变量。
关于php - 用PHP学习OO编码,static != 表达式,但是PHP手册上说凡是有值的都是表达式,一头雾水,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9029511/