PHP の遅延バインディングと非遅延バインディングの解析

小云云
リリース: 2023-03-20 15:40:01
オリジナル
1153 人が閲覧しました

php バージョン: php5.6

遅延バインディングには get_class($this)、get_called_class()、new static()、static:: が含まれます。
非遅延バインディングには get_class()、__CLASS__、new self() が含まれます。 self::

new static() を使用する場合

 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 "

NewStatic的测试结果

";$newStatic = new NewStatic();echo "第一次执行初始化的结果:
";$newStatic -> init(); // 输出结果: 该类已初始化echo "
第二次执行初始化的结果:
";$newStatic -> init(); //输出结果: 该类NewStatic已执行echo "

NewStatic的子类Sub的测试结果

";$sub = new Sub();echo "第一次执行初始化的结果:
";$sub -> init(); // 输出结果: 该类已初始化echo "
第二次执行初始化的结果:
";$sub -> init();  //输出结果: 该类Sub已执行
ログイン後にコピー

static を self

 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 "

NewStatic的测试结果

";$newStatic = new NewStatic();echo "第一次执行初始化的结果:
";$newStatic -> init(); // 输出结果: 该类已初始化echo "
第二次执行初始化的结果:
";$newStatic -> init(); //输出结果: 该类NewStatic已执行echo "

NewStatic的子类Sub的测试结果

";$sub = new Sub();echo "第一次执行初始化的结果:
";$sub -> init(); // 输出结果: 该类已初始化echo "
第二次执行初始化的结果:
";$sub -> init();  //输出结果: 该类NewStatic已执行 此处输出的结果发生了变化
ログイン後にコピー

に置き換えてください。 結論:

    如果在子类中调用父类中含有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();
ログイン後にコピー

関連する推奨事項:

php での静的遅延バインディングと通常の静的効率の比較の詳細な説明

PHPにおける親クラスとサブクラスの遅延バインディング/遅延バインディング

PHPオブジェクト指向プログラミング(oop)学習メモ(2) - 静的変数のプロパティとメソッドと遅延binding_phpの例

以上がPHP の遅延バインディングと非遅延バインディングの解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!