php - 用PHP学习OO编码,static != 表达式,但是PHP手册上说凡是有值的都是表达式,一头雾水

标签 php variables static

几天前我开始学习面向对象,我对过程编码还算可以,但显然这还不够,我想成为一个有很多经验和知识的精通编码器,所以首先要完全学习必须是 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 + 3md5('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/

相关文章:

static - 如何链接目标文件 (*.o) 和静态库文件 (*.a)

c# - 静态变量在负载平衡环境中不起作用。

php - Codeigniter - join() 只返回一个 "first table"

php - Symfony 尾部斜杠重定向丢弃 HTTPS

C# 变量命名

C#/asp.net 全局变量?

java - 在 Java 中什么是更快地传递参数或使用静态变量?

php - 使用 CakePHP,您如何在用户登录时隐藏页面的某些元素?

php - Cake 3.0如何保存belongsToMany数据?

c - 在循环中创建的变量在 C 中的迭代期间更改值