PHP类中self和$this的区别

码代码已经两年有余了,很少写博客,也很少记录问题,起码后者是个非常不好的习惯,因此现在除了石墨文档之外,开始在博客上记录。

开始之前先从静态变量说起,由于在实际生产中,我们极少对一个自己编写的类进行多次多次实例化,这就导致静态变量和私有变量和公共变量基本没有任何区别,甚至还有很大的不方便之处,貌似除了静态方法中调用之外没有任何的其他用处。

今天在使用静态方法的时候,使用了$this去调用对象的属性,导致曝出以下错误信息,在网上查询了手册和百度,Google,发现大部分回答只是说明了在静态方法中不允许使用$this,只能使用self,较为靠谱的回答说明是$this是实例化对象的指针,self是对象的指针。

针对以上信息,综合自己的学习知识和网上搜索结果作下图:

其中,我们可以明显看到,self调用的类的指针,而非实例化后的对象指针,静态变量和静态方法始终属于类,而非属于实例化后的对象,因此在静态方法中无法使用$this,因为此时所处的位置是类所在的指针,只能使用self调用静态方法或者静态变量。

如果要在静态方法中,强制使用函数的其他方法,则只能先实例化一个新的对象,然后再使用该对象的方法。

综上所述,self调用的是类,而$this调用的则是实例化的对象。下面是代码。

<?php
class demo {
    public $a;
    public $b;
    public static $c = 100;

    public function __construct($a) {
        $this->a = $a;
        $this->funct();
    }

    public static function func() {
    	$newObj = new self(20);
    	$newObj->funct();
        self::$c += 100;
        echo self::$c;
    }

    private function funct() {
        $this->b = $this->a * 200;
    }

    public function getC() {
            echo  self::$c;
    }
}

$demo = new demo(3);
$demo::func();
$demo::getC();
$demo2 = new demo(4);
$demo2::func();
$demo::getC();
$demo2::getC();
$demo->getC();

有小伙伴注意到,为什么例子中静态方法中新生成的对象可以调用private 的方法吗?

猜你喜欢

转载自blog.csdn.net/u010793255/article/details/81201464
今日推荐