关于static,PHP官网这么说的:
声明类成员或方法为static,就可以不实例化类而直接访问。不能通过一个对象来访问其中的静态成员(静态方法除外)。
由于静态方法不需要通过对象即可调用,所以伪变量$this在静态方法中不可用。
后面还有一条关于::
的:
用::方式调用一个非静态方法会导致一个E_STRICT级别的错误。
于是我测试了一下:
test1:
<!-- lang: php -->
class foo1 {
private function fun1(){
echo "1234";
}
public function fun2(){
self::fun1();
}
}
foo1::fun2();
//可以输出,产生Strict standards;
于是对test1做了一个修改:
<!-- lang: php -->
class foo1 {
private function fun1(){
echo "1234";
}
public function fun2(){
self::fun1();
}
}
$obj = new foo1();
$obj->fun2();
//输出结果,没有错误
test2:
<!-- lang: php -->
class foo2 {
static function fun1(){
echo "1234";
}
public function fun2(){
slef::fun1();
}
}
foo2::fun1();
//输出结果,这个可以和后面的用变量代替fun1做对比;
test3:
<!-- lang: php -->
class foo3 {
static function fun1(){
echo "1234";
}
public function fun2(){
$this->fun1();
}
}
foo::fun2();
//Error,这个测试有点多余$this指向的是实例化后的对象,对象没有实例化,显然会。
test4:
<!-- lang: php -->
class foo4 {
static function fun1(){
echo "1234";
}
public function fun2(){
$this->fun1();
}
}
$obj = new foo3();
$obj->fun2();
//输出结果,没有报错;
看来文档说的总是没有实例来的清楚。
如果把fun1()
换成一个变量又会是什么情况呢~~~,闲的无聊我又测了一下:
<!-- lang: php -->
class foo {
static $a = "abcd";
public function fun2(){
echo self::$a;
}
}
foo::fun2();
//即使这样,也会有一个Strict standards;
应该这样写:
<!-- lang: php -->
class foo {
public static $a = "abcd";
static function fun2(){
echo self::$a;
}
}
foo::fun2();
//PHP Manual里的写法;
或者这样:
<!-- lang: php -->
class foo {
static $a = "abcd";
public function fun2(){
echo self::$a;
}
}
$obj = new foo();
$obj->fun2();
//正常;
或者:
<!-- lang: php -->
class foo {
private $a = "abcd";
public function fun2(){
echo $this->a;
}
}
$obj = new foo();
$obj->fun2();
//正常
关于Strict standards
:
字面意思,没有按照PHP严格规定的模式编写而给的警告。
总结起来就是:
-
slef不仅仅是可以用来指向静态成员,也可以用来指向其他成员,但是实例化前调用在严格模式下会给出警告,实例化之后不会。
-
调用未实例化的对象,静态方法可以被普通的成员方法访问,但在严格模式下,静态变量只能通过静态方法来访问,否则会给出警告(实例化之后就不会警告了);
-
$this也可以指向静态成员,当然,只能在对象实例化之后才可用;
PS:PHP version 5.4.3
。