静态变量和常量能够长时间的保存在内存中,准确的来说其生存周期是该文件从执行到结束整个过程,而其作用域也是用于在其所在的整个文件之中。这在我们编写程序时,用于跨过多个代码块、及多个作用域的时候会相当有用。
在面向对象编程中,当我们在类中编写了一个静态函数后,我们能够不实例化对象而直接去调用这个静态函数。
这里我很好奇,因为PHP是解释性语言,按照对解释性语言的定义,PHP应该是解释器一边解释一边执行,那么对于在编译过程中就将静态方法与类对应的绑定的过程,在PHP又是怎么样的情况呢? —— 留着之后随着自己不断的学习,慢慢的了解吧。
关于静态方法/属性以及常量属性,我们需要了解的就是其在整个程序运行过程中的生命周期,在程序中的存储方式,以便于我们在工作中能正确的使用这些变量。此外文章最后还对PHP中类中的成员变量的调用方式做了一个简单的总结。
静态变量
常量
值可否改变
是
否(定义即被赋值,不可被改变,程序运行的过程中不能被改变值)
生命周期
整个程序执行的期间
整个程序执行的期间
作用域
遵循一般的变量作用域,但是程序执行过后并不释放,因此在下次访问所在作用域时,还能访问这个变量
全局可访问
测试代码
// 静态变量作用域测试代码
function count_a(){
static $a = 0; // 只在函数的局部作用域中生效,但是每次调用之后,$a 的值还是被保存着的。虽然不能在作用域之外被调用,但是程序执行过后还是没有没销毁
// 这个值会一直到程序的运行结束
//静态声明是在编译时解析的。
echo 'This is a variable from function: '.$a++.'';
}
for($i = 0; $i < 10; $i++){
count_a();
}
// echo "The value outside function {$a}"; // 此处显示未定义这个变量
// 常量测试代码
echo MAX_NUM; // 常量未定义前不能使用
define('MAX_NUM', 1000);
echo MAX_NUM;
const MIN_NUM = 200;
echo MIN_NUM;
// 以上两种方式都能对常量进行定义
// 但是在类中的使用会有所差异
define('MIN_VALUE', '0.0'); // RIGHT - Works OUTSIDE of a class definition.
define('MAX_VALUE', '1.0'); // RIGHT - Works OUTSIDE of a class definition.
//const MIN_VALUE = 0.0; RIGHT - Works both INSIDE and OUTSIDE of a class definition.
//const MAX_VALUE = 1.0; RIGHT - Works both INSIDE and OUTSIDE of a class definition.
class Constants
{
//define('MIN_VALUE', '0.0'); WRONG - Works OUTSIDE of a class definition.
//define('MAX_VALUE', '1.0'); WRONG - Works OUTSIDE of a class definition.
const MIN_VALUE = 0.0; // RIGHT - Works INSIDE of a class definition.
const MAX_VALUE = 1.0; // RIGHT - Works INSIDE of a class definition.
public static function getMinValue()
{
return self::MIN_VALUE;
}
public static function getMaxValue()
{
return self::MAX_VALUE;
}
}
// 以上的php官网给出的一段测试代码
?>
PHP各类变量的调用方式(对象):
一般类成员变量: $obj->property
静态成员: $obj::$staticVariable // 要加 $ 符号!
使用可变变量形式进行调用一般成员变量: $obj->$variable
类中常量: $obj::CONSTANT //常量则不用加上$符号
注意这里的 1 和 3 容易混淆,3使用的是PHP可变变量的特性,具体可看博客中的 可变变量