关于对象访问静态方法、属性等问题

为何有这样的问题呢?源自一段代码,如下:

 1 class A
 2 {
 3     // public static $name = 'wangyumeidsb';
 4 
 5     public $name = 'woaini';
 6 
 7     public static function foo()
 8     {
 9         echo __CLASS__;
10     }
11 
12     public function test()
13     {
14         self::foo();
15         echo '---'; 
16         $this->foo();
17         echo '<hr>';
18         // echo 'this is A<br>'."\n";
19     }
20 
21     public function say()
22     {
23         echo '我是非静态方法';
24     }
25 }
26 
27 class B extends A
28 {
29     public  function who()
30     {
31         A::test();
32         A::foo();
33         // echo A::$name;
34         echo $this->name;    //
35         parent::test();
36         self::test();
37         $this->test();   //self并不是必须调用static,非静态也能调用?
38     }
39 }
40 
41 // A::say();
42 $b = new B;
43 $b->who();
44 // echo 'this is non-static property'.$b->name.'<br>';
45 // echo A::$name;
46 echo '>>>>>>>>>>>>>>>>';
47 $a = new A;
48 $a->test();
49 $a->foo();
50 A::foo();
51 
52 // A::test();    //在类的外部:静态访问方式不能访问非静态方法。。。但是菲静态访问方式可以访问静态方法。。。
View Code

列出几个问题:

  1. 为何可以使用A::test();这种方式访问非静态方法test()?
  2. self::test();虽然说B要继承A的test方法,但是test不是静态方法,不归类所有,为何这种方式也可以访问?self不是必须访问静态成员吗,也可以访问非静态?那self指向的是什么?

手册说明   : 静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。就像其它所有的 PHP 静态变量一样,静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象。

在手册中看到了一个以前不知道的访问方式--------可以使用$foo::$name;来调用静态属性。$foo是对象啊!

class Foo
{
    public static $name = 'so ga';
    public function _foo()
    {
        echo self::$name;
    }
}  

$foo = new Foo;
print $foo::$name;
$foo::_foo();  //调用可以输出值,,但是会报一个E_STRICT 级别的错误,,不会终止程序执行。。
$foo->_foo();
View Code

我把A::  称为静态访问方式,把$a->  称为非静态访问方式。下面都这样理解。

总结:在类的外部,静态访问方式可以访问静态方法,不能访问非静态方法(能够执行,但是用静态方式调用一个非静态方法会导致一个 E_STRICT 级别的错误。);非静态访问方式既可以访问静态方法,又可以访问非静态方法。

           静态访问方式可以访问静态属性,不可以访问非静态属性;非静态访问方式可以访问非静态属性,不能访问静态属性。

    在类的内部,静态访问方式既可以访问静态方法又可以访问非静态方法;非静态访问方式既可以访问静态方法,又可以访问非静态方法。

         静态访问方式只能访问静态属性,不可以访问非静态属性;非静态访问方式可以访问非静态属性,不能访问静态属性。

猜你喜欢

转载自www.cnblogs.com/bneglect/p/10962309.html