php 静态函数中$this的问题

class A{
        public $age = 50;
        private $money = 2000;
        static public $head = 1;
        public function tell(){
                echo $this->age,'<br />';
                echo self::$head,'<br />';
        }
        static public function sayMoney(){
                echo $this->money,'<br />';
        }
}
class B extends A{
        public $age = 22;
        private $money = 10;
        public function subtell(){
                parent::tell();
                echo $this->age,'<br />';
        }
        public function subMoney()
        {
                parent::sayMoney();
                echo $this->money,'<br />';

        }
}

$b = new B();
$b->subtell();//22 1 22;

echo '<hr />';
$b->subMoney();

最后一句话报错Using $this when not in object context
但在调用subMoney()时不就绑定了$this,$this指向b对象,之后执行parent::sayMoney();由于静态调用,所以不绑定$this.在sayMoney()执行的时候不应该得到2000吗,为什么会报错,和前面$b->subtell();调用有啥不一样

阅读 8.1k
5 个回答

首先需要明确,静态变量和静态方法都是属于类的,可以通过类名直接调用类的静态方法类名::静态方法名(参数),而且静态方法只能访问静态变量,访问的时候通过self::静态变量名,而且类的静态变量只能被初始化为文字或常量,不能使用表达式(比如public static $a = time();是错误的),即不能初始化为另一个变量或函数返回值.

总之,$this表示的是对象(类的实例).
而类静态的东西需要通过::调用,比如:
类名::静态方法名(参数)
self::静态方法名
self::静态变量
在子类调用父类的静态变量和方法则需要parent::xxx

<?php
class foo {
    public static $a = 'abc';
    public static function bar() {
        return self::$a;
    }
    public static function barx() {
        return self::$a.'_'.self::bar();
    }
}
class foo2 extends foo {
    public static function bar2() {
        return parent::barx();
        //return parent::$a;
    }
}
echo foo2::$a; //abc
echo foo2::bar2(); //输出abc_abc

静态方法内不能使用 this, 静态属性和方法被创建时,可能还没有任何这个类的实例可以被调用, 你可以 classA::staticMethod() 或者 $a = new classA(); $a->staticMethod() , 但其内部就是不能使用this

看错了

楼上说的对,第二个调用的 function 用了 static,就不能用 $this了

下面是原答案

private 表明是私有的,只允许类内部访问,哪怕是继承的类也不行。

如果允许被继承访问,不想被外部访问,可以改成:protected。

另外,创建的是那个类的实例,$this就代表哪个类。

只要明白一点,这个问题就搞清楚了:

$this:代表的是对象,是此类实例化之后的对象。

而static 的 function 是属于类的。

所以,你用类来调用原本属于对象的属性,那么不论此类的其他对象是否存在,都是不可能的。

  • 调用类内部对象属性方法用$this

  • 调用类内部静态属性方法用self

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题