Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-verzögerte Bindung und nicht-verzögerte Bindungsanalyse

PHP-verzögerte Bindung und nicht-verzögerte Bindungsanalyse

小云云
小云云Original
2018-03-01 13:42:171290Durchsuche

PHP-Version: php5.6

Verzögerte Bindung umfasst: get_class($this), get_claimed_class(), new static(), static::
Nicht-verzögerte Bindung umfasst: get_class (), __CLASS__, new self(), self::

Bei Verwendung von new static()

<?phpclass NewStatic{
    //该类的实例
    private $newStatic;    //判断$newStatic是否为空,为空则实例化自身并存入$newStatic
    public function init()
    {
        if (empty($this -> newStatic)) {            $this -> newStatic = new static();            echo "该类已初始化";
        }        else {            $this -> newStatic -> exec();
        }
    }    //该类的执行方法
    public function exec()
    {
        echo "该类NewStatic已执行";
    }
}class Sub extends NewStatic{
    //覆盖父类中的exec方法,用于区分
    public function exec()
    {
        echo "该类Sub已执行";
    }
}echo "<h3>NewStatic的测试结果</h3>";$newStatic = new NewStatic();echo "第一次执行初始化的结果:<br>";$newStatic -> init(); // 输出结果: 该类已初始化echo "<br>第二次执行初始化的结果:<br>";$newStatic -> init(); //输出结果: 该类NewStatic已执行echo "<h3>NewStatic的子类Sub的测试结果</h3>";$sub = new Sub();echo "第一次执行初始化的结果:<br>";$sub -> init(); // 输出结果: 该类已初始化echo "<br>第二次执行初始化的结果:<br>";$sub -> init();  //输出结果: 该类Sub已执行

statisch durch self ersetzen

<?phpclass NewStatic{
    //该类的实例
    private $newStatic;    //判断$newStatic是否为空,为空则实例化自身并存入$newStatic
    public function init()
    {
        if (empty($this -> newStatic)) {            $this -> newStatic = new self();  //修改此处的static为self
            echo "该类已初始化";
        }        else {            $this -> newStatic -> exec();
        }
    }    //该类的执行方法
    public function exec()
    {
        echo "该类NewStatic已执行";
    }
}class Sub extends NewStatic{
    //覆盖父类中的exec方法,用于区分
    public function exec()
    {
        echo "该类Sub已执行";
    }
}echo "<h3>NewStatic的测试结果</h3>";$newStatic = new NewStatic();echo "第一次执行初始化的结果:<br>";$newStatic -> init(); // 输出结果: 该类已初始化echo "<br>第二次执行初始化的结果:<br>";$newStatic -> init(); //输出结果: 该类NewStatic已执行echo "<h3>NewStatic的子类Sub的测试结果</h3>";$sub = new Sub();echo "第一次执行初始化的结果:<br>";$sub -> init(); // 输出结果: 该类已初始化echo "<br>第二次执行初始化的结果:<br>";$sub -> init();  //输出结果: 该类NewStatic已执行 此处输出的结果发生了变化

Fazit:

    如果在子类中调用父类中含有new static()的方法时,它实例化子类,但是如果是父类中使用的是new self()的话,那么实例化的就是父类了,new self()永远指向定义的那个类,而new static()
会绑定调用时的那个类(延迟绑定)这就是new static()和new self()的区别。这个区别实际上跟static::和self::的区别是一样的,使用static::调用静态方法时调用的是延迟绑定后的类的静态方法,而self::指向定义的静态类的方法

另外要补充的一点new self()等同于如下写法:$class = get_class(); //注意:这里的get_class()里边没有传递参数$obj = new $class();
或者$class = __CLASS__;$obj = new $class();new static()等同于如下写法:$class = get_called_class();$obj = new $class();
或者$class = get_class($this); // 这里get_class()有没有传递参数效果是不一样的,跟这个函数本身的特性有关$obj = new $class();

Verwandte Empfehlungen:

Detaillierte Erläuterung des Vergleichs zwischen statischer verzögerter Bindung und gewöhnlicher statischer Effizienz in PHP

PHP Späte Bindung /Verzögerte Bindung von Eltern- und Unterklassen

PHP-Studiennotizen zur objektorientierten Programmierung (oop) (2) – Attribute und Methoden statischer Variablen und verzögerte Bindung_ PHP-Beispiel

Das obige ist der detaillierte Inhalt vonPHP-verzögerte Bindung und nicht-verzögerte Bindungsanalyse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn