>백엔드 개발 >PHP 튜토리얼 >PHP 지연 바인딩 및 지연되지 않은 바인딩 구문 분석

PHP 지연 바인딩 및 지연되지 않은 바인딩 구문 분석

小云云
小云云원래의
2018-03-01 13:42:171313검색

php 버전: php5.6

지연 바인딩에는 get_class($this), get_called_class(), new static(), static::
비지연 바인딩에는 get_class(), __CLASS__, new self()가 포함됩니다. self::

새로운 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已执行

정적을 self

<?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已执行 此处输出的结果发生了变化

로 바꾸세요.결론:

    如果在子类中调用父类中含有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) - 정적 변수의 속성 및 방법 및 지연 바인딩_php 예제

위 내용은 PHP 지연 바인딩 및 지연되지 않은 바인딩 구문 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.