Php面向对象?静态成员
静态属性
使用static关键字声明的属性
该静态属性,在逻辑上,是定义在类上面的属性。保证一个类,对应一个属性。
例子:
class Student
{
public $stu_id;
public $stu_name;
public static $stu_count = 0;
public function __constuct($id,$name)
{
$this->stu_id = $id;
$this->stu_name = $name;
}
}
访问静态属性:
通过类来访问:在利用静态访问符号(::)
类::成员
例子:
class Student
{
public $stu_id;
public $stu_name;
public static $stu_count = 0;
public function __constuct($id,$name)
{
$this->stu_id = $id;
$this->stu_name = $name;
Student::$stu_count ++;
}
}
::的访问称之为静态访问,->为非静态访问(对象访问)
在访问静态属性时,如果是在类内访问:则可以使用self当前类
例子:
class Student
{
public $stu_id;
public $stu_name;
public static $stu_count = 0;
public function __constuct($id,$name)
{
$this->stu_id = $id;
$this->stu_name = $name;
self::$stu_count ++;
}
}
注意:$this 和 self 的区别
$this 表示的是这个对象,self表示这个类
静态方法
静态方法的逻辑意义,也是定义再类上的方法。同样,调用形式类::
例子:
class Student
{
public $stu_id;
public $stu_name;
public static $stu_count = 0;
public function __constuct($id,$name)
{
$this->stu_id = $id;
$this->stu_name = $name;
self::$stu_count ++;
}
public static function sayCount()
{
echo “run static ”;
}
}
Student::sayCount();
静态方法和非静态方法,的主要区别,在于是否可以接收一个对象的执行环境。
就是是否可以为方法内的$this是否可以被赋值
只有在对象调用方法时,才能将对象执行环境传递到方法内,$this才可以被赋值。
静态方法中无法使用非静态属性。
一个静态方法,只能处理静态数据(静态属性)
例子:
class Student
{
public $stu_id;
public $stu_name;
public static $stu_count = 0;
public function __constuct($id,$name)
{
$this->stu_id = $id;
$this->stu_name = $name;
self::$stu_count ++;
}
public static function sayCount()
{
echo self::$stu_count;
}
}
Student::sayCount();
Php中特殊的方法访问问题:
强调:静态方法应该类来调用,非静态方法应该对象来调用
class C
{
public function f1()
{
echo‘f1
’;
}
public static function f2()
{
echo‘f2
’;
}
}
$o = new C;
$o->f1();
C::f2();
但是:
1. 无论静态还是非静态方法,都可使用类访问:不过如果类静态调用一个非静态方法,会报告一个语法不标准的错误。
2. 区别就在于$this上
只有再使用对象调用非静态方法时,才可以使用方法内的$this.
class C
{
public function f1()
{
echo‘f1
’;
}
public static function f2()
{
echo‘f2
’;
}
}
C::f1();
C::f2();
总结:类的静态方法和非静态方法,类都只保存一份,只是运行时的运行环境不同。只有再使用对象调用非静态方法时,才可以使用方法内的$this.