静态属性和静态方法(static)
- 静态属性或方法是和类相关的,而不是和类的某个特定的实例相关,因此这类属性或方法也称为“类属性”或“类方法”;
- 静态属性和方法,在类被调用(类被创建或者类中的任何静态成员被调用)时创建。
- 静态属性,在内存中只有一份,为所有的实例共用
- 静态方法不能调用非静态属性,也不能使用$this获取非静态属性的值
调用语法以及注意事项
- 如果访问控制权限允许,可不必创建该类对象而直接使用类名加两个冒号
“::”
调用静态属性和静态方法; - 调用语法:
类名[或self]::静态属性名
(静态方法名),而且在类内部强烈建议用 self:: 来调用。 - 当一个类中有非静态方法被
self::
调用时,系统会自动将这个方法转换为静态方法。 - 静态方法不能调用非静态属性,也不能使用
$this
获取非静态属性的值。
<?php
//静态属性和静态方法 外部调用
class Person
{
public $name = 'tom';
public static $age = 22;//静态属性
public static function intro()
{
echo 'i am static func<br>';
}
}
/*
$cc = new Person();
echo $cc->name;//tom
*/
//类名::静态 属性/方法
echo Person::$age . '<br>';//22
Person::intro();//i am static func
<?php
//静态属性 内部调用
class Person
{
public $name = 'tom';
public static $age = 22;//静态属性
public function intro()
{
//echo 'My age is '.Person::$age.'<br>';
echo 'My age is '.self::$age.'<br>';//强烈建议使用这种方式(防止类名一改,内容全要改)
}
//静态属性设置和获取(setAge和getAge)
public function setAge($age=44){
//Person::$age=$age;
self::$age=$age;
}
public function getAge(){
//echo 'My age is '.Person::$age.'<br>';
echo 'My age is '.self::$age.'<br>';
}
}
$cc = new Person();
$cc->intro();//My age is 22
$cc->setAge(55);
$cc->getAge();//My age is 55
<?php
//静态方法 内部调用
class Person
{
public $name = 'tom';
public static $age = 99;
public static function intro()
{
// echo 'My name is ' . $this->name . '<br>';//静态方法中不能使用 $this
echo 'My age is ' . self::$age . '<br>';//My age is 99
self::enjoy();//interesting
/*
self::enjoy1();//hello world
//尽管可以打印,但是会报错而且公共方法含有引用 $this 则无法打印且报错
//所以静态方法里,只使用静态方法和静态属性
*/
}
public static function enjoy()
{
echo 'interesting';
}
public function enjoy1()
{
echo 'hello world!';
echo 'name is ' . $this->name . '<br>';
}
}
Person::intro();
- 任何一个静态变量都可看做全局变量
<?php
function enjoy()
{
$num = 0;
echo '$num = ' . $num++ . '<br>';
}
enjoy();//$num = 0
enjoy();//$num = 0
enjoy();//$num = 0
enjoy();//$num = 0
//任何一个静态变量都可看做全局变量
function enjoy0()
{
static $num = 0;
echo '$num = ' . $num++ . '<br>';
}
enjoy0();//$num = 0
enjoy0();//$num = 1
enjoy0();//$num = 2
enjoy0();//$num = 3